prima-twig 0.33.1 → 0.34.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/twig-deploy +103 -1
  3. data/bin/twig-feature +87 -3
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f0da5f18061bca4ecd373fa36ab4b83abb4e2ad1
4
- data.tar.gz: c8d1bbebbc0bc0a45aa877b8b0513667af957e8d
3
+ metadata.gz: 6d9623382b41e59106394cbfad2c07f73b34e602
4
+ data.tar.gz: 92bb1128cf013ab6fa3d54b6cdd82a0afe75ac36
5
5
  SHA512:
6
- metadata.gz: ddd84422cb0fed15ceeae080911462cc49bd2bb5a630823742f29cd31951f4b5525c6dc5c020a9b1db6499765faa1181a0f653ba0d0128648dad4412f7a1f5c7
7
- data.tar.gz: 51999dd59cd1d68480c7085a969876bbc4c1c2f5677fa585e1a6818cf3ba2d18628160c08c5a7a50a5c3d1750bad844bd120c919ba88457806cf1e83aea0c71b
6
+ metadata.gz: 390652111ca159ff475cae27718cfd7300efd1f77d8f8aa6aac2808f49f851ded84d664ab06002ec190b54b8949685dc8b1e82004c816e66250279ae5ae2c18d
7
+ data.tar.gz: 35a2dac0eb4c804db7970e7aa8829dd75d60fd2f6b26fb253cc6d8ff74490b0453d090f137be9375a684c375bcb310f168b300ca07af10f318ab9fb5b5f9b4b9
data/bin/twig-deploy CHANGED
@@ -12,6 +12,7 @@ require 'erb'
12
12
  require 'base64'
13
13
  require 'rubyflare'
14
14
  require 'pp'
15
+ require 'pry'
15
16
 
16
17
  def help_content
17
18
  <<-HELP
@@ -64,7 +65,8 @@ class Review
64
65
  when "parameters"
65
66
  reload_parameters!
66
67
  else
67
- stop_if true, [:wrong_args, ['parameters']]
68
+ deploy_current! args[0]
69
+ # stop_if true, [:wrong_args, ['parameters']]
68
70
  end
69
71
  else
70
72
  deploy_revision!
@@ -144,6 +146,70 @@ class Review
144
146
  exec_step "terminal-notifier -message 'Deploy terminato'" if which 'terminal-notifier'
145
147
  end
146
148
 
