prima-twig 0.33.1 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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