prima-twig 0.54.235 → 0.55.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: feb847e297b0e58e332361290ff95b3cb2832f1bf82c5b3620d27f7565b9d560
4
- data.tar.gz: 82008df9b77221e704c1b59df53523e7f7a8ef089eeb562a27be088b43fb44f7
3
+ metadata.gz: 250f32133d43076e476ac7c927122fcafc6bd697c6cd35ceb878dac84588ba43
4
+ data.tar.gz: ea8a5aa33842d8a256e351c649c8ad3a056bc088568d07cfa955aabf29cbcf93
5
5
  SHA512:
6
- metadata.gz: 99e359005b80d2614bf8c31f0f5c18951e694c6adaeefce90520dbe4b32cc8cd2a96f054917f4a9aaa39f982da794d151f1f2d9acbad5de88b1f57bdc4b14d54
7
- data.tar.gz: 9dc95aa16b0e27ff47145f925bdf3e79f8129c4ccc691f837fb49c8484d5131d03280fbe9ece71dc9f8159db3ee2e63608666d48d33e1dba2121bc41faac0c4f
6
+ metadata.gz: feaf2df5582620b7499708b6d8f09c74f92e5943b8aa92e9cd5c661257d2984606a8e0dc55e4b4d8a4c01fa11f43f6292579163ff649f56e085dbde1cf00a7a2
7
+ data.tar.gz: 5ef83a72778cc6aea4d9f48e3c70be50df00082d84abee36c2817eb348e6b5b958b07017519ddcab9651dd9b3a86cf0f4cda10769a4a30a2d859aef67f081649
@@ -5,10 +5,7 @@ require_relative '../lib/prima_twig.rb'
5
5
  require_relative '../lib/prima_aws_client.rb'
6
6
  require 'colorize'
7
7
  require 'highline/import'
8
- require 'aws-sdk-batch'
9
- require 'aws-sdk-cloudformation'
10
- require 'aws-sdk-ecs'
11
- require 'aws-sdk-s3'
8
+ require 'aws-sdk'
12
9
  require 'redcarpet'
13
10
  require 'mail'
14
11
  require 'erb'
@@ -58,7 +55,6 @@ class Review
58
55
  @cf = Aws::CloudFormation::Client.new
59
56
  @ecs = Aws::ECS::Client.new
60
57
  @s3 = Aws::S3::Client.new
61
- @batch = Aws::Batch::Client.new
62
58
  @s3_bucket = "prima-artifacts-encrypted"
63
59
  end
64
60
 
@@ -98,6 +94,15 @@ class Review
98
94
  artifact = artifacts.select {|v| v[:rev] == artifact_rev}.first
99
95
 
100
96
  do_deploy! artifact_rev
97
+ # exec_step "terminal-notifier -message 'Deploy terminato, vuoi lanciare paparatzinger?'" if which 'terminal-notifier'
98
+ #
99
+ # confirm_message = "Vuoi lanciare paparatzinger?"
100
+ # launch_paparatzinger = @prima.yesno confirm_message.blue
101
+ #
102
+ # if launch_paparatzinger
103
+ # output "Avvio paparatzinger per gli screenshot".yellow
104
+ # job_name = launch_paparatzinger(artifact[:commit_msg])
105
+ # end
101
106
 
102
107
  mail = Mail.new do
103
108
  from 'deploy@prima.it'
@@ -113,6 +118,7 @@ class Review
113
118
  body << "Revision: [#{artifact[:rev]}](https://github.com/primait/prima/commit/#{artifact[:rev]}) del #{artifact[:created_at].strftime('%d/%m/%Y %H:%M:%S')}\n\n"
114
119
  body << "Branch: [#{artifact[:branch]}](https://github.com/primait/prima/tree/#{artifact[:branch]})\n\n"
115
120
  body << "Commit: #{commit_msg.gsub(/_/, '\_')}\n\n"
121
+ #body << "Screenshots (tra qualche minuto): [BrowserStack](https://www.browserstack.com/automate) (Filtrare per: \"#{get_paparatzinger_job_name(commit_msg).gsub(/_/, '\_')}\")" if launch_paparatzinger
116
122
 
117
123
  htmlBody = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render body
118
124
 
@@ -138,8 +144,6 @@ class Review
138
144
 
139
145
  invalidate_prismic_cache
140
146
 
141
- launch_crawler
142
-
143
147
  exec_step "terminal-notifier -message 'Deploy terminato'" if which 'terminal-notifier'
144
148
  end
145
149
 
@@ -213,16 +217,63 @@ class Review
213
217
  artifacts.sort_by { |v| v[:created_at] }.reverse
214
218
  end
215
219
 
216
- def launch_crawler()
217
- resp = describe_stack_resource('batch-job-crawler-production', 'JobDefinition')
220
+ def launch_paparatzinger(job_name)
221
+ @s3.get_object(
222
+ response_target: '/tmp/paparatzinger_twig.yml',
223
+ bucket: 'prima-deploy',
224
+ key: 'paparatzinger_twig.yml')
225
+
226
+ paparatzinger_config = YAML.load_file '/tmp/paparatzinger_twig.yml'
227
+
228
+ uri = URI.parse(paparatzinger_config['prima_api_search_url'])
229
+ body = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
230
+ req = Net::HTTP::Get.new(uri)
231
+ req["x-apikey"] = paparatzinger_config['prima_api_token']
232
+ response = http.request req
233
+ response.body
234
+ end
235
+
236
+ saves = JSON.parse body
218
237
 
219
- @batch.submit_job({
220
- job_name: "crawler", # required
221
- job_queue: "tools-production", # required
222
- job_definition: resp.stack_resource_detail.physical_resource_id # required
238
+ save_code = saves.sample['unique_identifier']
239
+ url_garanzie = "https://www.prima.it/preventivo/auto/#{save_code}/garanzie?browserstack=true"
240
+ job_name = get_paparatzinger_job_name(clean_commit_message(job_name))
241
+
242
+ logical_resource_id = 'TaskDefinitionPaparatzinger'
243
+ resp = @cf.describe_stack_resource({
244
+ stack_name: 'ecs-task-paparatzinger-production',
245
+ logical_resource_id: logical_resource_id
246
+ })
247
+
248
+ resp = @ecs.run_task({
249
+ cluster: 'ecs-cluster-tools-vpc-production-ECSCluster-1WJQLW5EVLYEB',
250
+ task_definition: resp.stack_resource_detail.physical_resource_id,
251
+ overrides: {
252
+ container_overrides: [
253
+ {
254
+ name: 'paparatzinger',
255
+ environment: [
256
+ {
257
+ name: 'JOB_NAME',
258
+ value: job_name,
259
+ },
260
+ {
261
+ name: 'VERSION',
262
+ value: paparatzinger_config['version'],
263
+ },
264
+ {
265
+ name: 'URL_GARANZIE',
266
+ value: url_garanzie
267
+ }
268
+ ]
269
+ }
270
+ ]
271
+ },
272
+ count: 1
223
273
  })
274
+ output "Paparatzinger lanciato con successo. URL: #{url_garanzie}\n".green
224
275
 
225
- output "Crawler lanciato con successo!\n".green
276
+ job_name
226
277
  end
227
278
 
228
279
  end
@@ -234,6 +285,10 @@ def clean_commit_message(commit_msg)
234
285
  commit_msg[0..99]
235
286
  end
236
287
 
288
+ def get_paparatzinger_job_name(job_name)
289
+ job_name.gsub /[^0-9a-z]/i, '-'
290
+ end
291
+
237
292
  def which(cmd)
238
293
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
239
294
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
@@ -22,9 +22,23 @@ class Release
22
22
  exec "twig feature #{ARGV.join ' '}"
23
23
  end
24
24
  end
25
+ @cf = Aws::CloudFormation::Client.new
26
+ @alb = Aws::ElasticLoadBalancingV2::Client.new
27
+ @ec2 = Aws::EC2::Client.new
28
+ @ecs = Aws::ECS::Client.new
29
+ @batch = Aws::Batch::Client.new
30
+ @asg = Aws::AutoScaling::Client.new
31
+ @s3 = Aws::S3::Client.new
32
+ @s3_bucket = 'prima-artifacts'
33
+ @artifact_path = '/tmp/prima-artifact.zip'
34
+ @import_db_task = 'arn:aws:ecs:eu-west-1:001575623345:task-definition/ecs-task-db-restore2-TaskDefinitionDbRestore-1BXH13XEVLPP0:1'
35
+ @cf_role = 'arn:aws:iam::001575623345:role/qainit-service-role-cloudformat-CloudformationRole-18KBZQIS148R9'
25
36
  @dns_record_identifier = nil
26
37
  @ecs_cluster_name = nil
27
38
  @deploy_update = false
39
+ @qainit = false
40
+ @qainit_host_folder = "/var/ci/#{ENV['DRONE_REPO']}/#{ENV['DRONE_BRANCH']}/#{ENV['DRONE_BUILD_NUMBER']}"
41
+ @qainit_folder = "/drone/src/github.com/project/primait/qainit"
28
42
  @projects = {
29
43
  'prima' => {},
30
44
  'urania' => {},
@@ -33,7 +47,7 @@ class Release
33
47
  'hal9000' => {},
34
48
  'fidaty' => {},
35
49
  'peano' => {},
36
- # 'rogoreport' => {},
50
+ 'rogoreport' => {},
37
51
  'assange' => {},
38
52
  'borat' => {},
39
53
  'crash' => {},
@@ -44,14 +58,11 @@ class Release
44
58
  'leftorium' => {},
45
59
  'pyxis-npm' => {},
46
60
  'starsky' => {},
47
- 'hutch' => {},
48
- 'maia' => {},
49
- 'legion' => {}
61
+ 'hutch' => {}
50
62
  }
51
63
  @base_stack_name_alb = 'ecs-alb-http-public-qa-'
52
64
  @base_stack_name_alb_ws = 'ecs-alb-ws-public-qa-'
53
65
  @git_branch = ''
54
- @cloudflare = Rubyflare.connect_with(ENV['CLOUDFLARE_EMAIL'], ENV['CLOUDFLARE_APIKEY'])
55
66
  end
56
67
 
57
68
  def execute!(args)
@@ -66,6 +77,10 @@ class Release
66
77
  qainit_deploy_shutdown!
67
78
  elsif 'update' == args[1]
68
79
  qainit_deploy_update!
80
+ elsif 'read' == args[1]
81
+ qainit_read_config! args[2]
82
+ elsif 'minimal' == args[1]
83
+ qainit_minimal_deploy! args[2]
69
84
  else
70
85
  if args[1]
71
86
  select_branches(args[1..-1])
@@ -79,11 +94,26 @@ class Release
79
94
  if 'deploy' == args[1]
80
95
  suite_py_branches(args[2])
81
96
  qainit_deploy!(true)
97
+ else
98
+ qainit_deploy_shutdown!(args[2])
82
99
  end
83
100
  when 'deploy'
84
101
  abort('Non sei nella cartella di artemide') unless Dir.pwd.match 'artemide$'
85
- if 'lock' == args[1]
102
+ if ['terminate', 'stop', 'shutdown', 'halt', 'destroy'].include? args[1]
103
+ deploy_shutdown!
104
+ elsif 'update' == args[1]
105
+ deploy_update!
106
+ elsif 'lock' == args[1]
86
107
  deploy_lock!
108
+ elsif 'minimal' == args[1]
109
+ qainit_drone_minimal_deploy!
110
+ else
111
+ if args[1]
112
+ select_branches(args[1])
113
+ else
114
+ select_branches
115
+ end
116
+ deploy_feature!
87
117
  end
88
118
  when 'aggregator'
89
119
  if 'enable' == args[1]
@@ -119,6 +149,7 @@ class Release
119
149
  output 'Disable aggregator'
120
150
 
121
151
  output "Recupero le informazioni relative al puntamento dei record DNS..."
152
+ cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
122
153
  output "Recupero le informazioni sui QA attivi..."
123
154
  stack_list, envs = get_stacks()
124
155
 
@@ -130,7 +161,7 @@ class Release
130
161
  end.is_a?(Aws::CloudFormation::Types::Tag)
131
162
  aggregator_enabled
132
163
  end[0]
133
- dns_records = @cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', content: get_alb_host(@base_stack_name_alb + env_hash[3..8])})
164
+ dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', content: get_alb_host(@base_stack_name_alb + env_hash[3..8])})
134
165
  stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori non stanno puntando ad un QA".red
135
166
  change_hostname_priority(env_hash, hostname_pattern_priority())
136
167
  dns_to_staging(env_hash)
@@ -146,7 +177,8 @@ class Release
146
177
  output 'Enable aggregator'
147
178
 
148
179
  output 'Recupero le informazioni relative al puntamento dei record DNS...'
149
- dns_records = @cloudflare.get('zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records', { per_page: 100, type: 'CNAME', content: 'staging.prima.it' })
180
+ cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
181
+ dns_records = cloudflare.get('zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records', { per_page: 100, type: 'CNAME', content: 'staging.prima.it' })
150
182
  stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori stanno gia' puntando ad un QA".red
151
183
 
152
184
  output "Recupero le informazioni sui QA attivi..."
@@ -176,7 +208,7 @@ class Release
176
208
  dns_records.body[:result].each do |dns|
177
209
  if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
178
210
  output "Changing #{dns[:name]} DNS record"
179
- @cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: get_alb_host(@base_stack_name_alb + env_hash[3..8]), proxied: true, ttl: 1})
211
+ cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: get_alb_host(@base_stack_name_alb + env_hash[3..8]), proxied: true, ttl: 1})
180
212
  end
181
213
  end
182
214
 
@@ -235,11 +267,12 @@ class Release
235
267
 
236
268
  def dns_to_staging(env_hash)
237
269
  output "Recupero le informazioni relative al puntamento dei record DNS..."
238
- dns_records = @cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', content: get_alb_host(@base_stack_name_alb + env_hash[3..8])})
270
+ cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
271
+ dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', content: get_alb_host(@base_stack_name_alb + env_hash[3..8])})
239
272
  dns_records.body[:result].each do |dns|
240
273
  if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
241
274
  output "Changing #{dns[:name]} DNS record"
242
- @cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1})
275
+ cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1})
243
276
  end
244
277
  end
245
278
  end
@@ -406,20 +439,26 @@ class Release
406
439
  end
407
440
 
408
441
  def get_default_branch_name(projects)
409
- projects.each_key do |project|
410
- return projects[project]['name'] if not projects[project]['default_branch']
442
+ if !projects['prima'][:default_branch]
443
+ return projects['prima'][:name]
444
+ elsif ![nil, 'master'].include? projects['crash'][:name]
445
+ return projects['crash'][:name]
446
+ else
447
+ projects.each_key do |project_key|
448
+ return projects[project_key][:name] if projects[project_key][:name] != 'master'
449
+ end
411
450
  end
412
451
  end
413
452
 
414
453
  def suite_py_branches(args_json)
415
- arg_projects = JSON.parse(args_json)
454
+ args = JSON.parse(args_json)
416
455
 
417
- @projects.merge!(arg_projects)
456
+ args['projects'].each_key do |project|
457
+ @projects[project] = { name: args['projects'][project]['branch'], revision: args['projects'][project]['revision'], committer: '', default_branch: false }
458
+ end
418
459
 
419
460
  @projects.each_key do |project|
420
- if @projects[project].empty?
421
- @projects[project] = choose_branch_to_deploy(project, true)
422
- end
461
+ @projects[project] = choose_branch_to_deploy(project, true) unless args['projects'].key? project
423
462
  end
424
463
  end
425
464
 
@@ -449,19 +488,53 @@ class Release
449
488
  `git checkout -b #{branch_name}`
450
489
  end
451
490
 
491
+ branches = ''
452
492
  @git_branch = branch_name
453
493
 
454
- File.open('branch_names', 'w') { |file| file.write(JSON.generate(@projects)) }
494
+ @projects.each_key do |project_key|
495
+ if @projects[project_key][:revision]
496
+ branches += "#{project_key}:#{@projects[project_key][:name]}:#{@projects[project_key][:revision]}:#{@projects[project_key][:default_branch]}\n"
497
+ end
498
+ end
455
499
 