149
+ def deploy_current!(project_name)
150
+ binding.pry
151
+ stop_if @prima.head_detached?, :detached_head
152
+ stop_if @prima.repo_has_modified_files?, "Non posso deployare con file non commitati"
153
+
154
+ output "Recupero degli artifacts in corso, attendi qualche secondo...".yellow
155
+ artifacts = get_artifacts(project_name)[0..49]
156
+
157
+ artifact_rev = choose do |menu|
158
+ menu.prompt = 'Scegli la release da deployare: '.cyan
159
+ menu.shell = true
160
+
161
+ artifacts.each do |v|
162
+ title = @prima.reduce_size(v[:branch], 100)
163
+ commit_msg = @prima.reduce_size(v[:commit_msg], 250)
164
+ msg = "#{title} #{v[:created_at].strftime('%d/%m/%Y %H:%M:%S')} #{v[:rev]} #{commit_msg}".light_blue
165
+ menu.choice(msg) {v[:rev]}
166
+ end
167
+ end
168
+
169
+ user = `git config user.name`.delete "\n"
170
+ artifact = artifacts.select {|v| v[:rev] == artifact_rev}.first
171
+
172
+ do_deploy! artifact_rev, project_name, false
173
+
174
+ mail = Mail.new do
175
+ from 'deploy@prima.it'
176
+ to 'deploy@prima.it'
177
+ subject "#{user} ha effettuato il deploy della revision #{artifact[:rev]}"
178
+ end
179
+
180
+ commit_msg = clean_commit_message(artifact[:commit_msg])
181
+
182
+ body = "## Deploy in produzione effettuato con successo\n\n"
183
+ body << "Data: #{Time.now.strftime('%d/%m/%Y %H:%M:%S')}\n\n"
184
+ body << "Utente: #{user}\n\n"
185
+ body << "Revision: [#{artifact[:rev]}](https://github.com/primait/#{project_name}/commit/#{artifact[:rev]}) del #{artifact[:created_at].strftime('%d/%m/%Y %H:%M:%S')}\n\n"
186
+ body << "Branch: [#{artifact[:branch]}](https://github.com/primait/#{project_name}/tree/#{artifact[:branch]})\n\n"
187
+ body << "Commit: #{commit_msg.gsub(/_/, '\_')}\n\n"
188
+
189
+ htmlBody = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render body
190
+
191
+ html_part = Mail::Part.new do
192
+ content_type 'text/html; charset=UTF-8'
193
+ body htmlBody
194
+ end
195
+ text_part = Mail::Part.new do
196
+ body htmlBody.gsub(/<br\s?\/?>/, "\r\n").gsub(/<\/?[^>]*>/, '')
197
+ end
198
+
199
+ mail.html_part = html_part
200
+ mail.text_part = text_part
201
+
202
+ opts = {address: 'email-smtp.eu-west-1.amazonaws.com', port: '587'}
203
+ opts[:user_name] = @prima.config['aws_username']
204
+ opts[:password] = @prima.config['aws_password']
205
+
206
+ mail.delivery_method(:smtp, opts)
207
+ mail.deliver
208
+
209
+ exec_step "git checkout master"
210
+ exec_step "terminal-notifier -message 'Deploy terminato'" if which 'terminal-notifier'
211
+ end
212
+
147
213
  def reload_parameters!
148
214
  artifact_rev = ''
149
215
  resp = @cf.describe_stacks({
@@ -184,6 +250,27 @@ class Review
184
250
  wait_for_stack_ready(stack_name_cron) unless stack_ready?(stack_name_cron)
185
251
  end
186
252
 
253
+ def do_deploy!(artifact_rev, project_name, reload_parameters=false)
254
+ binding.pry
255
+ deploy_command = "deploy/set_artifact_version #{artifact_rev}"
256
+
257
+ output "Il comando per il deploy sara': #{deploy_command}".yellow
258
+ confirm_message = "Sei sicuro di voler effettuare il deploy in produzione?"
259
+
260
+ exit unless @prima.yesno confirm_message.blue
261
+
262
+ # exec_step "git fetch"
263
+ # exec_step "git checkout #{artifact_rev}"
264
+ exec_step deploy_command
265
+
266
+ # stack_name_web = 'ecs-task-web-production'
267
+ # stack_name_consumer = 'ecs-task-consumer-production'
268
+ # stack_name_cron = 'ecs-task-consumer-production'
269
+ # wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
270
+ # wait_for_stack_ready(stack_name_consumer) unless stack_ready?(stack_name_consumer)
271
+ # wait_for_stack_ready(stack_name_cron) unless stack_ready?(stack_name_cron)
272
+ end
273
+
187
274
  def get_artifacts
188
275
  artifacts = []
189
276
  resp = @s3.list_objects(bucket: @s3_bucket, prefix: 'prima')
@@ -199,6 +286,21 @@ class Review
199
286
  artifacts.sort_by { |v| v[:created_at] }.reverse
200
287
  end
201
288
 
289
+ def get_artifacts(project_name)
290
+ artifacts = []
291
+ resp = @s3.list_objects(bucket: @s3_bucket, prefix: "microservices/#{project_name}")
292
+ resp.contents.each do |s3_object|
293
+ rev = s3_object.key.match("#{project_name}\\/\\d+\\.\\d+\\.\\d+.tar.gz$").to_s
294
+ if rev
295
+ object = @s3.head_object(bucket: @s3_bucket, key: s3_object.key)
296
+ commit_msg = ''
297
+ commit_msg = Base64.decode64(object.metadata['commit_msg']).strip if object.metadata.has_key? 'commit_msg'
298
+ artifacts << {rev: rev, created_at: object.last_modified, branch: object.metadata['branch'], commit_msg: commit_msg } if object.metadata.has_key? 'branch'
299
+ end
300
+ end
301
+ artifacts.sort_by { |v| v[:created_at] }.reverse
302
+ end
303
+
202
304
  def launch_paparatzinger(job_name)
203
305
  @s3.get_object(
204
306
  response_target: '/tmp/paparatzinger_twig.yml',
data/bin/twig-feature CHANGED
@@ -42,6 +42,7 @@ class Release
42
42
  'rogoreport' => {},
43
43
  'assange' => {},
44
44
  'borat' => {},
45
+ 'bolla' => {},
45
46
  'crash' => {}
46
47
  }
47
48
  @stack_name_alb = 'ecs-alb-http-public-qa'
@@ -408,6 +409,7 @@ class Release
408
409
  @projects["rogoreport"][:name] +
409
410
  @projects["assange"][:name] +
410
411
  @projects["borat"][:name] +
412
+ @projects["bolla"][:name] +
411
413
  @projects['crash'][:name]
412
414
  )
413
415
  else
@@ -422,7 +424,8 @@ class Release
422
424
  @projects["peano"][:name] +
423
425
  @projects["rogoreport"][:name] +
424
426
  @projects["assange"][:name] +
425
- @projects["borat"][:name]
427
+ @projects["borat"][:name] +
428
+ @projects["bolla"][:name]
426
429
  )
427
430
  end
428
431
  @dns_record_identifier = deploy_id
@@ -475,6 +478,10 @@ class Release
475
478
  {
476
479
  key: "borat",
477
480
  value: @projects["borat"][:name]
481
+ },
482
+ {
483
+ key: "bolla",
484
+ value: @projects["bolla"][:name]
478
485
  }
479
486
  ]
480
487
  tags << { key: 'crash', value: @projects['crash'][:name] } if deploy_crash?
@@ -514,7 +521,7 @@ class Release
514
521
  ]
515
522
  create_stack(stack_name_db, stack_body, parameters, tags) unless stack_exists?(stack_name_db)
516
523
 
517
- create_prima_artifact(@projects["prima"][:revision], @projects["prima"][:name], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "prima/#{@projects["prima"][:revision]}-#{deploy_id}.tar.gz")
524
+ create_prima_artifact(@projects["prima"][:revision], @projects["prima"][:name], deploy_id) # unless artifact_exists?('prima-artifacts-encrypted', "prima/#{@projects["prima"][:revision]}-#{deploy_id}.tar.gz")
518
525
  create_crash_artifact(@projects['crash'][:revision], deploy_id) unless !deploy_crash? || artifact_exists?('prima-artifacts-encrypted', "microservices/crash/#{@projects['crash'][:revision]}-#{deploy_id}-qa.tar.gz")