456
- update_drone_yml!
500
+ File.open('branch_names', 'w') { |file| file.write(branches) }
457
501
 
458
502
  `git add projects && \
459
- git add branch_names .drone.yml && \
503
+ git add branch_names && \
460
504
  git commit -m '#{branch_name}' && \
461
505
  git push -f --set-upstream origin #{branch_name} && \
462
506
  git checkout master`
463
507
  end
464
508
 
509
+ def qainit_minimal_deploy!(project)
510
+ abort('L\'unico progetto permesso è prima') unless ['prima'].include? project
511
+ project_definition = choose_branch_to_deploy(project)
512
+
513
+ `git checkout master && git pull && git remote prune origin`
514
+
515
+ default_name = project_definition[:name]
516
+ output "Inserisci la feature a cui si riferisce il QA: [#{default_name}]".cyan
517
+ feature_number = String(STDIN.gets.chomp)
518
+ feature_number = default_name if feature_number.empty?
519
+
520
+ if `git branch -l | grep #{feature_number}`.size > 0
521
+ `git checkout #{feature_number} && git pull`
522
+ else
523
+ `git checkout -b #{feature_number}`
524
+ end
525
+
526
+ # così recupero le informazioni sul branch, poi vado a scrivere il file branch_names con una sola riga
527
+ branch = "#{project}:#{project_definition[:name]}:#{project_definition[:revision]}:#{project_definition[:default_branch]}"
528
+
529
+ File.open('branch_names', 'w') { |file| file.write(branch) }
530
+
531
+ `git add projects && \
532
+ git add branch_names && \
533
+ git commit -m 'minimal_#{feature_number}' && \
534
+ git push --set-upstream origin #{feature_number} && \
535
+ git checkout master`
536
+ end
537
+
465
538
  def qainit_deploy_update!
466
539
  `git checkout master && git pull`
467
540
  # cancelliamo tutti i branch che non sono più sul repo remoto
@@ -486,24 +559,29 @@ class Release
486
559
  # aggiornare il commit (revision a cui fa riferimento)
487
560
 
488
561
  # leggo il file branch_names / recupero i nomi dei branch / riscrivo tutto
489
- projects = ''
490
562
  File.open('branch_names', 'r') do |file|
491
563
  file.each_line do |line|
492
- projects = JSON.parse(line)
564
+ project = line.split(':')
565
+ @projects[project[0]] = select_branch_to_deploy(project[0], project[1])
566
+ @projects[project[0]][:default_branch] = project[3]
493
567
  end
494
568
  end
495
569
 
496
- projects.each do |key, project|
497
- @projects[key] = select_branch_to_deploy(key, project['name'])
498
- @projects[key]['default_branch'] = project['default_branch']
499
- end
570
+ branches = ''
500
571
 
501
- File.open('branch_names', 'w') { |file| file.write(JSON.generate(@projects)) }
572
+ @projects.each_key do |project_key|
573
+ if @projects[project_key][:revision]
574
+ branches += "#{project_key}:#{@projects[project_key][:name]}:#{@projects[project_key][:revision]}:#{@projects[project_key][:default_branch]}"
575
+ end
576
+ end
502
577
 
503
- update_drone_yml!
578
+ File.open('branch_names', 'w') { |file| file.write(branches) }
504
579
 
505
- `git add branch_names .drone.yml`
506
- `git commit -m 'update'`
580
+ if `git log -1` =~ /minimal_/
581
+ `git commit -am 'minimal_update'`
582
+ else
583
+ `git commit -am 'update'`
584
+ end
507
585
  `git push && git checkout master`
508
586
  end
509
587
 
@@ -578,9 +656,11 @@ class Release
578
656
  delete_stack(@base_stack_name_alb + env_hash[3..8]) if stack_exists?(@base_stack_name_alb + env_hash[3..8])
579
657
  delete_stack(@base_stack_name_alb_ws + env_hash[3..8]) if stack_exists?(@base_stack_name_alb_ws + env_hash[3..8])
580
658
  `git checkout master && git push origin --delete ${DRONE_BRANCH}`
581
- output "Cancello il record DNS utilizzato da Lighthouse"
582
- delete_lighthouse_dns()
583
659
  output "Finito!".green
660
+
661
+ if @qainit
662
+ qainit_write_output("QA #{ENV["DRONE_BRANCH"]} spento.", 'Indirizzi scritti su ')
663
+ end
584
664
  end
585
665
 
586
666
  def qainit_write_output(file_message, output_message)
@@ -590,16 +670,43 @@ class Release
590
670
  output "#{output_message} #{qa_file_name}".green
591
671
  end
592
672
 