519
526
  create_urania_artifact(@projects["urania"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/urania/#{@projects["urania"][:revision]}-qa.tar.gz")
520
527
  create_ermes_artifact(@projects["ermes"][:revision], deploy_id) unless artifact_exists?('prima-artifacts', "microservices/ermes/#{@projects["ermes"][:revision]}-#{deploy_id}-qa.tar.gz")
@@ -526,6 +533,7 @@ class Release
526
533
  create_rogoreport_artifact(@projects["rogoreport"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/rogoreport/rogoreport_qa-#{@projects["rogoreport"][:revision]}-#{deploy_id}-qa.tar.gz")
527
534
  create_assange_artifact(@projects["assange"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/assange/#{@projects["assange"][:revision]}-#{deploy_id}-qa.tar.gz")
528
535
  create_borat_artifact(@projects["borat"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/borat/#{@projects["borat"][:revision]}-#{deploy_id}-qa.tar.gz")
536
+ create_bolla_artifact(@projects["bolla"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/bolla/#{@projects["bolla"][:revision]}-#{deploy_id}-qa-migrator.tar.gz")
529
537
 
530
538
  wait_for_stack_ready(stack_name_db) unless stack_ready?(stack_name_db)
531
539
  import_dbs(ec2_ip_address(asg_stack_name)) unless stack_exists?("ecs-task-web-qa-#{deploy_id}")
@@ -1042,6 +1050,49 @@ class Release
1042
1050
  wait_for_stack_ready(stack_name_bburago) unless stack_ready?(stack_name_bburago)
1043
1051
  wait_for_stack_ready(stack_name_hal9000) unless stack_ready?(stack_name_hal9000)
1044
1052
  wait_for_stack_ready(stack_name_assange) unless stack_ready?(stack_name_assange)
1053
+ wait_for_stack_ready(stack_name_fidaty) unless stack_ready?(stack_name_fidaty)
1054
+
1055
+ stack_name_bolla = "ecs-task-bolla-qa-#{deploy_id}"
1056
+ git_checkout_version('bolla', @projects["bolla"][:revision])
1057
+ stack_body = YAML.load_file('projects/bolla/deploy/task.yml')
1058
+ stack_body['Resources']['ECSServiceBolla']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
1059
+ stack_body = stack_body.to_yaml
1060
+ parameters = [
1061
+ {
1062
+ parameter_key: "Environment",
1063
+ parameter_value: "qa"
1064
+ },
1065
+ {
1066
+ parameter_key: "ReleaseVersion",
1067
+ parameter_value: "#{@projects["bolla"][:revision]}-#{deploy_id}"
1068
+ },
1069
+ {
1070
+ parameter_key: "TaskDesiredCount",
1071
+ parameter_value: "1"
1072
+ },
1073
+ {
1074
+ parameter_key: "ECSClusterName",
1075
+ parameter_value: @ecs_cluster_name
1076
+ },
1077
+ {
1078
+ parameter_key: "ALBShortName",
1079
+ parameter_value: "bolla-qa-#{deploy_id}"[0..31]
1080
+ },
1081
+ {
1082
+ parameter_key: "HostnamePattern",
1083
+ parameter_value: "bolla-#{@dns_record_identifier}.qa.colaster.com"
1084
+ },
1085
+ {
1086
+ parameter_key: "HostnamePatternPriority",
1087
+ parameter_value: hostname_pattern_priority
1088
+ },
1089
+ ]
1090
+ if stack_exists?(stack_name_bolla)
1091
+ cur_version = get_currently_deployed_version(stack_name_bolla)
1092
+ update_stack(stack_name_bolla, stack_body, parameters, tags) unless cur_version.include?(@projects["bolla"][:revision])
1093
+ else
1094
+ create_stack(stack_name_bolla, stack_body, parameters, tags)
1095
+ end
1045
1096
 
1046
1097
  stack_name_web = "ecs-task-web-qa-#{deploy_id}"
1047
1098
  git_checkout_version('prima', @projects["prima"][:revision])
@@ -1123,6 +1174,7 @@ class Release
1123
1174
  wait_for_stack_ready(stack_name_peano) unless stack_ready?(stack_name_peano)
1124
1175
  wait_for_stack_ready(stack_name_rogoreport) unless stack_ready?(stack_name_rogoreport)
1125
1176
  wait_for_stack_ready(stack_name_borat) unless stack_ready?(stack_name_borat)
1177
+ wait_for_stack_ready(stack_name_bolla) unless stack_ready?(stack_name_bolla)
1126
1178
  wait_for_stack_ready(stack_name_crash) unless stack_ready?(stack_name_crash) || !deploy_crash?
1127
1179
 
1128
1180
  update_service_defaults(stack_name_web)
@@ -1137,6 +1189,7 @@ class Release
1137
1189
  update_service_defaults(stack_name_rogoreport)
1138
1190
  update_service_defaults(stack_name_assange)
1139
1191
  update_service_defaults(stack_name_borat)
1192
+ update_service_defaults(stack_name_bolla)
1140
1193
  update_service_defaults(stack_name_crash) unless stack_ready?(stack_name_crash) || !deploy_crash?
1141
1194
 
1142
1195
  prima_hostname = get_route53_hostname(stack_name_web)
@@ -1149,9 +1202,9 @@ class Release
1149
1202
  backoffice_hostname = get_route53_hostname(stack_name_backoffice)
1150
1203
  assange_hostname = get_route53_hostname(stack_name_assange)
1151
1204
  borat_hostname = get_route53_hostname(stack_name_borat)
1205
+ bolla_hostname = get_route53_hostname(stack_name_bolla)
1152
1206
  deploy_crash? && crash_hostname = get_route53_hostname(stack_name_crash)
1153
1207
 
1154
-
1155
1208
  launch_marley ec2_ip_address(asg_stack_name), prima_hostname, borat_hostname
1156
1209
 
1157
1210
  projects_text = "
@@ -1164,6 +1217,7 @@ class Release
1164
1217
  > Hal9000 url: http://#{hal9000_hostname}:10031
1165
1218
  > Fidaty url: http://#{fidaty_hostname}:10021
1166
1219
  > Peano url: http://#{peano_hostname}:10039
1220
+ > Bolla url: http://#{ec2_ip_address(asg_stack_name)}:10046
1167
1221
  > Assange url: https://#{assange_hostname}
1168
1222
  > Backoffice (legacy) url: https://#{backoffice_hostname}"
1169
1223
  projects_text.concat "
@@ -1202,6 +1256,8 @@ class Release
1202
1256
  host = "crash-#{@dns_record_identifier}.qa.colaster.com"
1203
1257
  when stack_name.include?('ermes')
1204
1258
  host = "ermes-#{@dns_record_identifier}.qa.colaster.com"
1259
+ when stack_name.include?('bolla')
1260
+ host = "bolla-#{@dns_record_identifier}.qa.colaster.com"
1205
1261
  end
1206
1262
  host
1207
1263
  end
@@ -1285,6 +1341,8 @@ class Release
1285
1341
  logical_resource_id = 'ECSServiceBorat'
1286
1342
  when stack_name.include?('crash')
1287
1343
  logical_resource_id = 'ECSServiceCrash'
1344
+ when stack_name.include?('bolla')
1345
+ logical_resource_id = 'ECSServiceBolla'
1288
1346
  else
1289
1347
  raise "Service name non gestito per lo stack #{stack_name}"
1290
1348
  end
@@ -1604,6 +1662,32 @@ class Release
1604
1662
  Dir.chdir '../../'
1605
1663
  end
1606
1664
 
1665
+ def create_bolla_artifact(revision, deploy_id)
1666
+ output "Preparo l'artifact bolla .zip\n".yellow
1667
+
1668
+ git_checkout_version('bolla', revision)
1669
+
1670
+ Dir.chdir 'projects/bolla'
1671
+
1672
+ decrypt_secrets()
1673
+
1674
+ [
1675
+ "docker-compose build web",
1676
+ "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh assange_web \
1677
+ '-c' 'mix local.hex --force && mix hex.info && \
1678
+ mix deps.get && mix compile && mix deps.compile && \
1679
+ rm -rf _build/qa/rel/ && \
1680
+ mix release --env=qa'"
1681
+ ].each do |cmd|
1682
+ execute_command cmd
1683
+ end
1684
+
1685
+ artifact_path = Dir.glob("_build/qa/rel/migrator/releases/*/migrator.tar.gz").first
1686
+ upload_artifact(artifact_path, "microservices/bolla/#{revision}-#{deploy_id}-qa-migrator.tar.gz", "#{@s3_bucket}-encrypted")
1687
+
1688
+ Dir.chdir '../../'
1689
+ end
1690
+
1607
1691
  def create_borat_artifact(revision, deploy_id)
1608
1692
  output "Preparo l'artifact borat .zip\n".yellow
1609
1693
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prima-twig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.33.1
4
+ version: 0.34.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matteo Giachino
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2018-04-06 00:00:00.000000000 Z
16
+ date: 2018-04-12 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: aws-sdk