593
- def update_drone_yml!()
594
- drone_yml = File.read('.drone.yml')
595
- @projects.each do |key, project|
596
- drone_yml = drone_yml.gsub(/#{key}@.+\n/, "#{key}@#{project['revision']}\n")
673
+ def qainit_read_config!(action)
674
+ File.open('branch_names', 'r') do |file|
675
+ file.each_line do |line|
676
+ project = line.gsub("\n", '').split(':')
677
+ if project[3] == 'true'
678
+ @projects[project[0]] = {:name=> project[1], :revision=> project[2], :default_branch=> true}
679
+ elsif project[3] == 'false'
680
+ @projects[project[0]] = {:name=> project[1], :revision=> project[2], :default_branch=> false}
681
+ end
682
+ end
597
683
  end
598
- File.open(".drone.yml", "w") do |f|
599
- f.write(drone_yml)
684
+ get_s3_config_files
685
+ @qainit = true
686
+ case action
687
+ when 'shutdown'
688
+ output 'Shutting down'.green
689
+ qainit_drone_shutdown!
690
+ when 'minimal'
691
+ output 'Starting minimal deploy'.green
692
+ qainit_drone_minimal_deploy!
693
+ else
694
+ output 'Starting standard deploy'.green
695
+ deploy_feature!
600
696
  end
601
697
  end
602
698
 
699
+ def get_s3_config_files
700
+ # manteniamo la struttura per lanciarlo facilmente anche da locale
701
+ `mkdir -p cloudformation/stacks/task cloudformation/stacks/route53 cloudformation/stacks/asg cloudformation/stacks/elb`
702
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/task/db.yml', response_target: 'cloudformation/stacks/task/db.yml'})
703
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/route53/qa.yml', response_target: 'cloudformation/stacks/route53/qa.yml'})
704
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/route53/minimal_qa.yml', response_target: 'cloudformation/stacks/route53/minimal_qa.yml'})
705
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/asg/ecs-asg-allinone.yml', response_target: 'cloudformation/stacks/asg/ecs-asg-allinone.yml'})
706
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/ecs-cluster.yml', response_target: 'cloudformation/stacks/ecs-cluster.yml'})
707
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/elb/alb-public-qa.yml', response_target: 'cloudformation/stacks/elb/alb-public-qa.yml'})
708
+ end
709
+
603
710
  def get_deploy_id
604
711
  if @deploy_id
605
712
  @deploy_id
@@ -609,6 +716,1349 @@ class Release
609
716
  end
610
717
  end
611
718
 
719
+ def qainit_drone_minimal_deploy!
720
+ # tenere solo il project da deployare (l'unico project è prima)
721
+ @ami_id = get_ami_id("ecs-fleet-allinone-staging")
722
+ project = ''
723
+ @projects.each_key do |project_key|
724
+ if @projects[project_key][:revision]
725
+ project = project_key
726
+ git_checkout_version(project_key, @projects[project_key][:revision])
727
+ end
728
+ end
729
+ deploy_id = get_deploy_id
730
+
731
+ @git_branch = ENV['DRONE_BRANCH']
732
+ @dns_record_identifier = deploy_id
733
+ hostname_pattern_priority = hostname_pattern_priority()
734
+ tags = [
735
+ {
736
+ key: "qainit",
737
+ value: @git_branch
738
+ },
739
+ {
740
+ key: project,
741
+ value: @projects[project][:name]
742
+ },
743
+ {
744
+ key: "hostname_pattern_priority",
745
+ value: hostname_pattern_priority
746
+ }
747
+ ]
748
+
749
+ cluster_stack_name = "ecs-cluster-qa-#{deploy_id}"
750
+
751
+ if stack_exists?(cluster_stack_name)
752
+ tags = get_stack_tags(cluster_stack_name)
753
+ hostname_pattern_priority = tags.detect do |tag|
754
+ tag.key == 'hostname_pattern_priority'
755
+ end.value
756
+ end
757
+
758
+ stack_name_alb = @base_stack_name_alb + deploy_id[0..5]
759
+ stack_name_alb_ws = @base_stack_name_alb_ws + deploy_id[0..5]
760
+
761
+ create_cluster_stack(cluster_stack_name, tags) unless stack_exists?(cluster_stack_name)
762
+ wait_for_stack_ready(cluster_stack_name) unless stack_ready?(cluster_stack_name)
763
+
764
+ create_alb_stack(stack_name_alb, "http", deploy_id, 'qa-minimal') unless stack_exists?(stack_name_alb)
765
+ create_alb_stack(stack_name_alb_ws, "websocket", deploy_id, 'qa-minimal') unless stack_exists?(stack_name_alb_ws)
766
+
767
+ resp = @cf.describe_stack_resource({stack_name: cluster_stack_name, logical_resource_id: 'ECSCluster'})
768
+ @ecs_cluster_name = resp.stack_resource_detail.physical_resource_id
769
+
770
+ asg_stack_name = "ecs-asg-allinone-qa-#{deploy_id}"
771
+ create_asg_stack(asg_stack_name, tags) unless stack_exists?(asg_stack_name)
772
+
773
+ deploy_id = get_deploy_id
774
+ create_pyxis_artifact(@projects["pyxis-npm"][:revision], deploy_id)
775
+ create_prima_artifact(@projects["prima"][:revision], @projects["prima"][:name], deploy_id, true) unless artifact_exists?('prima-artifacts-encrypted', "prima/#{@projects["prima"][:revision]}.tar.gz")
776
+
777
+ wait_for_stack_ready(stack_name_alb) unless stack_ready?(stack_name_alb)
778
+ wait_for_stack_ready(stack_name_alb_ws) unless stack_ready?(stack_name_alb_ws)
779
+
780
+ stack_name_route53 = "ecs-route53-qa-#{deploy_id}"
781
+ stack_body = IO.read('cloudformation/stacks/route53/minimal_qa.yml')
782
+ parameters = [
783
+ {
784
+ parameter_key: "DnsRecordIdentifier",
785
+ parameter_value: @dns_record_identifier
786
+ },
787
+ {
788
+ parameter_key: "PrimaElbHostname",
789
+ parameter_value: get_alb_host(stack_name_alb)
790
+ },
791
+ {
792
+ parameter_key: 'CrashElbHostname',
793
+ parameter_value: get_alb_host(stack_name_alb_ws)
794
+ }
795
+ ]
796
+
797
+ create_stack(stack_name_route53, stack_body, parameters, tags, @cf_role) unless stack_exists?(stack_name_route53)
798
+ wait_for_stack_ready(stack_name_route53) unless stack_ready?(stack_name_route53)
799
+
800
+ stack_name_web = "ecs-task-web-qa-#{deploy_id}"
801
+ git_checkout_version('prima', @projects["prima"][:revision])
802
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/web.yml')
803
+ parameters = [
804
+ {
805
+ parameter_key: "Environment",
806
+ parameter_value: "qa-minimal"
807
+ },
808
+ {
809
+ parameter_key: "ReleaseVersion",
810
+ parameter_value: "#{@projects["prima"][:revision]}"
811
+ },
812
+ {
813
+ parameter_key: "TaskDesiredCount",
814
+ parameter_value: "1"
815
+ },
816
+ {
817
+ parameter_key: "ECSClusterName",
818
+ parameter_value: @ecs_cluster_name
819
+ },
820
+ {
821
+ parameter_key: "ALBShortName",
822
+ parameter_value: "web-qa-#{deploy_id}"[0..27]
823
+ },
824
+ {
825
+ parameter_key: "WebQaBaseHostname",
826
+ parameter_value: "#{@dns_record_identifier}.qa.colaster.com"
827
+ },
828
+ {
829
+ parameter_key: "HostnamePattern",
830
+ parameter_value: "ww*-#{@dns_record_identifier}.qa.colaster.com"
831
+ },
832
+ {
833
+ parameter_key: "HostnamePatternPriority",
834
+ parameter_value: hostname_pattern_priority
835
+ },
836
+ {
837
+ parameter_key: "HostnamePatternAggregatorPriority",
838
+ parameter_value: (hostname_pattern_priority.to_i + 1).to_s
839
+ },
840
+ {
841
+ parameter_key: "EnvHash",
842
+ parameter_value: deploy_id
843
+ },
844
+ {
845
+ parameter_key: "AssangeHostname",
846
+ parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
847
+ },
848
+ {
849
+ parameter_key: "BackofficeHostname",
850
+ parameter_value: "backoffice-#{@dns_record_identifier}.qa.colaster.com"
851
+ },
852
+ {
853
+ parameter_key: "WebHostname",
854
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
855
+ },
856
+ {
857
+ parameter_key: "FePrimaDomain",
858
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
859
+ },
860
+ {
861
+ parameter_key: "HostnamePattern",
862
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
863
+ }
864
+ ]
865
+ if stack_exists?(stack_name_web)
866
+ cur_version = get_currently_deployed_version(stack_name_web)
867
+ update_stack(stack_name_web, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["prima"][:revision])
868
+ else
869
+ create_stack(stack_name_web, stack_body, parameters, tags, @cf_role)
870
+ end
871
+ wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
872
+ update_service_defaults(stack_name_web)
873
+ prima_hostname = get_route53_hostname(stack_name_web)
874
+
875
+ projects_text = "
876
+ > Prima url: https://#{prima_hostname}
877
+ > SSH connection: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no githubUsername@#{ec2_ip_address(asg_stack_name)}\n"
878
+
879
+ output projects_text.cyan
880
+ output "Deploy effettuato, everything is awesome!\n".green
881
+ if @qainit
882
+ qainit_write_output(projects_text, 'Indirizzi scritti su ')
883
+ end
884
+ end
885
+
886
+ def deploy_feature!
887
+ `git pull && git submodule init && git submodule update`
888
+ @ami_id = get_ami_id("ecs-fleet-allinone-staging")
889
+ deploy_id = get_deploy_id
890
+ stack_name_alb = 'ecs-alb-http-public-qa-' + deploy_id[0..5]
891
+ stack_name_alb_ws = 'ecs-alb-ws-public-qa-' + deploy_id[0..5]
892
+ unless @qainit
893
+ @projects.each_key do |project_key|
894
+ if @projects[project_key][:revision]
895
+ git_checkout_version(project_key, @projects[project_key][:revision])
896
+ end
897
+ end
898
+ end
899
+ @dns_record_identifier = deploy_id
900
+ @git_branch = ENV['DRONE_BRANCH']
901
+ hostname_pattern_priority = hostname_pattern_priority()
902
+ tags = [
903
+ {
904
+ key: "qainit",
905
+ value: @git_branch
906
+ },
907
+ {
908
+ key: "hostname_pattern_priority",
909
+ value: hostname_pattern_priority
910
+ }
911
+ ]
912
+ @projects.each do |key, value|
913
+ case key.to_s
914
+ when 'crash'
915
+ tags << { key: 'crash', value: @projects['crash'][:name] } if deploy_crash?
916
+ when 'starsky', 'hutch'
917
+ tags << { key: key.to_s, value: @projects[key.to_s][:name] } if deploy_starsky_hutch?
918
+ else
919
+ tags << { key: key, value: value[:name] }
920
+ end
921
+ end
922
+
923
+ cluster_stack_name = "ecs-cluster-qa-#{deploy_id}"
924
+
925
+ if stack_exists?(cluster_stack_name)
926
+ tags = get_stack_tags(cluster_stack_name)
927
+ hostname_pattern_priority = tags.detect do |tag|
928
+ tag.key == 'hostname_pattern_priority'
929
+ end.value
930
+ end
931
+
932
+ create_cluster_stack(cluster_stack_name, tags) unless stack_exists?(cluster_stack_name)
933
+ wait_for_stack_ready(cluster_stack_name) unless stack_ready?(cluster_stack_name)
934
+
935
+ create_alb_stack(stack_name_alb, "http", deploy_id) unless stack_exists?(stack_name_alb)
936
+ create_alb_stack(stack_name_alb_ws, "websocket", deploy_id) unless stack_exists?(stack_name_alb_ws)
937
+
938
+ resp = @cf.describe_stack_resource({stack_name: cluster_stack_name, logical_resource_id: 'ECSCluster'})
939
+ @ecs_cluster_name = resp.stack_resource_detail.physical_resource_id
940
+
941
+ asg_stack_name = "ecs-asg-allinone-qa-#{deploy_id}"
942
+ create_asg_stack(asg_stack_name, tags) unless stack_exists?(asg_stack_name)
943
+
944
+ stack_name_db = "ecs-task-db-qa-#{deploy_id}"
945
+ stack_body = IO.read('cloudformation/stacks/task/db.yml')
946
+ parameters = [
947
+ {
948
+ parameter_key: "Environment",
949
+ parameter_value: "qa"
950
+ },
951
+ {
952
+ parameter_key: "ECSClusterName",
953
+ parameter_value: @ecs_cluster_name
954
+ }
955
+ ]
956
+ create_stack(stack_name_db, stack_body, parameters, tags, @cf_role) unless stack_exists?(stack_name_db) # creazione asincrona stack dei db (~4 min)
957
+
958
+ output "check pyxis \n".yellow
959
+
960
+ create_pyxis_artifact(@projects["pyxis-npm"][:revision], deploy_id) unless @projects["pyxis-npm"].nil? # deve essere creato prima di quello di prima, per avere la versione
961
+ create_prima_artifact(@projects["prima"][:revision], @projects["prima"][:name], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "prima/#{@projects["prima"][:revision]}.tar.gz")
962
+ # l'artefatto di prima viene creato sempre (puntamenti all'ambiente compilati nel js) e richiede molto più di 4 minuti
963
+ wait_for_stack_ready(stack_name_db) unless stack_ready?(stack_name_db) # dovrebbe essere istantaneo
964
+ db_task = ''
965
+ db_task = import_dbs(ec2_ip_address(asg_stack_name)) unless stack_exists?("ecs-route53-qa-#{deploy_id}") # import asincrono dei dati
966
+
967
+ create_crash_artifact(@projects['crash'][:revision], deploy_id) unless !deploy_crash? || artifact_exists?('prima-artifacts-encrypted', "microservices/crash/#{@projects['crash'][:revision]}-qa.tar.gz")
968
+ create_urania_artifact(@projects["urania"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/urania/#{@projects["urania"][:revision]}-qa.tar.gz")
969
+ create_roger_artifact(@projects["roger"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/roger/#{@projects["roger"][:revision]}-qa.tar.gz")
970
+ create_ermes_artifact(@projects["ermes"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/ermes/#{@projects["ermes"][:revision]}-qa.tar.gz")
971
+ create_bburago_artifact(@projects["bburago"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/bburago/#{@projects["bburago"][:revision]}-qa.tar.gz")
972
+ create_hal9000_artifact(@projects["hal9000"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/hal9000/#{@projects["hal9000"][:revision]}-qa.tar.gz")
973
+ create_rachele_artifact(@projects["rachele"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/rachele/#{@projects["rachele"][:revision]}-qa.tar.gz")
974
+ create_fidaty_artifact(@projects["fidaty"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/fidaty/#{@projects["fidaty"][:revision]}-qa.tar.gz")
975
+ create_peano_artifact(@projects["peano"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/peano/#{@projects["peano"][:revision]}-qa.tar.gz")
976
+ create_rogoreport_artifact(@projects["rogoreport"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/rogoreport/rogoreport-#{@projects["rogoreport"][:revision]}-qa.tar.gz")
977
+ create_assange_artifact(@projects["assange"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/assange/#{@projects["assange"][:revision]}-qa.tar.gz")
978
+ create_borat_artifact(@projects["borat"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/borat/#{@projects["borat"][:revision]}-qa.tar.gz")
979
+ create_activia_artifact(@projects["activia"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/activia/#{@projects["activia"][:revision]}-qa.tar.gz")
980
+ create_leftorium_artifact(@projects["leftorium"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/leftorium/#{@projects["leftorium"][:revision]}-qa.tar.gz")
981
+ create_skynet_artifact(@projects["skynet"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/skynet/#{@projects["skynet"][:revision]}-qa.tar.gz")
982
+ create_starsky_artifact(@projects["starsky"][:revision]) unless !deploy_starsky_hutch? || artifact_exists?('prima-artifacts-encrypted', "microservices/starsky/#{@projects["starsky"][:revision]}-qa.tar.gz")
983
+ create_hutch_artifact(@projects["hutch"][:revision]) unless !deploy_starsky_hutch? || artifact_exists?('prima-artifacts-encrypted', "microservices/hutch/#{@projects["hutch"][:revision]}-qa.tar.gz")
984
+
985
+ wait_for_db_import(db_task) unless stack_exists?("ecs-route53-qa-#{deploy_id}") # dovrebbe essere istantaneo
986
+
987
+ import_redis_crash(ec2_ip_address(asg_stack_name)) if deploy_crash? && !stack_exists?("ecs-task-web-qa-#{deploy_id}")
988
+
989
+ wait_for_stack_ready(stack_name_alb) unless stack_ready?(stack_name_alb)
990
+ wait_for_stack_ready(stack_name_alb_ws) unless stack_ready?(stack_name_alb_ws)
991
+
992
+ stack_name_route53 = "ecs-route53-qa-#{deploy_id}"
993
+ stack_body = IO.read('cloudformation/stacks/route53/qa.yml')
994
+ parameters = [
995
+ {
996
+ parameter_key: "DnsRecordIdentifier",
997
+ parameter_value: @dns_record_identifier
998
+ },
999
+ {
1000
+ parameter_key: "PrimaElbHostname",
1001
+ parameter_value: get_alb_host(stack_name_alb)
1002
+ },
1003
+ {
1004
+ parameter_key: "UraniaIp",
1005
+ parameter_value: ec2_ip_address(asg_stack_name)
1006
+ },
1007
+ {
1008
+ parameter_key: "BburagoIp",
1009
+ parameter_value: ec2_ip_address(asg_stack_name)
1010
+ },
1011
+ {
1012
+ parameter_key: "Hal9000Ip",
1013
+ parameter_value: ec2_ip_address(asg_stack_name)
1014
+ },
1015
+ {
1016
+ parameter_key: "FidatyIp",
1017
+ parameter_value: ec2_ip_address(asg_stack_name)
1018
+ },
1019
+ {
1020
+ parameter_key: "PeanoIp",
1021
+ parameter_value: ec2_ip_address(asg_stack_name)
1022
+ },
1023
+ {
1024
+ parameter_key: "ErmesIp",
1025
+ parameter_value: ec2_ip_address(asg_stack_name)
1026
+ },
1027
+ {
1028
+ parameter_key: "ActiviaIp",
1029
+ parameter_value: ec2_ip_address(asg_stack_name)
1030
+ },
1031
+ {
1032
+ parameter_key: "SkynetIp",
1033
+ parameter_value: ec2_ip_address(asg_stack_name)
1034
+ },
1035
+ {
1036
+ parameter_key: "RogerIp",
1037
+ parameter_value: ec2_ip_address(asg_stack_name)
1038
+ },
1039
+ {
1040
+ parameter_key: "LeftoriumIp",
1041
+ parameter_value: ec2_ip_address(asg_stack_name)
1042
+ },
1043
+ {
1044
+ parameter_key: "RacheleIp",
1045
+ parameter_value: ec2_ip_address(asg_stack_name)
1046
+ },
1047
+ {
1048
+ parameter_key: "RedisIp",
1049
+ parameter_value: ec2_ip_address(asg_stack_name)
1050
+ },
1051
+ {
1052
+ parameter_key: "AssangeElbHostname",
1053
+ parameter_value: get_alb_host(stack_name_alb)
1054
+ },
1055
+ {
1056
+ parameter_key: "BoratElbHostname",
1057
+ parameter_value: get_alb_host(stack_name_alb_ws)
1058
+ },
1059
+ {
1060
+ parameter_key: 'CrashElbHostname',
1061
+ parameter_value: get_alb_host(stack_name_alb_ws)
1062
+ },
1063
+ {
1064
+ parameter_key: 'StarskyElbHostname',
1065
+ parameter_value: get_alb_host(stack_name_alb)
1066
+ },
1067
+ {
1068
+ parameter_key: 'HutchElbHostname',
1069
+ parameter_value: get_alb_host(stack_name_alb)
1070
+ }
1071
+ ]
1072
+
1073
+ create_stack(stack_name_route53, stack_body, parameters, tags, @cf_role) unless stack_exists?(stack_name_route53)
1074
+ wait_for_stack_ready(stack_name_route53) unless stack_ready?(stack_name_route53)
1075
+
1076
+ stack_name_skynet = "ecs-task-skynet-qa-#{deploy_id}"
1077
+ git_checkout_version('skynet', @projects["skynet"][:revision])
1078
+ stack_body = File.read('projects/skynet/deploy/task.yml')
1079
+ parameters = [
1080
+ {
1081
+ parameter_key: "Environment",
1082
+ parameter_value: "qa"
1083
+ },
1084
+ {
1085
+ parameter_key: "ReleaseVersion",
1086
+ parameter_value: @projects["skynet"][:revision]
1087
+ },
1088
+ {
1089
+ parameter_key: "TaskDesiredCount",
1090
+ parameter_value: "1"
1091
+ },
1092
+ {
1093
+ parameter_key: "ECSClusterName",
1094
+ parameter_value: @ecs_cluster_name
1095
+ },
1096
+ {
1097
+ parameter_key: "HostnamePattern",
1098
+ parameter_value: "skynet-#{@dns_record_identifier}.qa.colaster.com"
1099
+ },
1100
+ {
1101
+ parameter_key: "HostnamePatternPriority",
1102
+ parameter_value: hostname_pattern_priority
1103
+ }
1104
+ ]
1105
+ if stack_exists?(stack_name_skynet)
1106
+ cur_version = get_currently_deployed_version(stack_name_skynet)
1107
+ update_stack(stack_name_skynet, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["skynet"][:revision])
1108
+ else
1109
+ create_stack(stack_name_skynet, stack_body, parameters, tags, @cf_role)
1110
+ end
1111
+
1112
+ stack_name_urania = "ecs-task-urania-qa-#{deploy_id}"
1113
+ git_checkout_version('urania', @projects["urania"][:revision])
1114
+ stack_body = File.read('projects/urania/deploy/task.yml')
1115
+ parameters = [
1116
+ {
1117
+ parameter_key: "Environment",
1118
+ parameter_value: "qa"
1119
+ },
1120
+ {
1121
+ parameter_key: "ReleaseVersion",
1122
+ parameter_value: @projects["urania"][:revision]
1123
+ },
1124
+ {
1125
+ parameter_key: "TaskDesiredCount",
1126
+ parameter_value: "1"
1127
+ },
1128
+ {
1129
+ parameter_key: "ECSClusterName",
1130
+ parameter_value: @ecs_cluster_name
1131
+ },
1132
+ {
1133
+ parameter_key: "HostnamePattern",
1134
+ parameter_value: "urania-#{@dns_record_identifier}.qa.colaster.com"
1135
+ },
1136
+ {
1137
+ parameter_key: "HostnamePatternPriority",
1138
+ parameter_value: hostname_pattern_priority
1139
+ }
1140
+ ]
1141
+ if stack_exists?(stack_name_urania)
1142
+ cur_version = get_currently_deployed_version(stack_name_urania)
1143
+ update_stack(stack_name_urania, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["urania"][:revision])
1144
+ else
1145
+ create_stack(stack_name_urania, stack_body, parameters, tags, @cf_role)
1146
+ end
1147
+
1148
+ stack_name_ermes = "ecs-task-ermes-qa-#{deploy_id}"
1149
+ git_checkout_version('ermes', @projects["ermes"][:revision])
1150
+ stack_body = File.read('projects/ermes/deploy/task.yml')
1151
+ parameters = [
1152
+ {
1153
+ parameter_key: "Environment",
1154
+ parameter_value: "qa"
1155
+ },
1156
+ {
1157
+ parameter_key: "ReleaseVersion",
1158
+ parameter_value: "#{@projects['ermes'][:revision]}"
1159
+ },
1160
+ {
1161
+ parameter_key: "TaskDesiredCount",
1162
+ parameter_value: "1"
1163
+ },
1164
+ {
1165
+ parameter_key: "ECSClusterName",
1166
+ parameter_value: @ecs_cluster_name
1167
+ },
1168
+ {
1169
+ parameter_key: "HostnamePattern",
1170
+ parameter_value: "ermes-#{@dns_record_identifier}.qa.colaster.com"
1171
+ },
1172
+ {
1173
+ parameter_key: "HostnamePatternPriority",
1174
+ parameter_value: hostname_pattern_priority
1175
+ },
1176
+ {
1177
+ parameter_key: "WebHost",
1178
+ parameter_value: get_route53_hostname('ecs-task-web-qa-notneeded')
1179
+ },
1180
+ {
1181
+ parameter_key: "PeanoHost",
1182
+ parameter_value: get_route53_hostname('ecs-task-peano-qa-notneeded')
1183
+ }
1184
+ ]
1185
+ if stack_exists?(stack_name_ermes)
1186
+ cur_version = get_currently_deployed_version(stack_name_ermes)
1187
+ update_stack(stack_name_ermes, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["ermes"][:revision])
1188
+ else
1189
+ create_stack(stack_name_ermes, stack_body, parameters, tags, @cf_role)
1190
+ end
1191
+
1192
+ stack_name_bburago = "ecs-task-bburago-qa-#{deploy_id}"
1193
+ git_checkout_version('bburago', @projects["bburago"][:revision])
1194
+ stack_body = File.read('projects/bburago/deploy/task.yml')
1195
+ parameters = [
1196
+ {
1197
+ parameter_key: "Environment",
1198
+ parameter_value: "qa"
1199
+ },
1200
+ {
1201
+ parameter_key: "ReleaseVersion",
1202
+ parameter_value: @projects["bburago"][:revision]
1203
+ },
1204
+ {
1205
+ parameter_key: "ECSClusterName",
1206
+ parameter_value: @ecs_cluster_name
1207
+ },
1208
+ {
1209
+ parameter_key: "TaskDesiredCount",
1210
+ parameter_value: "1"
1211
+ },
1212
+ {
1213
+ parameter_key: "HostnamePattern",
1214
+ parameter_value: "bburago-#{@dns_record_identifier}.qa.colaster.com"
1215
+ },
1216
+ {
1217
+ parameter_key: "HostnamePatternPriority",
1218
+ parameter_value: hostname_pattern_priority
1219
+ }
1220
+ ]
1221
+ if stack_exists?(stack_name_bburago)
1222
+ cur_version = get_currently_deployed_version(stack_name_bburago)
1223
+ update_stack(stack_name_bburago, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["bburago"][:revision])
1224
+ else
1225
+ create_stack(stack_name_bburago, stack_body, parameters, tags, @cf_role)
1226
+ end
1227
+
1228
+ stack_name_hal9000 = "ecs-task-hal9000-qa-#{deploy_id}"
1229
+ git_checkout_version('hal9000', @projects["hal9000"][:revision])
1230
+ stack_body = File.read('projects/hal9000/deploy/task.yml')
1231
+ parameters = [
1232
+ {
1233
+ parameter_key: "Environment",
1234
+ parameter_value: "qa"
1235
+ },
1236
+ {
1237
+ parameter_key: "ReleaseVersion",
1238
+ parameter_value: @projects["hal9000"][:revision]
1239
+ },
1240
+ {
1241
+ parameter_key: "ECSClusterName",
1242
+ parameter_value: @ecs_cluster_name
1243
+ },
1244
+ {
1245
+ parameter_key: "TaskDesiredCount",
1246
+ parameter_value: "1"
1247
+ },
1248
+ {
1249
+ parameter_key: "HostnamePattern",
1250
+ parameter_value: "hal9000-#{@dns_record_identifier}.qa.colaster.com"
1251
+ },
1252
+ {
1253
+ parameter_key: "HostnamePatternPriority",
1254
+ parameter_value: hostname_pattern_priority
1255
+ }
1256
+ ]
1257
+ if stack_exists?(stack_name_hal9000)
1258
+ cur_version = get_currently_deployed_version(stack_name_hal9000)
1259
+ update_stack(stack_name_hal9000, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["hal9000"][:revision])
1260
+ else
1261
+ create_stack(stack_name_hal9000, stack_body, parameters, tags, @cf_role)
1262
+ end
1263
+
1264
+ stack_name_fidaty = "ecs-task-fidaty-qa-#{deploy_id}"
1265
+ git_checkout_version('fidaty', @projects["fidaty"][:revision])
1266
+ stack_body = File.read('projects/fidaty/deploy/task.yml')
1267
+ parameters = [
1268
+ {
1269
+ parameter_key: "Environment",
1270
+ parameter_value: "qa"
1271
+ },
1272
+ {
1273
+ parameter_key: "ReleaseVersion",
1274
+ parameter_value: "#{@projects["fidaty"][:revision]}"
1275
+ },
1276
+ {
1277
+ parameter_key: "ECSClusterName",
1278
+ parameter_value: @ecs_cluster_name
1279
+ },
1280
+ {
1281
+ parameter_key: "TaskDesiredCount",
1282
+ parameter_value: "1"
1283
+ },
1284
+ {
1285
+ parameter_key: "HostnamePattern",
1286
+ parameter_value: "fidaty-#{@dns_record_identifier}.qa.colaster.com"
1287
+ },
1288
+ {
1289
+ parameter_key: "HostnamePatternPriority",
1290
+ parameter_value: hostname_pattern_priority
1291
+ },
1292
+ {
1293
+ parameter_key: "PeanoHost",
1294
+ parameter_value: get_route53_hostname("ecs-task-peano-qa-notneeded")
1295
+ }
1296
+ ]
1297
+ if stack_exists?(stack_name_fidaty)
1298
+ cur_version = get_currently_deployed_version(stack_name_fidaty)
1299
+ update_stack(stack_name_fidaty, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["fidaty"][:revision])
1300
+ else
1301
+ create_stack(stack_name_fidaty, stack_body, parameters, tags, @cf_role)
1302
+ end
1303
+
1304
+ stack_name_peano = "ecs-task-peano-qa-#{deploy_id}"
1305
+ git_checkout_version('peano', @projects["peano"][:revision])
1306
+ stack_body = File.read('projects/peano/deploy/task.yml')
1307
+ parameters = [
1308
+ {
1309
+ parameter_key: "Environment",
1310
+ parameter_value: "qa"
1311
+ },
1312
+ {
1313
+ parameter_key: "ReleaseVersion",
1314
+ parameter_value: "#{@projects['peano'][:revision]}"
1315
+ },
1316
+ {
1317
+ parameter_key: "ECSClusterName",
1318
+ parameter_value: @ecs_cluster_name
1319
+ },
1320
+ {
1321
+ parameter_key: "TaskDesiredCount",
1322
+ parameter_value: "1"
1323
+ },
1324
+ {
1325
+ parameter_key: "HostnamePattern",
1326
+ parameter_value: "peano-#{@dns_record_identifier}.qa.colaster.com"
1327
+ },
1328
+ {
1329
+ parameter_key: "HostnamePatternPriority",
1330
+ parameter_value: hostname_pattern_priority
1331
+ },
1332
+ {
1333
+ parameter_key: "WebHost",
1334
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1335
+ },
1336
+ {
1337
+ parameter_key: "AssangeHost",
1338
+ parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
1339
+ }
1340
+ ]
1341
+ if stack_exists?(stack_name_peano)
1342
+ cur_version = get_currently_deployed_version(stack_name_peano)
1343
+ update_stack(stack_name_peano, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["peano"][:revision])
1344
+ else
1345
+ create_stack(stack_name_peano, stack_body, parameters, tags, @cf_role)
1346
+ end
1347
+
1348
+ stack_name_rogoreport = "ecs-task-rogoreport-qa-#{deploy_id}"
1349
+ git_checkout_version('rogoreport', @projects["rogoreport"][:revision])
1350
+ stack_body = IO.read('projects/rogoreport/deploy/task.yml')
1351
+ parameters = [
1352
+ {
1353
+ parameter_key: "Environment",
1354
+ parameter_value: "qa"
1355
+ },
1356
+ {
1357
+ parameter_key: "ReleaseVersion",
1358
+ parameter_value: "#{@projects["rogoreport"][:revision]}"
1359
+ },
1360
+ {
1361
+ parameter_key: "ReleaseName",
1362
+ parameter_value: "rogoreport"
1363
+ },
1364
+ {
1365
+ parameter_key: "ECSClusterName",
1366
+ parameter_value: @ecs_cluster_name
1367
+ }
1368
+ ]
1369
+ if stack_exists?(stack_name_rogoreport)
1370
+ cur_version = get_currently_deployed_version(stack_name_rogoreport)
1371
+ update_stack(stack_name_rogoreport, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["rogoreport"][:revision])
1372
+ else
1373
+ create_stack(stack_name_rogoreport, stack_body, parameters, tags, @cf_role)
1374
+ end
1375
+
1376
+ stack_name_assange = "ecs-task-assange-qa-#{deploy_id}"
1377
+ git_checkout_version('assange', @projects["assange"][:revision])
1378
+ stack_body = IO.read('projects/assange/deploy/task.yml')
1379
+ parameters = [
1380
+ {
1381
+ parameter_key: "Environment",
1382
+ parameter_value: "qa"
1383
+ },
1384
+ {
1385
+ parameter_key: "ReleaseVersion",
1386
+ parameter_value: "#{@projects["assange"][:revision]}"
1387
+ },
1388
+ {
1389
+ parameter_key: "ECSClusterName",
1390
+ parameter_value: @ecs_cluster_name
1391
+ },
1392
+ {
1393
+ parameter_key: "TaskDesiredCount",
1394
+ parameter_value: "1"
1395
+ },
1396
+ {
1397
+ parameter_key: "ALBShortName",
1398
+ parameter_value: "assange-qa-#{deploy_id}"[0..27]
1399
+ },
1400
+ {
1401
+ parameter_key: "HostnamePattern",
1402
+ parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
1403
+ },
1404
+ {
1405
+ parameter_key: "HostnamePatternPriority",
1406
+ parameter_value: (hostname_pattern_priority.to_i + 20).to_s
1407
+ },
1408
+ {
1409
+ parameter_key: "EnvHash",
1410
+ parameter_value: deploy_id
1411
+ },
1412
+ {
1413
+ parameter_key: "WebHost",
1414
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1415
+ },
1416
+ {
1417
+ parameter_key: "AssangeHost",
1418
+ parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
1419
+ }
1420
+ ]
1421
+ if stack_exists?(stack_name_assange)
1422
+ cur_version = get_currently_deployed_version(stack_name_assange)
1423
+ update_stack(stack_name_assange, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["assange"][:revision])
1424
+ else
1425
+ create_stack(stack_name_assange, stack_body, parameters, tags, @cf_role)
1426
+ end
1427
+
1428
+ stack_name_leftorium = "ecs-task-leftorium-qa-#{deploy_id}"
1429
+ git_checkout_version('leftorium', @projects["leftorium"][:revision])
1430
+ stack_body = File.read('projects/leftorium/deploy/task.yml')
1431
+ parameters = [
1432
+ {
1433
+ parameter_key: "Environment",
1434
+ parameter_value: "qa"
1435
+ },
1436
+ {
1437
+ parameter_key: "ReleaseVersion",
1438
+ parameter_value: "#{@projects["leftorium"][:revision]}"
1439
+ },
1440
+ {
1441
+ parameter_key: "ECSClusterName",
1442
+ parameter_value: @ecs_cluster_name
1443
+ },
1444
+ {
1445
+ parameter_key: "TaskDesiredCount",
1446
+ parameter_value: "1"
1447
+ },
1448
+ {
1449
+ parameter_key: "HostnamePattern",
1450
+ parameter_value: "leftorium-#{@dns_record_identifier}.qa.colaster.com"
1451
+ },
1452
+ {
1453
+ parameter_key: "HostnamePatternPriority",
1454
+ parameter_value: hostname_pattern_priority
1455
+ }
1456
+ ]
1457
+ if stack_exists?(stack_name_leftorium)
1458
+ cur_version = get_currently_deployed_version(stack_name_leftorium)
1459
+ update_stack(stack_name_leftorium, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["leftorium"][:revision])
1460
+ else
1461
+ create_stack(stack_name_leftorium, stack_body, parameters, tags, @cf_role)
1462
+ end
1463
+
1464
+ stack_name_rachele = "ecs-task-rachele-qa-#{deploy_id}"
1465
+ git_checkout_version('rachele', @projects["rachele"][:revision])
1466
+ stack_body = File.read('projects/rachele/deploy/task.yml')
1467
+ parameters = [
1468
+ {
1469
+ parameter_key: "Environment",
1470
+ parameter_value: "qa"
1471
+ },
1472
+ {
1473
+ parameter_key: "ReleaseVersion",
1474
+ parameter_value: "#{@projects["rachele"][:revision]}"
1475
+ },
1476
+ {
1477
+ parameter_key: "ECSClusterName",
1478
+ parameter_value: @ecs_cluster_name
1479
+ },
1480
+ {
1481
+ parameter_key: "TaskDesiredCount",
1482
+ parameter_value: "1"
1483
+ },
1484
+ {
1485
+ parameter_key: "WebHost",
1486
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1487
+ },
1488
+ {
1489
+ parameter_key: "HostnamePattern",
1490
+ parameter_value: "rachele-#{@dns_record_identifier}.qa.colaster.com"
1491
+ },
1492
+ {
1493
+ parameter_key: "HostnamePatternPriority",
1494
+ parameter_value: hostname_pattern_priority
1495
+ }
1496
+ ]
1497
+ if stack_exists?(stack_name_rachele)
1498
+ cur_version = get_currently_deployed_version(stack_name_rachele)
1499
+ update_stack(stack_name_rachele, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["rachele"][:revision])
1500
+ else
1501
+ create_stack(stack_name_rachele, stack_body, parameters, tags, @cf_role)
1502
+ end
1503
+
1504
+ stack_name_borat = "ecs-task-borat-qa-#{deploy_id}"
1505
+ git_checkout_version('borat', @projects["borat"][:revision])
1506
+ stack_body = IO.read('projects/borat/deploy/task.yml')
1507
+ parameters = [
1508
+ {
1509
+ parameter_key: "Environment",
1510
+ parameter_value: "qa"
1511
+ },
1512
+ {
1513
+ parameter_key: "ReleaseVersion",
1514
+ parameter_value: "#{@projects["borat"][:revision]}"
1515
+ },
1516
+ {
1517
+ parameter_key: "ECSClusterName",
1518
+ parameter_value: @ecs_cluster_name
1519
+ },
1520
+ {
1521
+ parameter_key: "TaskDesiredCount",
1522
+ parameter_value: "1"
1523
+ },
1524
+ {
1525
+ parameter_key: "ALBShortName",
1526
+ parameter_value: "borat-qa-#{deploy_id}"[0..27]
1527
+ },
1528
+ {
1529
+ parameter_key: "HostnamePattern",
1530
+ parameter_value: "backoffice-#{@dns_record_identifier}.qa.colaster.com"
1531
+ },
1532
+ {
1533
+ parameter_key: "HostnamePatternPriority",
1534
+ parameter_value: (hostname_pattern_priority.to_i + 30).to_s
1535
+ },
1536
+ {
1537
+ parameter_key: "EnvHash",
1538
+ parameter_value: deploy_id
1539
+ },
1540
+ {
1541
+ parameter_key: "WsEndpoint",
1542
+ parameter_value: "wss://backoffice-#{@dns_record_identifier}.qa.colaster.com/socket/websocket?vsn=1.0.0"
1543
+ },
1544
+ {
1545
+ parameter_key: "GraphqlEndpoint",
1546
+ parameter_value: "https://backoffice-#{@dns_record_identifier}.qa.colaster.com/graphql"
1547
+ },
1548
+ {
1549
+ parameter_key: "AuthEndpoint",
1550
+ parameter_value: "https://backoffice-#{@dns_record_identifier}.qa.colaster.com/auth"
1551
+ },
1552
+ {
1553
+ parameter_key: "FrontendEndpoint",
1554
+ parameter_value: "https://www-#{@dns_record_identifier}.qa.colaster.com/"
1555
+ }
1556
+ ]
1557
+ if stack_exists?(stack_name_borat)
1558
+ cur_version = get_currently_deployed_version(stack_name_borat)
1559
+ update_stack(stack_name_borat, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["borat"][:revision])
1560
+ else
1561
+ create_stack(stack_name_borat, stack_body, parameters, tags, @cf_role)
1562
+ end
1563
+
1564
+ if deploy_crash?
1565
+ git_checkout_version('crash', @projects['crash'][:revision])
1566
+ stack_name_crash = "ecs-task-crash-qa-#{deploy_id}"
1567
+ stack_body = IO.read('projects/crash/deploy/task.yml')
1568
+ parameters = [
1569
+ {
1570
+ parameter_key: 'Environment',
1571
+ parameter_value: 'qa'
1572
+ },
1573
+ {
1574
+ parameter_key: 'ReleaseVersion',
1575
+ parameter_value: "#{@projects['crash'][:revision]}"
1576
+ },
1577
+ {
1578
+ parameter_key: 'TaskDesiredCount',
1579
+ parameter_value: '1'
1580
+ },
1581
+ {
1582
+ parameter_key: 'ECSClusterName',
1583
+ parameter_value: @ecs_cluster_name
1584
+ },
1585
+ {
1586
+ parameter_key: 'ALBShortName',
1587
+ parameter_value: "crash-qa-#{deploy_id}"[0..27]
1588
+ },
1589
+ {
1590
+ parameter_key: 'HostnamePattern',
1591
+ parameter_value: "crash-#{@dns_record_identifier}.qa.colaster.com"
1592
+ },
1593
+ {
1594
+ parameter_key: 'HostnamePatternPriority',
1595
+ parameter_value: (hostname_pattern_priority.to_i + 10).to_s
1596
+ },
1597
+ {
1598
+ parameter_key: "EnvHash",
1599
+ parameter_value: deploy_id
1600
+ },
1601
+ {
1602
+ parameter_key: "WsEndpoint",
1603
+ parameter_value: "wss://crash-#{@dns_record_identifier}.qa.colaster.com/socket/websocket?vsn=1.0.0"
1604
+ },
1605
+ {
1606
+ parameter_key: "GraphqlEndpoint",
1607
+ parameter_value: "https://crash-#{@dns_record_identifier}.qa.colaster.com/graphql"
1608
+ },
1609
+ {
1610
+ parameter_key: "AuthDomain",
1611
+ parameter_value: "https://www-#{@dns_record_identifier}.qa.colaster.com/"
1612
+ },
1613
+ ]
1614
+ if stack_exists?(stack_name_crash)
1615
+ cur_version = get_currently_deployed_version(stack_name_crash)
1616
+ update_stack(stack_name_crash, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["crash"][:revision])
1617
+ else
1618
+ create_stack(stack_name_crash, stack_body, parameters, tags, @cf_role)
1619
+ end
1620
+ end
1621
+
1622
+ if deploy_starsky_hutch?
1623
+ stack_name_starsky = "ecs-task-starsky-qa-#{deploy_id}"
1624
+ git_checkout_version('starsky', @projects["starsky"][:revision])
1625
+ stack_body = IO.read('projects/starsky/deploy/task.yml')
1626
+ parameters = [
1627
+ {
1628
+ parameter_key: "Environment",
1629
+ parameter_value: "qa"
1630
+ },
1631
+ {
1632
+ parameter_key: "ReleaseVersion",
1633
+ parameter_value: "#{@projects["starsky"][:revision]}"
1634
+ },
1635
+ {
1636
+ parameter_key: "TaskDesiredCount",
1637
+ parameter_value: "1"
1638
+ },
1639
+ {
1640
+ parameter_key: "ECSClusterName",
1641
+ parameter_value: @ecs_cluster_name
1642
+ },
1643
+ {
1644
+ parameter_key: "ALBShortName",
1645
+ parameter_value: "starsky-qa-#{deploy_id}"[0..27]
1646
+ },
1647
+ {
1648
+ parameter_key: "EnvHash",
1649
+ parameter_value: deploy_id
1650
+ },
1651
+ {
1652
+ parameter_key: "HostnamePattern",
1653
+ parameter_value: "starsky-#{@dns_record_identifier}.qa.colaster.com"
1654
+ },
1655
+ {
1656
+ parameter_key: "HostnamePatternPriority",
1657
+ parameter_value: (hostname_pattern_priority.to_i + 74).to_s
1658
+ }
1659
+ ]
1660
+ if stack_exists?(stack_name_starsky)
1661
+ cur_version = get_currently_deployed_version(stack_name_starsky)
1662
+ update_stack(stack_name_starsky, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["starsky"][:revision])
1663
+ else
1664
+ create_stack(stack_name_starsky, stack_body, parameters, tags, @cf_role)
1665
+ end
1666
+ end
1667
+
1668
+ stack_name_activia = "ecs-task-activia-qa-#{deploy_id}"
1669
+ git_checkout_version('activia', @projects["activia"][:revision])
1670
+ stack_body = File.read('projects/activia/deploy/task.yml')
1671
+ parameters = [
1672
+ {
1673
+ parameter_key: "Environment",
1674
+ parameter_value: "qa"
1675
+ },
1676
+ {
1677
+ parameter_key: "ReleaseVersion",
1678
+ parameter_value: "#{@projects["activia"][:revision]}"
1679
+ },
1680
+ {
1681
+ parameter_key: "ECSClusterName",
1682
+ parameter_value: @ecs_cluster_name
1683
+ },
1684
+ {
1685
+ parameter_key: "TaskDesiredCount",
1686
+ parameter_value: "1"
1687
+ },
1688
+ {
1689
+ parameter_key: "HostnamePattern",
1690
+ parameter_value: "activia-#{@dns_record_identifier}.qa.colaster.com"
1691
+ },
1692
+ {
1693
+ parameter_key: "HostnamePatternPriority",
1694
+ parameter_value: hostname_pattern_priority
1695
+ },
1696
+ {
1697
+ parameter_key: "WebHost",
1698
+ parameter_value: get_route53_hostname('ecs-task-web-qa-notneeded')
1699
+ },
1700
+ {
1701
+ parameter_key: "PeanoHost",
1702
+ parameter_value: get_route53_hostname('ecs-task-peano-qa-notneeded')
1703
+ }
1704
+ ]
1705
+ if stack_exists?(stack_name_activia)
1706
+ cur_version = get_currently_deployed_version(stack_name_activia)
1707
+ update_stack(stack_name_activia, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["activia"][:revision])
1708
+ else
1709
+ create_stack(stack_name_activia, stack_body, parameters, tags, @cf_role)
1710
+ end
1711
+
1712
+ # Waiting for prima healtcheck dependencies
1713
+ wait_for_stack_ready(stack_name_skynet) unless stack_ready?(stack_name_skynet)
1714
+ wait_for_stack_ready(stack_name_urania) unless stack_ready?(stack_name_urania)
1715
+ wait_for_stack_ready(stack_name_bburago) unless stack_ready?(stack_name_bburago)
1716
+ wait_for_stack_ready(stack_name_hal9000) unless stack_ready?(stack_name_hal9000)
1717
+ wait_for_stack_ready(stack_name_assange) unless stack_ready?(stack_name_assange)
1718
+ wait_for_stack_ready(stack_name_fidaty) unless stack_ready?(stack_name_fidaty)
1719
+ wait_for_stack_ready(stack_name_leftorium) unless stack_ready?(stack_name_leftorium)
1720
+ wait_for_stack_ready(stack_name_rachele) unless stack_ready?(stack_name_rachele)
1721
+
1722
+ stack_name_web = "ecs-task-web-qa-#{deploy_id}"
1723
+ git_checkout_version('prima', @projects["prima"][:revision])
1724
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/web.yml')
1725
+ parameters = [
1726
+ {
1727
+ parameter_key: "Environment",
1728
+ parameter_value: "qa"
1729
+ },
1730
+ {
1731
+ parameter_key: "ReleaseVersion",
1732
+ parameter_value: "#{@projects["prima"][:revision]}"
1733
+ },
1734
+ {
1735
+ parameter_key: "TaskDesiredCount",
1736
+ parameter_value: "1"
1737
+ },
1738
+ {
1739
+ parameter_key: "ECSClusterName",
1740
+ parameter_value: @ecs_cluster_name
1741
+ },
1742
+ {
1743
+ parameter_key: "ALBShortName",
1744
+ parameter_value: "web-qa-#{deploy_id}"[0..27]
1745
+ },
1746
+ {
1747
+ parameter_key: "WebQaBaseHostname",
1748
+ parameter_value: "#{@dns_record_identifier}.qa.colaster.com"
1749
+ },
1750
+ {
1751
+ parameter_key: "HostnamePattern",
1752
+ parameter_value: "ww*-#{@dns_record_identifier}.qa.colaster.com"
1753
+ },
1754
+ {
1755
+ parameter_key: "HostnamePatternPriority",
1756
+ parameter_value: hostname_pattern_priority
1757
+ },
1758
+ {
1759
+ parameter_key: "HostnamePatternAggregatorPriority",
1760
+ parameter_value: (hostname_pattern_priority.to_i + 1).to_s
1761
+ },
1762
+ {
1763
+ parameter_key: "EnvHash",
1764
+ parameter_value: deploy_id
1765
+ },
1766
+ {
1767
+ parameter_key: "AssangeHostname",
1768
+ parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
1769
+ },
1770
+ {
1771
+ parameter_key: "BackofficeHostname",
1772
+ parameter_value: "backoffice-#{@dns_record_identifier}.qa.colaster.com"
1773
+ },
1774
+ {
1775
+ parameter_key: "WebHostname",
1776
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1777
+ },
1778
+ {
1779
+ parameter_key: "FePrimaDomain",
1780
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1781
+ },
1782
+ {
1783
+ parameter_key: "HostnamePattern",
1784
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1785
+ }
1786
+ ]
1787
+ if stack_exists?(stack_name_web)
1788
+ cur_version = get_currently_deployed_version(stack_name_web)
1789
+ update_stack(stack_name_web, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["prima"][:revision])
1790
+ else
1791
+ create_stack(stack_name_web, stack_body, parameters, tags, @cf_role)
1792
+ end
1793
+
1794
+ stack_name_consumer = "ecs-task-consumer-qa-#{deploy_id}"
1795
+ git_checkout_version('prima', @projects["prima"][:revision])
1796
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/consumer.yml')
1797
+ parameters = [
1798
+ {
1799
+ parameter_key: "Environment",
1800
+ parameter_value: "qa"
1801
+ },
1802
+ {
1803
+ parameter_key: "ReleaseVersion",
1804
+ parameter_value: "#{@projects["prima"][:revision]}"
1805
+ },
1806
+ {
1807
+ parameter_key: "ECSClusterName",
1808
+ parameter_value: @ecs_cluster_name
1809
+ },
1810
+ {
1811
+ parameter_key: "NginxHttpHost",
1812
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1813
+ },
1814
+ {
1815
+ parameter_key: "AssangeHostname",
1816
+ parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
1817
+ },
1818
+ {
1819
+ parameter_key: "BackofficeHostname",
1820
+ parameter_value: "backoffice-#{@dns_record_identifier}.qa.colaster.com"
1821
+ },
1822
+ {
1823
+ parameter_key: "WebHostname",
1824
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1825
+ },
1826
+ {
1827
+ parameter_key: "FePrimaDomain",
1828
+ parameter_value: "www-#{@dns_record_identifier}.qa.colaster.com"
1829
+ },
1830
+ {
1831
+ parameter_key: "HostnamePattern",
1832
+ parameter_value: "consumer-#{@dns_record_identifier}.qa.colaster.com"
1833
+ }
1834
+ ]
1835
+ if stack_exists?(stack_name_consumer)
1836
+ cur_version = get_currently_deployed_version(stack_name_consumer)
1837
+ update_stack(stack_name_consumer, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["prima"][:revision])
1838
+ else
1839
+ create_stack(stack_name_consumer, stack_body, parameters, tags, @cf_role)
1840
+ end
1841
+
1842
+ stack_name_roger = "ecs-task-roger-qa-#{deploy_id}"
1843
+ git_checkout_version('roger', @projects["roger"][:revision])
1844
+ stack_body = File.read('projects/roger/deploy/task.yml')
1845
+ parameters = [
1846
+ {
1847
+ parameter_key: "Environment",
1848
+ parameter_value: "qa"
1849
+ },
1850
+ {
1851
+ parameter_key: "ReleaseVersion",
1852
+ parameter_value: @projects["roger"][:revision]
1853
+ },
1854
+ {
1855
+ parameter_key: "TaskDesiredCount",
1856
+ parameter_value: "1"
1857
+ },
1858
+ {
1859
+ parameter_key: "ECSClusterName",
1860
+ parameter_value: @ecs_cluster_name
1861
+ },
1862
+ {
1863
+ parameter_key: "HostnamePattern",
1864
+ parameter_value: "roger-#{@dns_record_identifier}.qa.colaster.com"
1865
+ },
1866
+ {
1867
+ parameter_key: "HostnamePatternPriority",
1868
+ parameter_value: hostname_pattern_priority
1869
+ }
1870
+ ]
1871
+ if stack_exists?(stack_name_roger)
1872
+ cur_version = get_currently_deployed_version(stack_name_roger)
1873
+ update_stack(stack_name_roger, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["roger"][:revision])
1874
+ else
1875
+ create_stack(stack_name_roger, stack_body, parameters, tags, @cf_role)
1876
+ end
1877
+
1878
+
1879
+ if deploy_starsky_hutch?
1880
+ wait_for_stack_ready(stack_name_starsky) unless stack_ready?(stack_name_starsky) unless !deploy_starsky_hutch?
1881
+
1882
+ stack_name_hutch = "ecs-task-hutch-qa-#{deploy_id}"
1883
+ git_checkout_version('hutch', @projects["hutch"][:revision])
1884
+ stack_body = File.read('projects/hutch/deploy/task.yml')
1885
+ parameters = [
1886
+ {
1887
+ parameter_key: "Environment",
1888
+ parameter_value: "qa"
1889
+ },
1890
+ {
1891
+ parameter_key: "ReleaseVersion",
1892
+ parameter_value: "#{@projects["hutch"][:revision]}"
1893
+ },
1894
+ {
1895
+ parameter_key: "ALBShortName",
1896
+ parameter_value: "hutch-qa-#{deploy_id}"[0..27]
1897
+ },
1898
+ {
1899
+ parameter_key: "ECSClusterName",
1900
+ parameter_value: @ecs_cluster_name
1901
+ },
1902
+ {
1903
+ parameter_key: "EnvHash",
1904
+ parameter_value: deploy_id
1905
+ },
1906
+ {
1907
+ parameter_key: "HostnamePattern",
1908
+ parameter_value: "hutch-#{@dns_record_identifier}.qa.colaster.com"
1909
+ },
1910
+ {
1911
+ parameter_key: "HostnamePatternPriority",
1912
+ parameter_value: (hostname_pattern_priority.to_i + 254).to_s
1913
+ },
1914
+ {
1915
+ parameter_key: "StarskyUrl",
1916
+ parameter_value: "https://#{get_route53_hostname('ecs-task-starsky-qa-notneeded')}"
1917
+ }
1918
+ ]
1919
+ if stack_exists?(stack_name_hutch)
1920
+ cur_version = get_currently_deployed_version(stack_name_hutch)
1921
+ update_stack(stack_name_hutch, stack_body, parameters, tags, @cf_role) unless cur_version.include?(@projects["hutch"][:revision])
1922
+ else
1923
+ create_stack(stack_name_hutch, stack_body, parameters, tags, @cf_role)
1924
+ end
1925
+ end
1926
+
1927
+ wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
1928
+ wait_for_stack_ready(stack_name_consumer) unless stack_ready?(stack_name_consumer)
1929
+ wait_for_stack_ready(stack_name_ermes) unless stack_ready?(stack_name_ermes)
1930
+ wait_for_stack_ready(stack_name_fidaty) unless stack_ready?(stack_name_fidaty)
1931
+ wait_for_stack_ready(stack_name_peano) unless stack_ready?(stack_name_peano)
1932
+ wait_for_stack_ready(stack_name_rogoreport) unless stack_ready?(stack_name_rogoreport)
1933
+ wait_for_stack_ready(stack_name_borat) unless stack_ready?(stack_name_borat)
1934
+ wait_for_stack_ready(stack_name_activia) unless stack_ready?(stack_name_activia)
1935
+ wait_for_stack_ready(stack_name_crash) unless stack_ready?(stack_name_crash) unless !deploy_crash?
1936
+ wait_for_stack_ready(stack_name_hutch) unless stack_ready?(stack_name_hutch) unless !deploy_starsky_hutch?
1937
+
1938
+ update_service_defaults(stack_name_web)
1939
+ update_service_defaults(stack_name_consumer)
1940
+ update_service_defaults(stack_name_urania)
1941
+ update_service_defaults(stack_name_ermes)
1942
+ update_service_defaults(stack_name_bburago)
1943
+ update_service_defaults(stack_name_hal9000)
1944
+ update_service_defaults(stack_name_fidaty)
1945
+ update_service_defaults(stack_name_peano)
1946
+ update_service_defaults(stack_name_rogoreport)
1947
+ update_service_defaults(stack_name_assange)
1948
+ update_service_defaults(stack_name_borat)
1949
+ update_service_defaults(stack_name_activia)
1950
+ update_service_defaults(stack_name_skynet)
1951
+ update_service_defaults(stack_name_leftorium)
1952
+ update_service_defaults(stack_name_rachele)
1953
+ update_service_defaults(stack_name_starsky) unless !deploy_starsky_hutch?
1954
+ update_service_defaults(stack_name_hutch) unless !deploy_starsky_hutch?
1955
+ update_service_defaults(stack_name_crash) unless !deploy_crash?
1956
+
1957
+ activia_hostname = get_route53_hostname(stack_name_activia)
1958
+ assange_hostname = get_route53_hostname(stack_name_assange)
1959
+ bburago_hostname = get_route53_hostname(stack_name_bburago)
1960
+ borat_hostname = get_route53_hostname(stack_name_borat)
1961
+ ermes_hostname = get_route53_hostname(stack_name_ermes)
1962
+ fidaty_hostname = get_route53_hostname(stack_name_fidaty)
1963
+ hal9000_hostname = get_route53_hostname(stack_name_hal9000)
1964
+ prima_hostname = get_route53_hostname(stack_name_web)
1965
+ peano_hostname = get_route53_hostname(stack_name_peano)
1966
+ skynet_hostname = get_route53_hostname(stack_name_skynet)
1967
+ urania_hostname = get_route53_hostname(stack_name_urania)
1968
+ roger_hostname = get_route53_hostname(stack_name_roger)
1969
+ leftorium_hostname = get_route53_hostname(stack_name_leftorium)
1970
+ rachele_hostname = get_route53_hostname(stack_name_rachele)
1971
+ crash_hostname = get_route53_hostname(stack_name_crash) unless !deploy_crash?
1972
+ starsky_hostname = get_route53_hostname(stack_name_starsky) unless !deploy_starsky_hutch?
1973
+ hutch_hostname = get_route53_hostname(stack_name_hutch) unless !deploy_starsky_hutch?
1974
+
1975
+ # launch_marley ec2_ip_address(asg_stack_name), prima_hostname, borat_hostname
1976
+
1977
+ projects_text = "
1978
+ > Prima url: https://#{prima_hostname}
1979
+ > Backoffice (Borat) url: https://#{borat_hostname}
1980
+ > Urania url: http://#{urania_hostname}:81
1981
+ > Bburago url: http://#{bburago_hostname}:83
1982
+ > Ermes url: http://#{ermes_hostname}:10002
1983
+ > Hal9000 url: http://#{hal9000_hostname}:10031
1984
+ > Fidaty url: http://#{fidaty_hostname}:10021
1985
+ > Peano url: http://#{peano_hostname}:10039
1986
+ > Assange url: https://#{assange_hostname}
1987
+ > Activia url: http://#{activia_hostname}:10041
1988
+ > Skynet url: http://#{skynet_hostname}:8050
1989
+ > Roger url: http://#{roger_hostname}:10051
1990
+ > Leftorium url: http://#{leftorium_hostname}:10061
1991
+ > Rachele url: http://#{rachele_hostname}:10040"
1992
+ projects_text.concat "
1993
+ > Crash url: https://#{crash_hostname}" if deploy_crash?
1994
+ projects_text.concat "
1995
+ > Starsky url: https://#{starsky_hostname}
1996
+ > Hutch url: https://#{hutch_hostname}" if deploy_starsky_hutch?
1997
+ projects_text.concat "
1998
+ > RabbitMQ url: http://#{ec2_ip_address(asg_stack_name)}:15672
1999
+ > Supervisor url: http://#{ec2_ip_address(asg_stack_name)}:9001
2000
+ > Elasticsearch url: http://#{ec2_ip_address(asg_stack_name)}:9200
2001
+ > SSH connection: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no githubUsername@#{ec2_ip_address(asg_stack_name)}\n"
2002
+ output projects_text.cyan
2003
+ output "Deploy effettuato, everything is awesome!\n".green
2004
+
2005
+ qainit_write_output(projects_text, 'Indirizzi scritti su ')
2006
+ end
2007
+
2008
+ def get_route53_hostname(stack_name)
2009
+ case
2010
+ when stack_name.include?('web')
2011
+ host = "www-#{@dns_record_identifier}.qa.colaster.com"
2012
+ when stack_name.include?('urania')
2013
+ host = "urania-#{@dns_record_identifier}.qa.colaster.com"
2014
+ when stack_name.include?('bburago')
2015
+ host = "bburago-#{@dns_record_identifier}.qa.colaster.com"
2016
+ when stack_name.include?('hal9000')
2017
+ host = "hal9000-#{@dns_record_identifier}.qa.colaster.com"
2018
+ when stack_name.include?('fidaty')
2019
+ host = "fidaty-#{@dns_record_identifier}.qa.colaster.com"
2020
+ when stack_name.include?('peano')
2021
+ host = "peano-#{@dns_record_identifier}.qa.colaster.com"
2022
+ when stack_name.include?('assange')
2023
+ host = "assange-#{@dns_record_identifier}.qa.colaster.com"
2024
+ when stack_name.include?('borat')
2025
+ host = "backoffice-#{@dns_record_identifier}.qa.colaster.com"
2026
+ when stack_name.include?('crash')
2027
+ host = "crash-#{@dns_record_identifier}.qa.colaster.com"
2028
+ when stack_name.include?('ermes')
2029
+ host = "ermes-#{@dns_record_identifier}.qa.colaster.com"
2030
+ when stack_name.include?('activia')
2031
+ host = "activia-#{@dns_record_identifier}.qa.colaster.com"
2032
+ when stack_name.include?('skynet')
2033
+ host = "skynet-#{@dns_record_identifier}.qa.colaster.com"
2034
+ when stack_name.include?('roger')
2035
+ host = "roger-#{@dns_record_identifier}.qa.colaster.com"
2036
+ when stack_name.include?('leftorium')
2037
+ host = "leftorium-#{@dns_record_identifier}.qa.colaster.com"
2038
+ when stack_name.include?('rachele')
2039
+ host = "rachele-#{@dns_record_identifier}.qa.colaster.com"
2040
+ when stack_name.include?('starsky')
2041
+ host = "starsky-#{@dns_record_identifier}.qa.colaster.com"
2042
+ when stack_name.include?('hutch')
2043
+ host = "hutch-#{@dns_record_identifier}.qa.colaster.com"
2044
+ end
2045
+ host
2046
+ end
2047
+
2048
+ def ec2_ip_address(asg_stack_name)
2049
+ resp = @cf.describe_stack_resource({
2050
+ stack_name: asg_stack_name,
2051
+ logical_resource_id: 'ECSAutoScalingGroup'
2052
+ })
2053
+ resp = @asg.describe_auto_scaling_groups({
2054
+ auto_scaling_group_names: [resp.stack_resource_detail.physical_resource_id],
2055
+ max_records: 1
2056
+ })
2057
+ instance_id = resp.auto_scaling_groups[0].instances[0].instance_id
2058
+ resp = @ec2.describe_instances({instance_ids: [instance_id]})
2059
+ resp.reservations[0].instances[0].private_ip_address
2060
+ end
2061
+
612
2062
  def get_alb_host(stack_name)
613
2063
  case
614
2064
  when stack_name.include?('web')
@@ -649,35 +2099,868 @@ class Release
649
2099
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
650
2100
  when stack_name.include?('hutch')
651
2101
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
652
- when stack_name.include?('maia')
653
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
654
- when stack_name.include?('legion')
655
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
656
2102
  end
657
- resp = describe_stack_resource(stack_name, logical_resource_id)
658
- resp = describe_load_balancers([resp.stack_resource_detail.physical_resource_id])
2103
+ resp = @cf.describe_stack_resource({
2104
+ stack_name: stack_name,
2105
+ logical_resource_id: logical_resource_id
2106
+ })
2107
+ resp = @alb.describe_load_balancers({
2108
+ load_balancer_arns: [resp.stack_resource_detail.physical_resource_id]
2109
+ })
659
2110
  resp.load_balancers[0].dns_name
660
2111
  end
661
2112
 
2113
+ def update_service_defaults(stack_name)
2114
+ case
2115
+ when stack_name.include?('web')
2116
+ logical_resource_id = 'ECSServiceWebQA'
2117
+ when stack_name.include?('consumer')
2118
+ logical_resource_id = 'ECSServiceConsumerQa'
2119
+ when stack_name.include?('urania')
2120
+ logical_resource_id = 'ECSServiceUraniaQA'
2121
+ when stack_name.include?('backoffice')
2122
+ logical_resource_id = 'ECSServiceBackoffice'
2123
+ when stack_name.include?('ermes')
2124
+ logical_resource_id = 'ECSServiceErmesQA'
2125
+ when stack_name.include?('bburago')
2126
+ logical_resource_id = 'ECSServiceBburagoQA'
2127
+ when stack_name.include?('hal9000')
2128
+ logical_resource_id = 'ECSServiceHal9000QA'
2129
+ when stack_name.include?('fidaty')
2130
+ logical_resource_id = 'ECSServiceFidatyQA'
2131
+ when stack_name.include?('skynet')
2132
+ logical_resource_id = 'ECSServiceSkynetQA'
2133
+ when stack_name.include?('roger')
2134
+ logical_resource_id = 'ECSServiceRogerQA'
2135
+ when stack_name.include?('activia')
2136
+ logical_resource_id = 'ECSServiceActiviaQA'
2137
+ when stack_name.include?('peano')
2138
+ logical_resource_id = 'ECSServicePeanoQA'
2139
+ when stack_name.include?('rogoreport')
2140
+ logical_resource_id = 'ECSServiceRogoreport'
2141
+ when stack_name.include?('assange')
2142
+ logical_resource_id = 'ECSServiceAssangeQA'
2143
+ when stack_name.include?('borat')
2144
+ logical_resource_id = 'ECSServiceBorat'
2145
+ when stack_name.include?('leftorium')
2146
+ logical_resource_id = 'ECSServiceLeftoriumQA'
2147
+ when stack_name.include?('rachele')
2148
+ logical_resource_id = 'ECSServiceRacheleQA'
2149
+ when stack_name.include?('crash')
2150
+ logical_resource_id = 'ECSServiceCrashQA'
2151
+ when stack_name.include?('starsky')
2152
+ logical_resource_id = 'ECSServiceStarskyQA'
2153
+ when stack_name.include?('hutch')
2154
+ logical_resource_id = 'ECSServiceHutch'
2155
+ else
2156
+ raise "Service name non gestito per lo stack #{stack_name}"
2157
+ end
2158
+ resp = @cf.describe_stack_resource(
2159
+ stack_name: stack_name,
2160
+ logical_resource_id: logical_resource_id
2161
+ )
2162
+ @ecs.update_service(
2163
+ cluster: @ecs_cluster_name,
2164
+ service: resp.stack_resource_detail.physical_resource_id,
2165
+ deployment_configuration: {
2166
+ minimum_healthy_percent: 0,
2167
+ maximum_percent: 100
2168
+ }
2169
+ )
2170
+ end
2171
+
2172
+ def create_activia_artifact(revision)
2173
+ output "Preparo l'artifact activia .zip\n".yellow
2174
+
2175
+ git_checkout_version('activia', revision)
2176
+
2177
+ Dir.chdir 'projects/activia'
2178
+
2179
+ decrypt_secrets()
2180
+
2181
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2182
+ exec_step 'prepare-docker-compose --directory activia && cp docker-compose-qainit.yml docker-compose.yml'
2183
+ [
2184
+ "docker-compose build web",
2185
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2186
+ '-c' 'mix local.hex --force && mix hex.info && \
2187
+ mix deps.get && mix compile && mix deps.compile && \
2188
+ cd assets && \
2189
+ rm -rf node_modules && \
2190
+ yarn --cache-folder ~/.cache/yarn && \
2191
+ sysconfcpus -n 2 ./node_modules/.bin/webpack --mode production && \
2192
+ cd .. && \
2193
+ mix phx.digest && \
2194
+ rm -rf _build/qa/rel/ && \
2195
+ mix release --env=qa'"
2196
+ ].each do |cmd|
2197
+ execute_command cmd
2198
+ end
2199
+
2200
+ cleanup_containers
2201
+
2202
+ artifact_path = Dir.glob("_build/qa/rel/activia/releases/*/activia.tar.gz").first
2203
+
2204
+ upload_artifact(artifact_path, "microservices/activia/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2205
+
2206
+ Dir.chdir '../../'
2207
+ end
2208
+
2209
+ def create_assange_artifact(revision)
2210
+ output "Preparo l'artifact assange .zip\n".yellow
2211
+
2212
+ git_checkout_version('assange', revision)
2213
+
2214
+ Dir.chdir 'projects/assange'
2215
+
2216
+ decrypt_secrets()
2217
+
2218
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2219
+ exec_step 'prepare-docker-compose --directory assange && cp docker-compose-qainit.yml docker-compose.yml'
2220
+ [
2221
+ "docker-compose build web",
2222
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2223
+ '-c' 'mix local.hex --force && mix hex.info && \
2224
+ mix deps.get && mix compile && mix deps.compile && \
2225
+ mix phx.digest && \
2226
+ rm -rf _build/qa/rel/ && \
2227
+ mix release --env=qa'"
2228
+ ].each do |cmd|
2229
+ execute_command cmd
2230
+ end
2231
+
2232
+ cleanup_containers
2233
+
2234
+ artifact_path = Dir.glob("_build/qa/rel/assange/releases/*/assange.tar.gz").first
2235
+ upload_artifact(artifact_path, "microservices/assange/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2236
+
2237
+ Dir.chdir '../../'
2238
+ end
2239
+
2240
+ def create_bburago_artifact(revision)
2241
+ output "Preparo l'artifact bburago .zip\n".yellow
2242
+
2243
+ git_checkout_version('bburago', revision)
2244
+
2245
+ Dir.chdir 'projects/bburago'
2246
+
2247
+ decrypt_secrets()
2248
+
2249
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2250
+ exec_step 'prepare-docker-compose --directory bburago && cp docker-compose-qainit.yml docker-compose.yml'
2251
+ [
2252
+ "docker-compose build web",
2253
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint deploy/create_qa_artifact web"
2254
+ ].each do |cmd|
2255
+ execute_command cmd
2256
+ end
2257
+
2258
+ cleanup_containers
2259
+
2260
+ artifact_path = Dir.glob('_build/qa/rel/bburago/releases/*/bburago.tar.gz').first
2261
+ upload_artifact(artifact_path, "microservices/bburago/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2262
+
2263
+ Dir.chdir '../../'
2264
+ end
2265
+
2266
+ def create_borat_artifact(revision)
2267
+ output "Preparo l'artifact borat .zip\n".yellow
2268
+
2269
+ git_checkout_version('borat', revision)
2270
+
2271
+ Dir.chdir 'projects/borat'
2272
+
2273
+ decrypt_secrets()
2274
+
2275
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2276
+ exec_step 'prepare-docker-compose --directory borat && cp docker-compose-qainit.yml docker-compose.yml'
2277
+ [
2278
+ "docker network create borat_network || true",
2279
+ "docker-compose build web",
2280
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2281
+ '-c' 'mix local.hex --force && mix hex.info && \
2282
+ mix deps.get && \
2283
+ cd assets && \
2284
+ yarn --cache-folder ~/.cache/yarn && \
2285
+ sysconfcpus -n 2 ./node_modules/.bin/webpack -p --config config/webpack.config.prod.js && \
2286
+ cd ../ && \
2287
+ mix phx.digest && \
2288
+ mix compile && mix deps.compile && \
2289
+ rm -rf _build/qa/rel/ && \
2290
+ mix distillery.release --env=qa'"
2291
+ ].each do |cmd|
2292
+ execute_command cmd
2293
+ end
2294
+
2295
+ cleanup_containers
2296
+
2297
+ artifact_path = Dir.glob("_build/qa/rel/borat/releases/*/borat.tar.gz").first
2298
+ upload_artifact(artifact_path, "microservices/borat/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2299
+
2300
+ Dir.chdir '../../'
2301
+ end
2302
+
2303
+ def create_crash_artifact(revision, deploy_id)
2304
+ output "Preparo l'artifact crash .zip\n".yellow
2305
+
2306
+ git_checkout_version('crash', revision)
2307
+
2308
+ Dir.chdir 'projects/crash'
2309
+
2310
+ crash_qa_host = get_route53_hostname('ecs-task-crash-qa-notneeded')
2311
+
2312
+ decrypt_secrets()
2313
+
2314
+ `mv docker-compose-ci.yml docker-compose.yml`
2315
+ exec_step 'prepare-docker-compose --directory crash && cp docker-compose-qainit.yml docker-compose.yml'
2316
+
2317
+ if File.exists? 'deploy/build_qa_artifact'
2318
+ `deploy/build_qa_artifact #{deploy_id}`
2319
+ else # TODO remove when deploy/build_qa_artifact is merged
2320
+ [
2321
+ 'docker-compose build web',
2322
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa -e ENV_HASH=#{deploy_id} web \
2323
+ '-c' 'mix local.hex --force && mix hex.info && \
2324
+ mix deps.get && \
2325
+ cd assets && \
2326
+ yarn --cache-folder ~/.cache/yarn && \
2327
+ NODE_ENV=production sysconfcpus -n 1 yarn run build && \
2328
+ cd ../ && \
2329
+ mix release.clean --implode --no-confirm && \
2330
+ mix phx.digest && \
2331
+ mix deps.clean --all && \
2332
+ mix deps.get && \
2333
+ mix compile && mix release --env=qa'",
2334
+ 'docker-compose down'
2335
+ ].each do |cmd|
2336
+ execute_command cmd
2337
+ end
2338
+ end
2339
+
2340
+ cleanup_containers
2341
+
2342
+ artifact_path = Dir.glob('_build/qa/rel/crash/releases/*/crash.tar.gz').first
2343
+ upload_artifact(artifact_path, "microservices/crash/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2344
+
2345
+ Dir.chdir '../../'
2346
+ end
2347
+
2348
+ def create_ermes_artifact(revision)
2349
+ output "Preparo l'artifact ermes .zip\n".yellow
2350
+
2351
+ git_checkout_version('ermes', revision)
2352
+
2353
+ Dir.chdir 'projects/ermes'
2354
+
2355
+ decrypt_secrets()
2356
+
2357
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2358
+ exec_step 'prepare-docker-compose --directory ermes && cp docker-compose-qainit.yml docker-compose.yml'
2359
+
2360
+ [
2361
+ "if echo `docker network ls` | grep crash_default; \
2362
+ then echo 'crash_default network already existing'; \
2363
+ else docker network create crash_default; fi",
2364
+ 'docker-compose build web'
2365
+ ].each do |cmd|
2366
+ execute_command cmd
2367
+ end
2368
+
2369
+ [ "docker-compose run --rm -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2370
+ '-c' 'mix local.hex --force && mix hex.info && \
2371
+ mix deps.get && mix compile && mix deps.compile && \
2372
+ mix phx.digest && \
2373
+ MIX_ENV=dev mix compile.sms && \
2374
+ MIX_ENV=dev mix compile.html && \
2375
+ MIX_ENV=dev mix compile.heml && \
2376
+ MIX_ENV=dev mix compile.app_notification && \
2377
+ rm -rf _build/qa/rel/ && \
2378
+ mix release --env=qa'"
2379
+ ].each do |cmd|
2380
+ execute_command cmd
2381
+ end
2382
+
2383
+ cleanup_containers
2384
+
2385
+ artifact_path = Dir.glob("_build/qa/rel/ermes/releases/*/ermes.tar.gz").first
2386
+ upload_artifact(artifact_path, "microservices/ermes/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2387
+
2388
+ Dir.chdir '../../'
2389
+ end
2390
+
2391
+ def create_fidaty_artifact(revision)
2392
+ output "Preparo l'artifact fidaty .zip\n".yellow
2393
+
2394
+ git_checkout_version('fidaty', revision)
2395
+
2396
+ Dir.chdir 'projects/fidaty'
2397
+
2398
+ decrypt_secrets()
2399
+
2400
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2401
+ exec_step 'prepare-docker-compose --directory fidaty && cp docker-compose-qainit.yml docker-compose.yml'
2402
+ [
2403
+ "docker-compose build web",
2404
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2405
+ '-c' 'mix local.hex --force && mix hex.info && \
2406
+ mix deps.get && mix compile && mix deps.compile && \
2407
+ mix phx.digest && \
2408
+ rm -rf _build/qa/rel/ && \
2409
+ mix release --env=qa'"
2410
+ ].each do |cmd|
2411
+ execute_command cmd
2412
+ end
2413
+
2414
+ cleanup_containers
2415
+
2416
+ artifact_path = Dir.glob("_build/qa/rel/fidaty/releases/*/fidaty.tar.gz").first
2417
+ upload_artifact(artifact_path, "microservices/fidaty/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2418
+
2419
+ Dir.chdir '../../'
2420
+ end
2421
+
2422
+ def create_hal9000_artifact(revision)
2423
+ output "Preparo l'artifact hal9000 .zip\n".yellow
2424
+
2425
+ git_checkout_version('hal9000', revision)
2426
+
2427
+ Dir.chdir 'projects/hal9000'
2428
+
2429
+ decrypt_secrets()
2430
+
2431
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2432
+ exec_step 'prepare-docker-compose --directory hal9000 && cp docker-compose-qainit.yml docker-compose.yml'
2433
+ [
2434
+ "docker-compose build web",
2435
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2436
+ '-c' 'mix local.hex --force && mix hex.info && \
2437
+ mix deps.get && mix compile && mix deps.compile && \
2438
+ mix phx.digest assets -o priv/static && \
2439
+ rm -rf _build/qa/rel/ && \
2440
+ mix release --env=qa'"
2441
+ ].each do |cmd|
2442
+ execute_command cmd
2443
+ end
2444
+
2445
+ cleanup_containers
2446
+
2447
+ artifact_path = Dir.glob("_build/qa/rel/hal9000/releases/*/hal9000.tar.gz").first
2448
+ upload_artifact(artifact_path, "microservices/hal9000/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2449
+
2450
+ Dir.chdir '../../'
2451
+ end
2452
+
2453
+ def create_hutch_artifact(revision)
2454
+ output "Preparo l'artifact hutch\n".yellow
2455
+
2456
+ git_checkout_version('hutch', revision)
2457
+
2458
+ Dir.chdir 'projects/hutch'
2459
+
2460
+ version = `git rev-parse HEAD`
2461
+
2462
+ decrypt_secrets() unless File.exist?('config/secrets.yml')
2463
+
2464
+ exec_step 'git submodule update'
2465
+ exec_step 'cp docker-compose-ci.yml docker-compose.yml'
2466
+ exec_step 'prepare-docker-compose --directory hutch && cp docker-compose-qainit.yml docker-compose.yml'
2467
+ exec_step "sed s/qa_deploy_id/#{get_deploy_id}/ .env.dist.qa"
2468
+ exec_step "cp .env.dist.qa .env"
2469
+ exec_step "rm -fr peano"
2470
+
2471
+ [
2472
+ "sed -i 's/USER app/USER root/g' Dockerfile",
2473
+ "docker-compose build web",
2474
+ "docker-compose run -w $PWD -u root -e ELM_APP_STARSKY_URL=https://#{get_route53_hostname("starsky")} --entrypoint /bin/sh web \
2475
+ '-c' 'yarn && yarn run build \
2476
+ && tar cfz #{revision}-qa.tar.gz *'"
2477
+ ].each do |cmd|
2478
+ execute_command cmd
2479
+ end
2480
+
2481
+ artifact_path = "./#{revision}-qa.tar.gz"
2482
+
2483
+ upload_artifact(artifact_path, "microservices/hutch/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2484
+
2485
+ Dir.chdir '../../'
2486
+ end
2487
+
2488
+ def create_leftorium_artifact(revision)
2489
+ output "Preparo l'artifact leftorium .zip\n".yellow
2490
+
2491
+ git_checkout_version('leftorium', revision)
2492
+
2493
+ Dir.chdir 'projects/leftorium'
2494
+
2495
+ decrypt_secrets()
2496
+
2497
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2498
+ exec_step 'prepare-docker-compose --directory leftorium && cp docker-compose-qainit.yml docker-compose.yml'
2499
+ [
2500
+ "docker-compose build web",
2501
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2502
+ '-c' 'mix local.hex --force && mix hex.info && \
2503
+ mix deps.get && mix compile && mix deps.compile && \
2504
+ rm -rf _build/qa/rel/ && \
2505
+ mix release --env=qa'"
2506
+ ].each do |cmd|
2507
+ execute_command cmd
2508
+ end
2509
+
2510
+ cleanup_containers
2511
+
2512
+ artifact_path = Dir.glob('_build/qa/rel/leftorium/releases/*/leftorium.tar.gz').first
2513
+ upload_artifact(artifact_path, "microservices/leftorium/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2514
+
2515
+ Dir.chdir '../../'
2516
+ end
2517
+
2518
+ def create_peano_artifact(revision)
2519
+ output "Preparo l'artifact peano .zip\n".yellow
2520
+
2521
+ git_checkout_version('peano', revision)
2522
+
2523
+ Dir.chdir 'projects/peano'
2524
+
2525
+ decrypt_secrets() unless File.exist?('config/secrets.yml')
2526
+
2527
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2528
+ exec_step 'prepare-docker-compose --directory peano && cp docker-compose-qainit.yml docker-compose.yml'
2529
+
2530
+ if File.exists? 'deploy/build_qa_artifact'
2531
+ `deploy/build_qa_artifact`
2532
+ else # TODO remove when deploy/build_qa_artifact is merged
2533
+ [
2534
+ "docker-compose build web",
2535
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2536
+ '-c' 'mix local.hex --force && mix hex.info && \
2537
+ mix deps.get && mix compile && mix deps.compile && \
2538
+ rm -rf _build/qa/rel/ && \
2539
+ mix release --env=qa'"
2540
+ ].each do |cmd|
2541
+ execute_command cmd
2542
+ end
2543
+ end
2544
+
2545
+ cleanup_containers
2546
+
2547
+ artifact_path = Dir.glob("_build/qa/rel/peano/releases/*/peano.tar.gz").first
2548
+ upload_artifact(artifact_path, "microservices/peano/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2549
+
2550
+ Dir.chdir '../../'
2551
+ end
2552
+
2553
+ def create_prima_artifact(revision, branch_name, deploy_id, minimal = false)
2554
+ output "Preparo l'artifact prima .zip\n".yellow
2555
+
2556
+ git_checkout_version('prima', revision)
2557
+
2558
+ Dir.chdir 'projects/prima'
2559
+
2560
+ ['vendor'].each do |dir|
2561
+ unless File.directory?(dir)
2562
+ if File.directory?("../../../prima/#{dir}")
2563
+ exec_step "rsync -a ../../../prima/#{dir} ."
2564
+ end
2565
+ end
2566
+ end
2567
+
2568
+ exec_step 'mv docker-compose-ci.yml docker-compose.yml'
2569
+ exec_step 'prepare-docker-compose --directory prima'
2570
+ exec_step 'sed -i "s/\\/home\\/app/\\/root/g" docker-compose.yml'
2571
+ `sed -i 's/"@prima-assicurazioni/pyxis-npm": ".*",/"@prima-assicurazioni/pyxis-npm": "#{@pyxis_version}",/' package.json` if deploy_pyxis?
2572
+ [
2573
+ "bin/qa_build_artifact.sh #{branch_name} #{'update' if @deploy_update}"
2574
+ ].each do |cmd|
2575
+ execute_command cmd
2576
+ end
2577
+
2578
+ cleanup_containers
2579
+
2580
+ Dir.chdir "../../"
2581
+ end
2582
+
2583
+ def create_pyxis_artifact(revision, deploy_id)
2584
+ if (deploy_pyxis?)
2585
+ output "Preparo l'artifact pyxis\n".yellow
2586
+
2587
+ git_checkout_version('pyxis-npm', revision)
2588
+
2589
+ Dir.chdir 'projects/pyxis-npm'
2590
+
2591
+ decrypt_secrets()
2592
+
2593
+ exec_step 'mv .fakenpmrc .npmrc'
2594
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2595
+ exec_step 'prepare-docker-compose --directory pyxis-npm && cp docker-compose-qainit.yml docker-compose.yml'
2596
+ exec_step 'docker-compose build web'
2597
+
2598
+ exec_step "docker-compose run -w $PWD -u root -e NPM_TOKEN=$NPM_TOKEN --entrypoint /bin/sh web \
2599
+ '-c' 'npm view prima-assicurazioni/pyxis-npm versions --json > versions.json'" # posso recuperare le versioni pubblicate solo da dentro al container, scrivo su un file che leggo subito dopo
2600
+ published_versions = `cat versions.json`
2601
+ qa_versions = JSON.parse(published_versions).select{ |version| version.include? get_pyxis_version(deploy_id) }
2602
+
2603
+ @pyxis_version = "0.#{get_pyxis_version(deploy_id)}.#{qa_versions.size}"
2604
+
2605
+ `sed -i '3s/".*/"version": "#{@pyxis_version}",/' package.json`
2606
+ [
2607
+ "docker-compose run -w $PWD -u root -e NPM_TOKEN=$NPM_TOKEN --entrypoint /bin/sh web \
2608
+ '-c' 'yarn install && \
2609
+ yarn build:prod && \
2610
+ npm publish'"
2611
+ ].each do |cmd|
2612
+ execute_command cmd
2613
+ end
2614
+
2615
+ cleanup_containers
2616
+ Dir.chdir '../../'
2617
+ end
2618
+ end
2619
+
2620
+ def create_rachele_artifact(revision)
2621
+ output "Preparo l'artifact rachele .zip\n".yellow
2622
+
2623
+ git_checkout_version('rachele', revision)
2624
+
2625
+ Dir.chdir 'projects/rachele'
2626
+
2627
+ decrypt_secrets()
2628
+
2629
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2630
+ exec_step 'prepare-docker-compose --directory rachele && cp docker-compose-qainit.yml docker-compose.yml'
2631
+
2632
+ execute_command "docker-compose build web"
2633
+
2634
+ [ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2635
+ '-c' 'mix local.hex --force && mix hex.info && \
2636
+ mix deps.get && mix compile && mix deps.compile && \
2637
+ rm -rf _build/qa/rel/ && \
2638
+ mix release --env=qa'"
2639
+ ].each do |cmd|
2640
+ execute_command cmd
2641
+ end
2642
+
2643
+ cleanup_containers
2644
+
2645
+ artifact_path = Dir.glob("_build/qa/rel/rachele/releases/*/rachele.tar.gz").first
2646
+ upload_artifact(artifact_path, "microservices/rachele/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2647
+
2648
+ Dir.chdir '../../'
2649
+ end
2650
+
2651
+ def create_roger_artifact(revision)
2652
+ output "Preparo l'artifact roger .zip\n".yellow
2653
+
2654
+ git_checkout_version('roger', revision)
2655
+
2656
+ Dir.chdir 'projects/roger'
2657
+
2658
+ decrypt_secrets()
2659
+
2660
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2661
+ exec_step 'prepare-docker-compose --directory roger && cp docker-compose-qainit.yml docker-compose.yml'
2662
+ [
2663
+ "docker-compose build web",
2664
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2665
+ '-c' 'mix local.hex --force && mix hex.info && \
2666
+ mix deps.get && mix compile && mix deps.compile && \
2667
+ mix phx.digest && \
2668
+ rm -rf _build/qa/rel/ && \
2669
+ mix distillery.release --env=qa'"
2670
+ ].each do |cmd|
2671
+ execute_command cmd
2672
+ end
2673
+
2674
+ cleanup_containers
2675
+
2676
+ artifact_path = Dir.glob("_build/qa/rel/roger/releases/*/roger.tar.gz").first
2677
+ upload_artifact(artifact_path, "microservices/roger/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2678
+
2679
+ Dir.chdir '../../'
2680
+ end
2681
+
2682
+ def create_rogoreport_artifact(revision)
2683
+ output "Preparo l'artifact rogoreport .zip\n".yellow
2684
+
2685
+ git_checkout_version('rogoreport', revision)
2686
+
2687
+ Dir.chdir 'projects/rogoreport'
2688
+
2689
+ decrypt_secrets() unless File.exist?('config/secrets.yml')
2690
+
2691
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2692
+ exec_step 'prepare-docker-compose --directory rogoreport && cp docker-compose-qainit.yml docker-compose.yml'
2693
+ [
2694
+ "docker-compose build web",
2695
+ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2696
+ '-c' 'mix local.hex --force && mix hex.info && \
2697
+ mix deps.get && mix compile && mix deps.compile && \
2698
+ rm -rf _build/qa/rel/ && \
2699
+ mix release --name=rogoreport --env=qa'"
2700
+ ].each do |cmd|
2701
+ execute_command cmd
2702
+ end
2703
+
2704
+ cleanup_containers
2705
+
2706
+ artifact_path = Dir.glob("_build/qa/rel/rogoreport/releases/*/rogoreport.tar.gz").first
2707
+ upload_artifact(artifact_path, "microservices/rogoreport/rogoreport-#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2708
+
2709
+ Dir.chdir '../../'
2710
+ end
2711
+
2712
+ def create_skynet_artifact(revision)
2713
+ output "Preparo l'artifact skynet\n".yellow
2714
+
2715
+ git_checkout_version('skynet', revision)
2716
+
2717
+ Dir.chdir 'projects/skynet'
2718
+
2719
+ version = `git rev-parse HEAD`
2720
+
2721
+ artifact_path = "/tmp/skynet-#{revision}-qa.tar.gz"
2722
+
2723
+ exec_step "tar cfz #{artifact_path} core config oracles pickles web tests logstash application_log configuration.py wsgi.py requirements.txt requirements_training.txt"
2724
+
2725
+ upload_artifact(artifact_path, "microservices/skynet/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2726
+
2727
+ Dir.chdir '../../'
2728
+ end
2729
+
2730
+ def create_starsky_artifact(revision)
2731
+ output "Preparo l'artifact starsky\n".yellow
2732
+
2733
+ git_checkout_version('starsky', revision)
2734
+
2735
+ Dir.chdir 'projects/starsky'
2736
+
2737
+ version = `git rev-parse HEAD`
2738
+
2739
+ #artifact_path = "/tmp/starsky-#{revision}-qa.tar.gz"
2740
+
2741
+ decrypt_secrets() unless File.exist?('config/secrets.yml')
2742
+
2743
+ `mv docker-compose-ci.yml docker-compose.yml`
2744
+ exec_step 'prepare-docker-compose --directory starsky && cp docker-compose-qainit.yml docker-compose.yml'
2745
+ exec_step "sed s/qa_deploy_id/#{get_deploy_id}/ .env.dist.qa"
2746
+ exec_step "cp .env.dist.qa .env"
2747
+
2748
+ [
2749
+ "sed -i 's/USER app/USER root/g' Dockerfile",
2750
+ "if echo `docker network ls` | grep peano_default; \
2751
+ then echo 'peano_default network already existing'; \
2752
+ else docker network create peano_default; fi",
2753
+ "docker-compose build web",
2754
+ "docker-compose run -w $PWD -e BUILD_ENV=qa -u root --entrypoint /bin/sh web \
2755
+ '-c' 'cargo build --release -vv --features=qa \
2756
+ && cargo build --bin migrate --release --features=qa \
2757
+ && cargo build --bin rabbit_worker --release --features=qa \
2758
+ && cp -p target/release/starsky . \
2759
+ && cp -p target/release/migrate . \
2760
+ && cp -p target/release/rabbit_worker . \
2761
+ && tar cfz #{revision}-qa.tar.gz config starsky migrate rabbit_worker .env.dist.*'"
2762
+ ].each do |cmd|
2763
+ execute_command cmd
2764
+ end
2765
+
2766
+ artifact_path = "./#{revision}-qa.tar.gz"
2767
+
2768
+ upload_artifact(artifact_path, "microservices/starsky/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2769
+
2770
+ Dir.chdir '../../'
2771
+ end
2772
+
2773
+ def create_urania_artifact(revision)
2774
+ output "Preparo l'artifact urania .zip\n".yellow
2775
+
2776
+ git_checkout_version('urania', revision)
2777
+
2778
+ Dir.chdir 'projects/urania'
2779
+
2780
+ decrypt_secrets()
2781
+
2782
+ exec_step 'cp docker-compose.yml docker-compose-ci.yml'
2783
+ exec_step 'prepare-docker-compose --directory urania && cp docker-compose-qainit.yml docker-compose.yml'
2784
+
2785
+ execute_command "docker-compose build web"
2786
+
2787
+ [ "docker-compose run -w $PWD -u root -e MIX_ENV=qa --entrypoint /bin/sh web \
2788
+ '-c' 'mix local.hex --force && mix hex.info && \
2789
+ mix deps.get && mix compile && mix deps.compile && \
2790
+ rm -rf _build/qa/rel/ && \
2791
+ mix release --env=qa'"
2792
+ ].each do |cmd|
2793
+ execute_command cmd
2794
+ end
2795
+
2796
+ cleanup_containers
2797
+
2798
+ artifact_path = Dir.glob("_build/qa/rel/urania/releases/*/urania.tar.gz").first
2799
+ upload_artifact(artifact_path, "microservices/urania/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
2800
+
2801
+ Dir.chdir '../../'
2802
+ end
2803
+
662
2804
  def deploy_pyxis?
663
2805
  if defined? @deploy_pyxis
664
2806
  @deploy_pyxis
665
2807
  else
666
2808
  pyxis_updated = `git log -p -1 --unified=0 | grep pyxis-npm:`.length > 0
667
2809
 
668
- update_pyxis = !@projects['pyxis-npm'].empty? && @projects['pyxis-npm']['name'] != 'master' && pyxis_updated
2810
+ update_pyxis = !@projects['pyxis-npm'].empty? && @projects['pyxis-npm'][:name] != 'master' && pyxis_updated
669
2811
 
670
2812
  @deploy_pyxis = update_pyxis
671
2813
  return update_pyxis
672
2814
  end
673
2815
  end
674
2816
 
2817
+ def deploy_crash?
2818
+ crash_present = !@projects['crash'].empty? && @projects['crash'][:name] != 'master' && !@projects['crash'][:default_branch]
2819
+ leftorium_present = !@projects['leftorium'].empty? && @projects['leftorium'][:name] != 'master' && !@projects['leftorium'][:default_branch]
2820
+ crash_present || leftorium_present
2821
+ end
2822
+
2823
+ def deploy_starsky_hutch?
2824
+ starsky_present = !@projects['starsky'].nil? && !@projects['starsky'].empty? && @projects['starsky'][:name] != 'master' && !@projects['starsky'][:default_branch]
2825
+ hutch_present = !@projects['hutch'].nil? && !@projects['hutch'].empty? && @projects['hutch'][:name] != 'master' && !@projects['hutch'][:default_branch]
2826
+ starsky_present || hutch_present
2827
+ end
2828
+
2829
+ def get_pyxis_version(deploy_id)
2830
+ (deploy_id.delete '[a-z0]')[0..9]
2831
+ end
2832
+
2833
+ def cleanup_containers
2834
+ `docker-compose kill && docker-compose down -v --remove-orphans`
2835
+ `docker rm $(docker ps -q -f status=exited)`
2836
+ end
2837
+
2838
+ def git_checkout_version(project, revision)
2839
+ Dir.chdir "projects/#{project}"
2840
+ exec_step "git checkout -- . && git checkout #{revision}"
2841
+ Dir.chdir "../../"
2842
+ end
2843
+
2844
+ def create_asg_stack(stack_name, tags = [])
2845
+ stack_body = IO.read('cloudformation/stacks/asg/ecs-asg-allinone.yml')
2846
+ parameters = [
2847
+ {
2848
+ parameter_key: "Environment",
2849
+ parameter_value: "qa"
2850
+ },
2851
+ {
2852
+ parameter_key: "InstanceType",
2853
+ parameter_value: "t3.large"
2854
+ },
2855
+ {
2856
+ parameter_key: "ECSClusterName",
2857
+ parameter_value: @ecs_cluster_name
2858
+ },
2859
+ {
2860
+ parameter_key: "AMIID",
2861
+ parameter_value: @ami_id
2862
+ }
2863
+ ]
2864
+ create_stack(stack_name, stack_body, parameters, tags, @cf_role)
2865
+ end
2866
+
2867
+ def create_cluster_stack(stack_name, tags = [])
2868
+ stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
2869
+ create_stack(stack_name, stack_body, [], tags)
2870
+ end
2871
+
675
2872
  def update_cluster_stack(stack_name, tags = [])
676
2873
  stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
677
2874
  update_stack(stack_name, stack_body, [], tags)
678
2875
  end
679
2876
 
2877
+ def create_alb_stack(stack_name, role, hash, environment = 'qa')
2878
+ stack_body = IO.read('cloudformation/stacks/elb/alb-public-qa.yml')
2879
+ parameters = [
2880
+ {
2881
+ parameter_key: "Environment",
2882
+ parameter_value: environment
2883
+ },
2884
+ {
2885
+ parameter_key: "Role",
2886
+ parameter_value: role
2887
+ },
2888
+ {
2889
+ parameter_key: "EnvHash",
2890
+ parameter_value: hash
2891
+ }
2892
+ ]
2893
+ create_stack(stack_name, stack_body, parameters, [], @cf_role)
2894
+ end
2895
+
2896
+ def import_redis_crash(qa_ip_address)
2897
+ output "Importo chiavi di Redis da staging\n".yellow
2898
+
2899
+ prefixes = ['CODICI', 'fun_with_flags']
2900
+ redis_qa = Redis.new(:url => "redis://#{qa_ip_address}:6379/10")
2901
+ redis_staging = Redis.new(:url => 'redis://staging.cache-1.prima.it:6379/10')
2902
+
2903
+ prefixes.each do |prefix|
2904
+ redis_staging.keys("#{prefix}*").each do |key|
2905
+ next unless redis_qa.keys(key).empty?
2906
+ output "Importo #{key} dal Redis di staging\n".yellow
2907
+ dump_staging = redis_staging.dump key
2908
+ redis_qa.restore key, 0, dump_staging
2909
+ end
2910
+ end
2911
+ end
2912
+
2913
+ def import_dbs(ip_address)
2914
+ resp = @ecs.run_task({
2915
+ cluster: @ecs_cluster_name,
2916
+ task_definition: @import_db_task,
2917
+ overrides: {
2918
+ container_overrides: [
2919
+ {
2920
+ name: 'dbrestore',
2921
+ environment: [
2922
+ {
2923
+ name: 'EC2_IP_ADDRESS',
2924
+ value: ip_address
2925
+ }
2926
+ ]
2927
+ }
2928
+ ]
2929
+ },
2930
+ count: 1
2931
+ })
2932
+ return resp
2933
+ end
2934
+
2935
+ def wait_for_db_import(task)
2936
+ output "Attendo che i DB vengano importati...\n".yellow
2937
+ stopped_at = nil
2938
+ sleep 15 # altrimenti non trova il task appena avviato...
2939
+ while stopped_at.nil?
2940
+ if task.tasks[0].nil?
2941
+ pp @ecs_cluster_name
2942
+ pp task
2943
+ stop_if true, "Task di import DB lanciato, ma risposta vuota!".red
2944
+ end
2945
+ task = @ecs.describe_tasks({
2946
+ cluster: task.tasks[0].cluster_arn,
2947
+ tasks: [task.tasks[0].task_arn]
2948
+ })
2949
+ stopped_at = task.tasks[0].stopped_at unless task.tasks[0].nil?
2950
+ sleep_seconds = 10
2951
+ seconds_elapsed = 0
2952
+ while true && stopped_at.nil?
2953
+ break if seconds_elapsed >= sleep_seconds
2954
+ print '.'.yellow; STDOUT.flush
2955
+ sleep 1
2956
+ seconds_elapsed += 1
2957
+ end
2958
+ end
2959
+ print "\n"
2960
+ end
2961
+
680
2962
  def choose_branch_to_deploy(project_name, select_master = false)
2963
+ return {name: 'master', revision: '399653d555b8864', committer: 'crash@prima.it', default_branch: true} if project_name == 'crash' && select_master
681
2964
  Dir.chdir "projects/#{project_name}"
682
2965
  output "Recupero la lista dei branch del progetto #{project_name}..."
683
2966
  `git remote prune origin`
@@ -717,7 +3000,8 @@ class Release
717
3000
  name = branch_name.split(' ')[0]
718
3001
  revision = branch_name.split(' ')[1]
719
3002
  committer_email = branch_name.split(' ')[2].tr('<>', '')
720
- { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email, 'default_branch' => select_master }
3003
+ return { name: 'crash', default_branch: true } if project_name == 'crash' && branch_name == 'master' #rimuovere questa riga se mai nei qa servirà crash con un branch diverso da master
3004
+ { name: name, revision: revision[0..14], committer: committer_email, default_branch: select_master }
721
3005
  end
722
3006
 
723
3007
  def select_branch_to_deploy(project_name, branch_name)
@@ -733,7 +3017,7 @@ class Release
733
3017
  name = branch_name.split(' ')[0]
734
3018
  revision = branch_name.split(' ')[1]
735
3019
  committer_email = branch_name.split(' ')[2].tr('<>', '')
736
- { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email }
3020
+ { name: name, revision: revision[0..14], committer: committer_email }
737
3021
  end
738
3022
 
739
3023
  def get_stacks()
@@ -764,6 +3048,73 @@ class Release
764
3048
  (Time.now.to_i.to_s[-4..-1].to_i + Random.rand(40000)).to_s
765
3049
  end
766
3050
 
3051
+ def launch_marley(ip_address, prima_hostname, borat_hostname)
3052
+ resp = @cf.describe_stack_resource({
3053
+ stack_name: 'batch-job-marley',
3054
+ logical_resource_id: 'JobDefinition'
3055
+ })
3056
+
3057
+ @batch.submit_job({
3058
+ job_name: "marley-#{@dns_record_identifier}", # required
3059
+ job_queue: "tools-production", # required
3060
+ job_definition: resp.stack_resource_detail.physical_resource_id, # required
3061
+ container_overrides: {
3062
+ environment: [
3063
+ {
3064
+ name: 'PRIMA_URL',
3065
+ value: "https://#{prima_hostname}/?superprima"
3066
+ },
3067
+ {
3068
+ name: 'PRIMA_IP',
3069
+ value: ip_address
3070
+ },
3071
+ {
3072
+ name: 'PROJECTS_JSON',
3073
+ value: @projects.to_json
3074
+ },
3075
+ {
3076
+ name: 'BACKOFFICE_URL',
3077
+ value: "https://#{borat_hostname}"
3078
+ }
3079
+ ]
3080
+ }
3081
+ })
3082
+
3083
+ output "Marley lanciato con successo!\n".green
3084
+ end
3085
+
3086
+ def get_currently_deployed_version(stack_name)
3087
+ parameters = get_stack_parameters(stack_name)
3088
+ currently_deployed_version = nil
3089
+ parameters.each do |parameter|
3090
+ if parameter.parameter_key == "ReleaseVersion"
3091
+ currently_deployed_version = parameter.parameter_value
3092
+ end
3093
+ end
3094
+ currently_deployed_version
3095
+ end
3096
+
3097
+ def decrypt_secrets()
3098
+ docker_image = "prima/biscuit_populate_configs"
3099
+ [
3100
+ "docker pull #{docker_image}",
3101
+ "docker run -t --rm -v $HOME/.aws:/root/.aws -w $PWD --volumes-from #{get_host_container_name} #{docker_image}"
3102
+ ].each do |cmd|
3103
+ execute_command cmd
3104
+ end
3105
+ end
3106
+
3107
+ def get_host_container_name()
3108
+ if @host_container_name
3109
+ @host_container_name
3110
+ else
3111
+ hostname = `cat /etc/hostname`.gsub("\n", '')
3112
+ execute_command "docker ps | grep #{hostname} | awk '{print $NF}'"
3113
+ @host_container_name = `docker ps | grep #{hostname} | awk '{print $NF}'`.gsub("\n", '')
3114
+ # @host_container_name = `docker ps | grep #{hostname} | sed -r "s/.+ ([^\s].+)$/\1/p"`
3115
+ end
3116
+ end
3117
+
767
3118
  def select_branches(project_names = nil)
768
3119
  output "Deploy feature menu"
769
3120
  if project_names.nil?
@@ -777,6 +3128,14 @@ class Release
777
3128
  end
778
3129
  end
779
3130
  end
3131
+
3132
+ def get_ami_id(stack_name)
3133
+ get_stack_parameters(stack_name).each do |param|
3134
+ if param.parameter_key == "AMIID"
3135
+ return param.parameter_value
3136
+ end
3137
+ end
3138
+ end
780
3139
  end
781
3140
 
782
3141
  def help_content
@@ -802,6 +3161,7 @@ Description
802
3161
  finish finishes the feature by merging to dev and master
803
3162
  qainit deploys a new environment with selected branches from every project
804
3163
  qainit $PROJECT_NAME deploys a new environment allowing to selected a branch from the input project (everything else is master)
3164
+ qainit minimal prima deploys a new copy of prima project, using staging microservices and database
805
3165
  qainit shutdown deletes a specific qa environment
806
3166
 
807
3167
  Available only to devops (from artemide)