prima-twig 0.34.8 → 0.34.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,10 @@ 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'
8
+ require 'aws-sdk-batch'
9
+ require 'aws-sdk-cloudformation'
10
+ require 'aws-sdk-ecs'
11
+ require 'aws-sdk-s3'
9
12
  require 'redcarpet'
10
13
  require 'mail'
11
14
  require 'erb'
@@ -55,6 +58,7 @@ class Review
55
58
  @cf = Aws::CloudFormation::Client.new
56
59
  @ecs = Aws::ECS::Client.new
57
60
  @s3 = Aws::S3::Client.new
61
+ @batch = Aws::Batch::Client.new
58
62
  @s3_bucket = "prima-artifacts-encrypted"
59
63
  end
60
64
 
@@ -94,15 +98,6 @@ class Review
94
98
  artifact = artifacts.select {|v| v[:rev] == artifact_rev}.first
95
99
 
96
100
  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
106
101
 
107
102
  mail = Mail.new do
108
103
  from 'deploy@prima.it'
@@ -118,7 +113,6 @@ class Review
118
113
  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"
119
114
  body << "Branch: [#{artifact[:branch]}](https://github.com/primait/prima/tree/#{artifact[:branch]})\n\n"
120
115
  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
122
116
 
123
117
  htmlBody = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render body
124
118
 
@@ -137,17 +131,34 @@ class Review
137
131
  opts[:user_name] = @prima.config['aws_username']
138
132
  opts[:password] = @prima.config['aws_password']
139
133
 
134
+ exec_step "git checkout master"
135
+
140
136
  mail.delivery_method(:smtp, opts)
141
137
  mail.deliver
142
138
 
143
- exec_step "git checkout master"
139
+ invalidate_prismic_cache
140
+
141
+ launch_crawler
142
+
144
143
  exec_step "terminal-notifier -message 'Deploy terminato'" if which 'terminal-notifier'
145
144
  end
146
145
 
146
+ def invalidate_prismic_cache
147
+ [
148
+ "guarantee",
149
+ "glossary",
150
+ "guide",
151
+ "faq"
152
+ ].each do |page|
153
+
154
+ exec_step "curl -X POST -H \"Content-Type: application/json\" https://www.prima.it/api/cms/update/#{page}?apikey=#{@prima.config['prima_apikey']}"
155
+ end
156
+ end
157
+
147
158
  def reload_parameters!
148
159
  artifact_rev = ''
149
160
  resp = @cf.describe_stacks({
150
- stack_name: "ecs-task-web-production"
161
+ stack_name: "ecs-task-web-vpc-production"
151
162
  })
152
163
  resp.stacks[0].parameters.each do |param|
153
164
  if param.parameter_key == 'ReleaseVersion'
@@ -176,86 +187,42 @@ class Review
176
187
  exec_step "git checkout #{artifact_rev}"
177
188
  exec_step deploy_command
178
189
 
179
- stack_name_web = 'ecs-task-web-production'
180
- stack_name_consumer = 'ecs-task-consumer-production'
181
- stack_name_cron = 'ecs-task-consumer-production'
190
+ stack_name_web = 'ecs-task-web-vpc-production'
191
+ stack_name_consumer = 'ecs-task-consumer-vpc-production'
192
+ stack_name_cron = 'ecs-task-consumer-vpc-production'
193
+ stack_name_job = 'batch-job-php-production'
182
194
  wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
183
195
  wait_for_stack_ready(stack_name_consumer) unless stack_ready?(stack_name_consumer)
184
196
  wait_for_stack_ready(stack_name_cron) unless stack_ready?(stack_name_cron)
197
+ wait_for_stack_ready(stack_name_job) unless stack_ready?(stack_name_job)
185
198
  end
186
199
 
187
200
  def get_artifacts
188
201
  artifacts = []
189
202
  resp = @s3.list_objects(bucket: @s3_bucket, prefix: 'prima')
190
203
  resp.contents.each do |l|
204
+ # aggiungiamo solo gli artefatti prodotti a partire dal branch master, riconosciuti tramite i metadata
191
205
  rev = l.key.match(/^prima\/(\w{15}).tar.gz$/).captures.first if l.key.match(/^prima\/(\w{15}).tar.gz$/)
192
206
  if rev
193
207
  object = @s3.head_object(bucket: @s3_bucket, key: l.key)
194
208
  commit_msg = ''
195
209
  commit_msg = Base64.decode64(object.metadata['commit_msg']).strip if object.metadata.has_key? 'commit_msg'
196
- artifacts << {rev: rev, created_at: object.last_modified, branch: object.metadata['branch'], commit_msg: commit_msg } if object.metadata.has_key? 'branch'
210
+ artifacts << {rev: rev, created_at: object.last_modified, branch: object.metadata['branch'], commit_msg: commit_msg } if (object.metadata.has_key? 'branch') && (object.metadata['branch'] == 'master')
197
211
  end
198
212
  end
199
213
  artifacts.sort_by { |v| v[:created_at] }.reverse
200
214
  end
201
215
 
202
- def launch_paparatzinger(job_name)
203
- @s3.get_object(
204
- response_target: '/tmp/paparatzinger_twig.yml',
205
- bucket: 'prima-deploy',
206
- key: 'paparatzinger_twig.yml')
207
-
208
- paparatzinger_config = YAML.load_file '/tmp/paparatzinger_twig.yml'
209
-
210
- uri = URI.parse(paparatzinger_config['prima_api_search_url'])
211
- body = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
212
- req = Net::HTTP::Get.new(uri)
213
- req["x-apikey"] = paparatzinger_config['prima_api_token']
214
- response = http.request req
215
- response.body
216
- end
217
-
218
- saves = JSON.parse body
216
+ def launch_crawler()
217
+ resp = describe_stack_resource('batch-job-crawler-production', 'JobDefinition')
219
218
 
220
- save_code = saves.sample['unique_identifier']
221
- url_garanzie = "https://www.prima.it/preventivo/auto/#{save_code}/garanzie?browserstack=true"
222
- job_name = get_paparatzinger_job_name(clean_commit_message(job_name))
223
-
224
- logical_resource_id = 'TaskDefinitionPaparatzinger'
225
- resp = @cf.describe_stack_resource({
226
- stack_name: 'ecs-task-paparatzinger-production',
227
- logical_resource_id: logical_resource_id
228
- })
229
-
230
- resp = @ecs.run_task({
231
- cluster: 'ecs-cluster-tools-ECSCluster-1I4THZHRXOTO5',
232
- task_definition: resp.stack_resource_detail.physical_resource_id,
233
- overrides: {
234
- container_overrides: [
235
- {
236
- name: 'paparatzinger',
237
- environment: [
238
- {
239
- name: 'JOB_NAME',
240
- value: job_name,
241
- },
242
- {
243
- name: 'VERSION',
244
- value: paparatzinger_config['version'],
245
- },
246
- {
247
- name: 'URL_GARANZIE',
248
- value: url_garanzie
249
- }
250
- ]
251
- }
252
- ]
253
- },
254
- count: 1
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
255
223
  })
256
- output "Paparatzinger lanciato con successo. URL: #{url_garanzie}\n".green
257
224
 
258
- job_name
225
+ output "Crawler lanciato con successo!\n".green
259
226
  end
260
227
 
261
228
  end
@@ -267,10 +234,6 @@ def clean_commit_message(commit_msg)
267
234
  commit_msg[0..99]
268
235
  end
269
236
 
270
- def get_paparatzinger_job_name(job_name)
271
- job_name.gsub /[^0-9a-z]/i, '-'
272
- end
273
-
274
237
  def which(cmd)
275
238
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
276
239
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
@@ -13,39 +13,48 @@ class Release
13
13
  include Command
14
14
  include PrimaAwsClient
15
15
 
16
- def initialize
16
+ def initialize(update_gem=true)
17
17
  @prima = Prima.new
18
- output 'Controllo se ci sono aggiornamenti da fare...'
19
- exec "gem update prima-twig && twig feature #{ARGV.join ' '}" unless `gem outdated`.lines.grep(/^prima-twig \(.*\)/).empty?
20
- @cf = Aws::CloudFormation::Client.new
21
- @alb = Aws::ElasticLoadBalancingV2::Client.new
22
- @ec2 = Aws::EC2::Client.new
23
- @ecs = Aws::ECS::Client.new
24
- @batch = Aws::Batch::Client.new
25
- @asg = Aws::AutoScaling::Client.new
26
- @s3_bucket = 'prima-artifacts'
27
- @artifact_path = '/tmp/prima-artifact.zip'
28
- @import_db_task = 'arn:aws:ecs:eu-west-1:001575623345:task-definition/ecs-task-db-restore2-TaskDefinitionDbRestore-UDIDEVPA4H7Q:1'
18
+ if update_gem
19
+ output 'Controllo se ci sono aggiornamenti da fare (potrebbe richiedere qualche minuto)'
20
+ unless `gem update prima-twig`=="Updating installed gems\nNothing to update\n"
21
+ output 'Gemma prima-twig aggiornata'
22
+ exec "twig feature #{ARGV.join ' '}"
23
+ end
24
+ end
29
25
  @dns_record_identifier = nil
30
26
  @ecs_cluster_name = nil
31
27
  @deploy_update = false
32
28
  @projects = {
33
29
  'prima' => {},
34
- 'backoffice' => {},
35
30
  'urania' => {},
36
31
  'ermes' => {},
37
32
  'bburago' => {},
38
33
  'hal9000' => {},
39
34
  'fidaty' => {},
40
35
  'peano' => {},
41
- 'rogoreport' => {},
36
+ # 'rogoreport' => {},
42
37
  'assange' => {},
43
38
  'borat' => {},
44
- 'bolla' => {},
45
- 'crash' => {}
39
+ 'crash' => {},
40
+ 'activia' => {},
41
+ 'skynet' => {},
42
+ 'roger' => {},
43
+ 'rachele' => {},
44
+ 'leftorium' => {},
45
+ 'pyxis-npm' => {},
46
+ 'starsky' => {},
47
+ 'hutch' => {},
48
+ 'maia' => {},
49
+ 'legion' => {},
50
+ 'vianello' => {},
51
+ 'domus' => {},
52
+ 'toretto' => {}
46
53
  }
47
- @stack_name_alb = 'ecs-alb-http-public-qa'
48
- @stack_name_alb_ws = 'ecs-alb-ws-public-qa'
54
+ @base_stack_name_alb = 'ecs-alb-http-public-qa-'
55
+ @base_stack_name_alb_ws = 'ecs-alb-ws-public-qa-'
56
+ @git_branch = ''
57
+ @cloudflare = Rubyflare.connect_with(ENV['CLOUDFLARE_EMAIL'], ENV['CLOUDFLARE_APIKEY'])
49
58
  end
50
59
 
51
60
  def execute!(args)
@@ -54,21 +63,30 @@ class Release
54
63
  start_feature!
55
64
  when 'finish'
56
65
  finish_feature!
57
- when 'deploy'
58
- abort('Non sei nella cartella di artemide') unless Dir.pwd.match 'artemide$'
66
+ when 'qainit'
67
+ abort('Non sei nella cartella di qainit') unless Dir.pwd.match 'qainit$' or Dir.pwd.match '/drone/src'
59
68
  if ['terminate', 'stop', 'shutdown', 'halt', 'destroy'].include? args[1]
60
- deploy_shutdown!
69
+ qainit_deploy_shutdown!
61
70
  elsif 'update' == args[1]
62
- deploy_update!
63
- elsif 'lock' == args[1]
64
- deploy_lock!
71
+ qainit_deploy_update!
65
72
  else
66
73
  if args[1]
67
- select_branches(args[1])
74
+ select_branches(args[1..-1])
68
75
  else
69
76
  select_branches
70
77
  end
71
- deploy_feature!
78
+ qainit_deploy!
79
+ end
80
+ when 'suite'
81
+ abort('Non sei nella cartella di qainit') unless Dir.pwd.match 'qainit$'
82
+ if 'deploy' == args[1]
83
+ suite_py_branches(args[2])
84
+ qainit_deploy!(true)
85
+ end
86
+ when 'deploy'
87
+ abort('Non sei nella cartella di artemide') unless Dir.pwd.match 'artemide$'
88
+ if 'lock' == args[1]
89
+ deploy_lock!
72
90
  end
73
91
  when 'aggregator'
74
92
  if 'enable' == args[1]
@@ -84,6 +102,7 @@ class Release
84
102
  end
85
103
 
86
104
  def stop_for_wrong_args
105
+ puts help_content
87
106
  stop_if true, [:wrong_args, ['start', 'finish', 'deploy', 'deploy project_name', 'deploy stop', 'deploy update', 'aggregator enable', 'aggregator disable']]
88
107
  end
89
108
 
@@ -103,10 +122,6 @@ class Release
103
122
  output 'Disable aggregator'
104
123
 
105
124
  output "Recupero le informazioni relative al puntamento dei record DNS..."
106
- cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
107
- dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', content: get_alb_host(@stack_name_alb)})
108
- stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori non stanno puntando ad un QA".red
109
-
110
125
  output "Recupero le informazioni sui QA attivi..."
111
126
  stack_list, envs = get_stacks()
112
127
 
@@ -118,8 +133,10 @@ class Release
118
133
  end.is_a?(Aws::CloudFormation::Types::Tag)
119
134
  aggregator_enabled
120
135
  end[0]
136
+ 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])})
137
+ stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori non stanno puntando ad un QA".red
121
138
  change_hostname_priority(env_hash, hostname_pattern_priority())
122
- dns_to_staging()
139
+ dns_to_staging(env_hash)
123
140
  else
124
141
  output 'Nessun QA trovato'.red
125
142
  exit
@@ -132,8 +149,7 @@ class Release
132
149
  output 'Enable aggregator'
133
150
 
134
151
  output 'Recupero le informazioni relative al puntamento dei record DNS...'
135
- cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
136
- dns_records = cloudflare.get('zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records', { per_page: 100, type: 'CNAME', content: 'staging.prima.it' })
152
+ dns_records = @cloudflare.get('zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records', { per_page: 100, type: 'CNAME', content: 'staging.prima.it' })
137
153
  stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori stanno gia' puntando ad un QA".red
138
154
 
139
155
  output "Recupero le informazioni sui QA attivi..."
@@ -163,7 +179,7 @@ class Release
163
179
  dns_records.body[:result].each do |dns|
164
180
  if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
165
181
  output "Changing #{dns[:name]} DNS record"
166
- cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: get_alb_host(@stack_name_alb), proxied: true, ttl: 1})
182
+ @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})
167
183
  end
168
184
  end
169
185
 
@@ -220,14 +236,13 @@ class Release
220
236
  wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
221
237
  end
222
238
 
223
- def dns_to_staging
239
+ def dns_to_staging(env_hash)
224
240
  output "Recupero le informazioni relative al puntamento dei record DNS..."
225
- cloudflare = Rubyflare.connect_with(@prima.config['cloudflare_email'], @prima.config['cloudflare_apikey'])
226
- dns_records = cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', content: get_alb_host(@stack_name_alb)})
241
+ 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])})
227
242
  dns_records.body[:result].each do |dns|
228
243
  if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
229
244
  output "Changing #{dns[:name]} DNS record"
230
- cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1})
245
+ @cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1})
231
246
  end
232
247
  end
233
248
  end
@@ -295,7 +310,7 @@ class Release
295
310
  end.is_a?(Aws::CloudFormation::Types::Tag)
296
311
 
297
312
  if aggregator_enabled
298
- dns_to_staging()
313
+ dns_to_staging(env_hash)
299
314
  end
300
315
 
301
316
  # Se non ha finito di cancellare le altre non si puo' cancellare il cluster
@@ -310,8 +325,8 @@ class Release
310
325
  end
311
326
 
312
327
  delete_stack(cluster_stack_name)
313
- delete_stack(@stack_name_alb) if envs.length < 2
314
- delete_stack(@stack_name_alb_ws) if envs.length < 2
328
+ delete_stack(@base_stack_name_alb + env_hash[3..8])
329
+ delete_stack(@base_stack_name_alb_ws + env_hash[3..8])
315
330
  output "Finito!".green
316
331
  end
317
332
 
@@ -322,7 +337,7 @@ class Release
322
337
  @deploy_update = true
323
338
 
324
339
  output "Recupero le informazioni sui QA attivi..."
325
- stack_list, envs = get_stacks()
340
+ stack_list, envs = get_clusters()
326
341
 
327
342
  env_hash = nil
328
343
  unless envs.empty?
@@ -332,7 +347,7 @@ class Release
332
347
  envs.each do |key, env|
333
348
  title = ""
334
349
  env.each do |e|
335
- title << "\n#{e.key.upcase}: #{e.value}"
350
+ title << "#{e.value}" if e.key == 'qainit'
336
351
  end
337
352
  msg = "#{@prima.reduce_size(title, 1000)}".light_blue
338
353
  menu.choice(msg) { key }
@@ -393,886 +408,210 @@ class Release
393
408
  output "Finito!".green
394
409
  end
395
410
 
396
- def deploy_feature!
397
- `git pull && git submodule init && git submodule update`
398
- if deploy_crash?
399
- deploy_id = Digest::MD5.hexdigest(
400
- @projects["prima"][:name] +
401
- @projects["backoffice"][:name] +
402
- @projects["urania"][:name] +
403
- @projects["ermes"][:name] +
404
- @projects["bburago"][:name] +
405
- @projects["hal9000"][:name] +
406
- @projects["fidaty"][:name] +
407
- @projects["peano"][:name] +
408
- @projects["rogoreport"][:name] +
409
- @projects["assange"][:name] +
410
- @projects["borat"][:name] +
411
- @projects["bolla"][:name] +
412
- @projects['crash'][:name]
413
- )
414
- else
415
- deploy_id = Digest::MD5.hexdigest(
416
- @projects["prima"][:name] +
417
- @projects["backoffice"][:name] +
418
- @projects["urania"][:name] +
419
- @projects["ermes"][:name] +
420
- @projects["bburago"][:name] +
421
- @projects["hal9000"][:name] +
422
- @projects["fidaty"][:name] +
423
- @projects["peano"][:name] +
424
- @projects["rogoreport"][:name] +
425
- @projects["assange"][:name] +
426
- @projects["borat"][:name] +
427
- @projects["bolla"][:name]
428
- )
411
+ def get_default_branch_name(projects)
412
+ projects.each_key do |project|
413
+ return projects[project]['name'] if not projects[project]['default_branch']
429
414
  end
430
- @dns_record_identifier = deploy_id
431
- hostname_pattern_priority = hostname_pattern_priority()
432
- tags = [
433
- {
434
- key: "prima",
435
- value: @projects["prima"][:name]
436
- },
437
- {
438
- key: "urania",
439
- value: @projects["urania"][:name]
440
- },
441
- {
442
- key: "backoffice",
443
- value: @projects["backoffice"][:name]
444
- },
445
- {
446
- key: "ermes",
447
- value: @projects["ermes"][:name]
448
- },
449
- {
450
- key: "bburago",
451
- value: @projects["bburago"][:name]
452
- },
453
- {
454
- key: "hal9000",
455
- value: @projects["hal9000"][:name]
456
- },
457
- {
458
- key: "fidaty",
459
- value: @projects["fidaty"][:name]
460
- },
461
- {
462
- key: "hostname_pattern_priority",
463
- value: hostname_pattern_priority
464
- },
465
- {
466
- key: "peano",
467
- value: @projects["peano"][:name]
468
- },
469
- {
470
- key: "rogoreport",
471
- value: @projects["rogoreport"][:name]
472
- },
473
- {
474
- key: "assange",
475
- value: @projects["assange"][:name]
476
- },
477
- {
478
- key: "borat",
479
- value: @projects["borat"][:name]
480
- },
481
- {
482
- key: "bolla",
483
- value: @projects["bolla"][:name]
484
- }
485
- ]
486
- tags << { key: 'crash', value: @projects['crash'][:name] } if deploy_crash?
487
-
488
- cluster_stack_name = "ecs-cluster-qa-#{deploy_id}"
415
+ end
489
416
 
490
- if stack_exists?(cluster_stack_name)
491
- tags = get_stack_tags(cluster_stack_name)
492
- hostname_pattern_priority = tags.detect do |tag|
493
- tag.key == 'hostname_pattern_priority'
494
- end.value
495
- end
417
+ def suite_py_branches(args_json)
418
+ arg_projects = JSON.parse(args_json)
496
419
 
497
- create_cluster_stack(cluster_stack_name, tags) unless stack_exists?(cluster_stack_name)
498
- wait_for_stack_ready(cluster_stack_name) unless stack_ready?(cluster_stack_name)
499
-
500
- create_alb_stack(@stack_name_alb, "http") unless stack_exists?(@stack_name_alb)
501
- create_alb_stack(@stack_name_alb_ws, "websocket") unless stack_exists?(@stack_name_alb_ws)
502
-
503
- resp = @cf.describe_stack_resource({stack_name: cluster_stack_name, logical_resource_id: 'ECSCluster'})
504
- @ecs_cluster_name = resp.stack_resource_detail.physical_resource_id
505
-
506
- asg_stack_name = "ecs-asg-allinone-qa-#{deploy_id}"
507
- create_asg_stack(asg_stack_name, tags) unless stack_exists?(asg_stack_name)
508
-
509
- stack_name_db = "ecs-task-db-qa-#{deploy_id}"
510
- stack_body = IO.read('cloudformation/stacks/task/db.yml')
511
- parameters = [
512
- {
513
- parameter_key: "Environment",
514
- parameter_value: "qa"
515
- },
516
- {
517
- parameter_key: "ECSClusterName",
518
- parameter_value: @ecs_cluster_name
519
- }
520
- ]
521
- create_stack(stack_name_db, stack_body, parameters, tags) unless stack_exists?(stack_name_db)
522
-
523
- create_prima_artifact(@projects["prima"][:revision], @projects["prima"][:name], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "prima/#{@projects["prima"][:revision]}-#{deploy_id}.tar.gz")
524
- create_crash_artifact(@projects['crash'][:revision], deploy_id) unless !deploy_crash? || artifact_exists?('prima-artifacts-encrypted', "microservices/crash/#{@projects['crash'][:revision]}-#{deploy_id}-qa.tar.gz")
525
- create_urania_artifact(@projects["urania"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/urania/#{@projects["urania"][:revision]}-qa.tar.gz")
526
- create_ermes_artifact(@projects["ermes"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/ermes/#{@projects["ermes"][:revision]}-#{deploy_id}-qa.tar.gz")
527
- create_bburago_artifact(@projects["bburago"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/bburago/#{@projects["bburago"][:revision]}-qa.tar.gz")
528
- create_hal9000_artifact(@projects["hal9000"][:revision]) unless artifact_exists?('prima-artifacts-encrypted', "microservices/hal9000/#{@projects["hal9000"][:revision]}-qa.tar.gz")
529
- create_fidaty_artifact(@projects["fidaty"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/fidaty/#{@projects["fidaty"][:revision]}-#{deploy_id}-qa.tar.gz")
530
- create_backoffice_artifact(@projects["backoffice"][:revision], deploy_id) unless artifact_exists?('prima-artifacts', "backoffice/#{@projects["backoffice"][:revision]}-#{deploy_id}.zip")
531
- create_peano_artifact(@projects["peano"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/peano/#{@projects["peano"][:revision]}-#{deploy_id}-qa.tar.gz")
532
- create_rogoreport_artifact(@projects["rogoreport"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/rogoreport/rogoreport_qa-#{@projects["rogoreport"][:revision]}-#{deploy_id}-qa.tar.gz")
533
- create_assange_artifact(@projects["assange"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/assange/#{@projects["assange"][:revision]}-#{deploy_id}-qa.tar.gz")
534
- create_borat_artifact(@projects["borat"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/borat/#{@projects["borat"][:revision]}-#{deploy_id}-qa.tar.gz")
535
- create_bolla_artifact(@projects["bolla"][:revision], deploy_id) unless artifact_exists?('prima-artifacts-encrypted', "microservices/bolla/#{@projects["bolla"][:revision]}-#{deploy_id}-qa-migrator.tar.gz")
536
-
537
- wait_for_stack_ready(stack_name_db) unless stack_ready?(stack_name_db)
538
- import_dbs(ec2_ip_address(asg_stack_name)) unless stack_exists?("ecs-task-web-qa-#{deploy_id}")
539
-
540
- import_redis_crash(ec2_ip_address(asg_stack_name)) if deploy_crash? && !stack_exists?("ecs-task-web-qa-#{deploy_id}")
541
-
542
- wait_for_stack_ready(@stack_name_alb) unless stack_ready?(@stack_name_alb)
543
- wait_for_stack_ready(@stack_name_alb_ws) unless stack_ready?(@stack_name_alb_ws)
544
-
545
- stack_name_route53 = "ecs-route53-qa-#{deploy_id}"
546
- stack_body = IO.read('cloudformation/stacks/route53/qa.yml')
547
- parameters = [
548
- {
549
- parameter_key: "DnsRecordIdentifier",
550
- parameter_value: @dns_record_identifier
551
- },
552
- {
553
- parameter_key: "PrimaElbHostname",
554
- parameter_value: get_alb_host(@stack_name_alb)
555
- },
556
- {
557
- parameter_key: "BackofficeElbHostname",
558
- parameter_value: get_alb_host(@stack_name_alb)
559
- },
560
- {
561
- parameter_key: "UraniaIp",
562
- parameter_value: ec2_ip_address(asg_stack_name)
563
- },
564
- {
565
- parameter_key: "BburagoIp",
566
- parameter_value: ec2_ip_address(asg_stack_name)
567
- },
568
- {
569
- parameter_key: "Hal9000Ip",
570
- parameter_value: ec2_ip_address(asg_stack_name)
571
- },
572
- {
573
- parameter_key: "FidatyIp",
574
- parameter_value: ec2_ip_address(asg_stack_name)
575
- },
576
- {
577
- parameter_key: "PeanoIp",
578
- parameter_value: ec2_ip_address(asg_stack_name)
579
- },
580
- {
581
- parameter_key: "ErmesIp",
582
- parameter_value: ec2_ip_address(asg_stack_name)
583
- },
584
- {
585
- parameter_key: "RedisIp",
586
- parameter_value: ec2_ip_address(asg_stack_name)
587
- },
588
- {
589
- parameter_key: "AssangeElbHostname",
590
- parameter_value: get_alb_host(@stack_name_alb)
591
- },
592
- {
593
- parameter_key: "BoratElbHostname",
594
- parameter_value: get_alb_host(@stack_name_alb_ws)
595
- },
596
- {
597
- parameter_key: 'CrashElbHostname',
598
- parameter_value: get_alb_host(@stack_name_alb_ws)
599
- }
600
- ]
601
-
602
- create_stack(stack_name_route53, stack_body, parameters, tags) unless stack_exists?(stack_name_route53)
603
- wait_for_stack_ready(stack_name_route53) unless stack_ready?(stack_name_route53)
604
-
605
- stack_name_urania = "ecs-task-urania-qa-#{deploy_id}"
606
- git_checkout_version('urania', @projects["urania"][:revision])
607
- stack_body = YAML.load_file('projects/urania/deploy/task.yml')
608
- stack_body['Resources']['ECSServiceUrania']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
609
- stack_body = stack_body.to_yaml
610
- parameters = [
611
- {
612
- parameter_key: "Environment",
613
- parameter_value: "qa"
614
- },
615
- {
616
- parameter_key: "ReleaseVersion",
617
- parameter_value: @projects["urania"][:revision]
618
- },
619
- {
620
- parameter_key: "TaskDesiredCount",
621
- parameter_value: "1"
622
- },
623
- {
624
- parameter_key: "ECSClusterName",
625
- parameter_value: @ecs_cluster_name
626
- },
627
- {
628
- parameter_key: "ALBShortName",
629
- parameter_value: "urania-qa-#{deploy_id}"[0..31]
630
- },
631
- {
632
- parameter_key: "HostnamePattern",
633
- parameter_value: "urania-#{@dns_record_identifier}.qa.colaster.com"
634
- },
635
- {
636
- parameter_key: "HostnamePatternPriority",
637
- parameter_value: hostname_pattern_priority
638
- }
639
- ]
640
- if stack_exists?(stack_name_urania)
641
- cur_version = get_currently_deployed_version(stack_name_urania)
642
- update_stack(stack_name_urania, stack_body, parameters, tags) unless cur_version.include?(@projects["urania"][:revision])
643
- else
644
- create_stack(stack_name_urania, stack_body, parameters, tags)
645
- end
420
+ @projects.merge!(arg_projects)
646
421
 
647
- stack_name_ermes = "ecs-task-ermes-qa-#{deploy_id}"
648
- git_checkout_version('ermes', @projects["ermes"][:revision])
649
- stack_body = YAML.load_file('projects/ermes/deploy/task.yml')
650
- stack_body['Resources']['ECSServiceErmes']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
651
- stack_body = stack_body.to_yaml
652
- parameters = [
653
- {
654
- parameter_key: "Environment",
655
- parameter_value: "qa"
656
- },
657
- {
658
- parameter_key: "ReleaseVersion",
659
- parameter_value: "#{@projects['ermes'][:revision]}-#{deploy_id}"
660
- },
661
- {
662
- parameter_key: "TaskDesiredCount",
663
- parameter_value: "1"
664
- },
665
- {
666
- parameter_key: "ECSClusterName",
667
- parameter_value: @ecs_cluster_name
668
- },
669
- {
670
- parameter_key: "ALBShortName",
671
- parameter_value: "ermes-qa-#{deploy_id}"[0..31]
672
- },
673
- {
674
- parameter_key: "HostnamePattern",
675
- parameter_value: "ermes-#{@dns_record_identifier}.qa.colaster.com"
676
- },
677
- {
678
- parameter_key: "HostnamePatternPriority",
679
- parameter_value: hostname_pattern_priority
680
- }
681
- ]
682
- if stack_exists?(stack_name_ermes)
683
- cur_version = get_currently_deployed_version(stack_name_ermes)
684
- update_stack(stack_name_ermes, stack_body, parameters, tags) unless cur_version.include?(@projects["ermes"][:revision])
685
- else
686
- create_stack(stack_name_ermes, stack_body, parameters, tags)
422
+ @projects.each_key do |project|
423
+ if @projects[project].empty?
424
+ @projects[project] = choose_branch_to_deploy(project, true)
425
+ end
687
426
  end
427
+ end
688
428
 
689
- stack_name_bburago = "ecs-task-bburago-qa-#{deploy_id}"
690
- git_checkout_version('bburago', @projects["bburago"][:revision])
691
- stack_body = YAML.load_file('projects/bburago/deploy/task.yml')
692
- stack_body['Resources']['ECSServiceBburago']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
693
- stack_body = stack_body.to_yaml
694
- parameters = [
695
- {
696
- parameter_key: "Environment",
697
- parameter_value: "qa"
698
- },
699
- {
700
- parameter_key: "ReleaseVersion",
701
- parameter_value: @projects["bburago"][:revision]
702
- },
703
- {
704
- parameter_key: "ECSClusterName",
705
- parameter_value: @ecs_cluster_name
706
- },
707
- {
708
- parameter_key: "TaskDesiredCount",
709
- parameter_value: "1"
710
- },
711
- {
712
- parameter_key: "ALBShortName",
713
- parameter_value: "bburago-qa-#{deploy_id}"[0..31]
714
- },
715
- {
716
- parameter_key: "HostnamePattern",
717
- parameter_value: "bburago-#{@dns_record_identifier}.qa.colaster.com"
718
- },
719
- {
720
- parameter_key: "HostnamePatternPriority",
721
- parameter_value: hostname_pattern_priority
722
- }
723
- ]
724
- if stack_exists?(stack_name_bburago)
725
- cur_version = get_currently_deployed_version(stack_name_bburago)
726
- update_stack(stack_name_bburago, stack_body, parameters, tags) unless cur_version.include?(@projects["bburago"][:revision])
727
- else
728
- create_stack(stack_name_bburago, stack_body, parameters, tags)
729
- end
429
+ def get_git_user()
430
+ `git config user.name`.gsub(/[^A-Za-z]/, '').gsub("\n", '')
431
+ end
730
432
 
731
- stack_name_hal9000 = "ecs-task-hal9000-qa-#{deploy_id}"
732
- git_checkout_version('hal9000', @projects["hal9000"][:revision])
733
- stack_body = YAML.load_file('projects/hal9000/deploy/task.yml')
734
- stack_body['Resources']['ECSServiceHal9000']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
735
- stack_body = stack_body.to_yaml
736
- parameters = [
737
- {
738
- parameter_key: "Environment",
739
- parameter_value: "qa"
740
- },
741
- {
742
- parameter_key: "ReleaseVersion",
743
- parameter_value: @projects["hal9000"][:revision]
744
- },
745
- {
746
- parameter_key: "ECSClusterName",
747
- parameter_value: @ecs_cluster_name
748
- },
749
- {
750
- parameter_key: "TaskDesiredCount",
751
- parameter_value: "1"
752
- },
753
- {
754
- parameter_key: "ALBShortName",
755
- parameter_value: "hal9000-qa-#{deploy_id}"[0..31]
756
- },
757
- {
758
- parameter_key: "HostnamePattern",
759
- parameter_value: "hal9000-#{@dns_record_identifier}.qa.colaster.com"
760
- },
761
- {
762
- parameter_key: "HostnamePatternPriority",
763
- parameter_value: hostname_pattern_priority
764
- }
765
- ]
766
- if stack_exists?(stack_name_hal9000)
767
- cur_version = get_currently_deployed_version(stack_name_hal9000)
768
- update_stack(stack_name_hal9000, stack_body, parameters, tags) unless cur_version.include?(@projects["hal9000"][:revision])
769
- else
770
- create_stack(stack_name_hal9000, stack_body, parameters, tags)
771
- end
433
+ def get_git_mail()
434
+ `git config user.email`.gsub("\n", '')
435
+ end
772
436
 
773
- stack_name_fidaty = "ecs-task-fidaty-qa-#{deploy_id}"
774
- git_checkout_version('fidaty', @projects["fidaty"][:revision])
775
- stack_body = YAML.load_file('projects/fidaty/deploy/task.yml')
776
- stack_body['Resources']['ECSServiceFidaty']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
777
- stack_body = stack_body.to_yaml
778
- parameters = [
779
- {
780
- parameter_key: "Environment",
781
- parameter_value: "qa"
782
- },
783
- {
784
- parameter_key: "ReleaseVersion",
785
- parameter_value: "#{@projects["fidaty"][:revision]}-#{deploy_id}"
786
- },
787
- {
788
- parameter_key: "ECSClusterName",
789
- parameter_value: @ecs_cluster_name
790
- },
791
- {
792
- parameter_key: "TaskDesiredCount",
793
- parameter_value: "1"
794
- },
795
- {
796
- parameter_key: "ALBShortName",
797
- parameter_value: "fidaty-qa-#{deploy_id}"[0..31]
798
- },
799
- {
800
- parameter_key: "HostnamePattern",
801
- parameter_value: "fidaty-#{@dns_record_identifier}.qa.colaster.com"
802
- },
803
- {
804
- parameter_key: "HostnamePatternPriority",
805
- parameter_value: hostname_pattern_priority
806
- }
807
- ]
808
- if stack_exists?(stack_name_fidaty)
809
- cur_version = get_currently_deployed_version(stack_name_fidaty)
810
- update_stack(stack_name_fidaty, stack_body, parameters, tags) unless cur_version.include?(@projects["fidaty"][:revision])
811
- else
812
- create_stack(stack_name_fidaty, stack_body, parameters, tags)
813
- end
437
+ def qainit_deploy!(quiet = false)
438
+ `git checkout master && git pull && git submodule update --init --recursive && git remote prune origin`
814
439
 
815
- stack_name_peano = "ecs-task-peano-qa-#{deploy_id}"
816
- git_checkout_version('peano', @projects["peano"][:revision])
817
- stack_body = YAML.load_file('projects/peano/deploy/task.yml')
818
- stack_body['Resources']['ECSServicePeano']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
819
- stack_body = stack_body.to_yaml
820
- parameters = [
821
- {
822
- parameter_key: "Environment",
823
- parameter_value: "qa"
824
- },
825
- {
826
- parameter_key: "ReleaseVersion",
827
- parameter_value: "#{@projects['peano'][:revision]}-#{deploy_id}"
828
- },
829
- {
830
- parameter_key: "ECSClusterName",
831
- parameter_value: @ecs_cluster_name
832
- },
833
- {
834
- parameter_key: "TaskDesiredCount",
835
- parameter_value: "1"
836
- },
837
- {
838
- parameter_key: "ALBShortName",
839
- parameter_value: "peano-qa-#{deploy_id}"[0..31]
840
- },
841
- {
842
- parameter_key: "HostnamePattern",
843
- parameter_value: "peano-#{@dns_record_identifier}.qa.colaster.com"
844
- },
845
- {
846
- parameter_key: "HostnamePatternPriority",
847
- parameter_value: hostname_pattern_priority
848
- }
849
- ]
850
- if stack_exists?(stack_name_peano)
851
- cur_version = get_currently_deployed_version(stack_name_peano)
852
- update_stack(stack_name_peano, stack_body, parameters, tags) unless cur_version.include?(@projects["peano"][:revision])
853
- else
854
- create_stack(stack_name_peano, stack_body, parameters, tags)
440
+ `git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -D`
441
+
442
+ default_name = get_default_branch_name @projects
443
+ feature_number = ''
444
+ unless quiet
445
+ output "Inserisci la feature a cui si riferisce il QA: [#{default_name}]".cyan
446
+ feature_number = String(STDIN.gets.chomp)
855
447
  end
448
+ feature_number = default_name if feature_number.empty?
449
+ branch_name = get_git_user + '_' + feature_number
856
450
 
857
- stack_name_rogoreport = "ecs-task-rogoreport-qa-#{deploy_id}"
858
- git_checkout_version('rogoreport', @projects["rogoreport"][:revision])
859
- stack_body = IO.read('projects/rogoreport/deploy/task.yml')
860
- parameters = [
861
- {
862
- parameter_key: "Environment",
863
- parameter_value: "qa"
864
- },
865
- {
866
- parameter_key: "ReleaseVersion",
867
- parameter_value: "#{@projects["rogoreport"][:revision]}-#{deploy_id}"
868
- },
869
- {
870
- parameter_key: "ReleaseName",
871
- parameter_value: "rogoreport_qa"
872
- },
873
- {
874
- parameter_key: "ECSClusterName",
875
- parameter_value: @ecs_cluster_name
876
- }
877
- ]
878
- if stack_exists?(stack_name_rogoreport)
879
- cur_version = get_currently_deployed_version(stack_name_rogoreport)
880
- update_stack(stack_name_rogoreport, stack_body, parameters, tags) unless cur_version.include?(@projects["rogoreport"][:revision])
451
+ if `git branch -l | grep #{branch_name}`.size > 0
452
+ `git checkout #{branch_name} && git pull`
881
453
  else
882
- create_stack(stack_name_rogoreport, stack_body, parameters, tags)
454
+ `git checkout -b #{branch_name}`
455
+ end
456
+
457
+ @git_branch = branch_name
458
+
459
+ File.open('branch_names', 'w') { |file| file.write(JSON.generate(@projects)) }
460
+
461
+ update_drone_yml!
462
+
463
+ `git add projects && \
464
+ git add branch_names .drone.yml && \
465
+ git commit -m '#{branch_name}' && \
466
+ git push -f --set-upstream origin #{branch_name} && \
467
+ git checkout master`
468
+ end
469
+
470
+ def qainit_deploy_update!
471
+ `git checkout master && git pull`
472
+ # cancelliamo tutti i branch che non sono più sul repo remoto
473
+ `git fetch -p && for branch in \`git branch -vv | grep ': gone]' | awk '{print $1}'\`; do git branch -D $branch; done`
474
+ # leggiamo i nomi dei branch superstiti
475
+ former_branches = `git branch -a | grep remotes/ | grep -v HEAD | sed 's/ remotes\\/origin\\///g'`.split "\n"
476
+ git_user = get_git_user
477
+ # stampiamo la lista
478
+ chosen_branch = choose do |menu|
479
+ menu.prompt = "Scegli il QA che vuoi aggiornare: ".cyan
480
+ menu.shell = true
481
+ former_branches.delete('master')
482
+ former_branches.each_with_index do |branch, index|
483
+ msg = index.odd? ? branch.white : branch.light_yellow # uno bianco e uno giallo alternati
484
+ msg = branch.start_with?(git_user) ? msg.on_blue : msg.on_black # i branch creati da chi lancia l'update sono su sfondo più chiaro
485
+ menu.choice(msg) { branch }
486
+ end
883
487
  end
488
+ # checkout master, checkout branch, pull branch
489
+ `git checkout master && git checkout #{chosen_branch} && git pull`
884
490
 
885
- stack_name_assange = "ecs-task-assange-qa-#{deploy_id}"
886
- git_checkout_version('assange', @projects["assange"][:revision])
887
- stack_body = IO.read('projects/assange/deploy/task.yml')
888
- parameters = [
889
- {
890
- parameter_key: "Environment",
891
- parameter_value: "qa"
892
- },
893
- {
894
- parameter_key: "ReleaseVersion",
895
- parameter_value: "#{@projects["assange"][:revision]}-#{deploy_id}"
896
- },
897
- {
898
- parameter_key: "ECSClusterName",
899
- parameter_value: @ecs_cluster_name
900
- },
901
- {
902
- parameter_key: "TaskDesiredCount",
903
- parameter_value: "1"
904
- },
905
- {
906
- parameter_key: "ALBShortName",
907
- parameter_value: "assange-qa-#{deploy_id}"[0..31]
908
- },
909
- {
910
- parameter_key: "HostnamePattern",
911
- parameter_value: "assange-#{@dns_record_identifier}.qa.colaster.com"
912
- },
913
- {
914
- parameter_key: "HostnamePatternPriority",
915
- parameter_value: (hostname_pattern_priority.to_i + 20).to_s
916
- }
917
- ]
918
- if stack_exists?(stack_name_assange)
919
- cur_version = get_currently_deployed_version(stack_name_assange)
920
- update_stack(stack_name_assange, stack_body, parameters, tags) unless cur_version.include?(@projects["assange"][:revision])
921
- else
922
- create_stack(stack_name_assange, stack_body, parameters, tags)
491
+ # aggiornare il commit (revision a cui fa riferimento)
492
+
493
+ # leggo il file branch_names / recupero i nomi dei branch / riscrivo tutto
494
+ projects = ''
495
+ File.open('branch_names', 'r') do |file|
496
+ file.each_line do |line|
497
+ projects = JSON.parse(line)
498
+ end
923
499
  end
924
500
 
925
- stack_name_borat = "ecs-task-borat-qa-#{deploy_id}"
926
- git_checkout_version('borat', @projects["borat"][:revision])
927
- stack_body = IO.read('projects/borat/deploy/task.yml')
928
- parameters = [
929
- {
930
- parameter_key: "Environment",
931
- parameter_value: "qa"
932
- },
933
- {
934
- parameter_key: "ReleaseVersion",
935
- parameter_value: "#{@projects["borat"][:revision]}-#{deploy_id}"
936
- },
937
- {
938
- parameter_key: "ECSClusterName",
939
- parameter_value: @ecs_cluster_name
940
- },
941
- {
942
- parameter_key: "TaskDesiredCount",
943
- parameter_value: "1"
944
- },
945
- {
946
- parameter_key: "ALBShortName",
947
- parameter_value: "borat-qa-#{deploy_id}"[0..31]
948
- },
949
- {
950
- parameter_key: "HostnamePattern",
951
- parameter_value: "backoffice-#{@dns_record_identifier}.qa.colaster.com"
952
- },
953
- {
954
- parameter_key: "HostnamePatternPriority",
955
- parameter_value: (hostname_pattern_priority.to_i + 30).to_s
956
- }
957
- ]
958
- if stack_exists?(stack_name_borat)
959
- cur_version = get_currently_deployed_version(stack_name_borat)
960
- update_stack(stack_name_borat, stack_body, parameters, tags) unless cur_version.include?(@projects["borat"][:revision])
961
- else
962
- create_stack(stack_name_borat, stack_body, parameters, tags)
501
+ projects.each do |key, project|
502
+ @projects[key] = select_branch_to_deploy(key, project['name'])
503
+ @projects[key]['default_branch'] = project['default_branch']
963
504
  end
964
505
 
965
- git_checkout_version('backoffice', @projects["backoffice"][:revision])
966
- stack_name_backoffice = "ecs-task-backoffice-qa-#{deploy_id}"
967
- stack_body = IO.read('projects/backoffice/deploy/task.yml')
968
- parameters = [
969
- {
970
- parameter_key: "Environment",
971
- parameter_value: "qa"
972
- },
973
- {
974
- parameter_key: "ReleaseVersion",
975
- parameter_value: "#{@projects["backoffice"][:revision]}-#{deploy_id}"
976
- },
977
- {
978
- parameter_key: "TaskDesiredCount",
979
- parameter_value: "1"
980
- },
981
- {
982
- parameter_key: "ECSClusterName",
983
- parameter_value: @ecs_cluster_name
984
- },
985
- {
986
- parameter_key: "ALBShortName",
987
- parameter_value: "backoffice-qa-#{deploy_id}"[0..31]
988
- },
989
- {
990
- parameter_key: "HostnamePattern",
991
- parameter_value: "backoffice-legacy-#{@dns_record_identifier}.qa.colaster.com"
992
- },
993
- {
994
- parameter_key: "HostnamePatternPriority",
995
- parameter_value: (hostname_pattern_priority.to_i + 10).to_s
996
- }
997
- ]
998
- if stack_exists?(stack_name_backoffice)
999
- cur_version = get_currently_deployed_version(stack_name_backoffice)
1000
- update_stack(stack_name_backoffice, stack_body, parameters, tags) unless cur_version.include?(@projects["backoffice"][:revision])
506
+ File.open('branch_names', 'w') { |file| file.write(JSON.generate(@projects)) }
507
+
508
+ update_drone_yml!
509
+
510
+ `git add branch_names .drone.yml`
511
+ `git commit -m 'update'`
512
+ `git push && git checkout master`
513
+ end
514
+
515
+ def qainit_deploy_shutdown!(selection = nil)
516
+ `git checkout master && git pull && git remote prune origin`
517
+ # leggiamo i nomi dei branch
518
+ former_branches = `git branch -a | grep remotes/ | grep -v HEAD | sed 's/ remotes\\/origin\\///g'`.split "\n"
519
+ if selection.nil?
520
+ # stampiamo la lista
521
+ chosen_branch = choose do |menu|
522
+ menu.prompt = "Scegli il QA che vuoi spegnere: ".cyan
523
+ menu.shell = true
524
+ git_user = get_git_user
525
+ former_branches.delete('master')
526
+ former_branches.each_with_index do |branch, index|
527
+ msg = index.odd? ? branch.white : branch.light_yellow # uno bianco e uno giallo alternati
528
+ msg = branch.start_with?(git_user) ? msg.on_blue : msg.on_black # i branch creati da chi lancia l'update sono su sfondo blu
529
+ menu.choice(msg) { branch }
530
+ end
531
+ end
1001
532
  else
1002
- create_stack(stack_name_backoffice, stack_body, parameters, tags)
533
+ chosen_branch = selection
1003
534
  end
535
+ # checkout master, checkout branch, pull branch, push sul branch con commit vuoto
536
+ `git checkout master && git checkout #{chosen_branch} && git pull`
537
+ `git commit --allow-empty -m 'shutdown' && git push && git checkout master`
538
+ end
1004
539
 
1005
- if deploy_crash?
1006
- git_checkout_version('crash', @projects['crash'][:revision])
1007
- stack_name_crash = "ecs-task-crash-qa-#{deploy_id}"
1008
- stack_body = IO.read('projects/crash/deploy/task.yml')
1009
- parameters = [
1010
- {
1011
- parameter_key: 'Environment',
1012
- parameter_value: 'qa'
1013
- },
1014
- {
1015
- parameter_key: 'ReleaseVersion',
1016
- parameter_value: "#{@projects['crash'][:revision]}-#{deploy_id}"
1017
- },
1018
- {
1019
- parameter_key: 'TaskDesiredCount',
1020
- parameter_value: '1'
1021
- },
1022
- {
1023
- parameter_key: 'ECSClusterName',
1024
- parameter_value: @ecs_cluster_name
1025
- },
1026
- {
1027
- parameter_key: 'ALBShortName',
1028
- parameter_value: "crash-qa-#{deploy_id}"[0..31]
1029
- },
1030
- {
1031
- parameter_key: 'HostnamePattern',
1032
- parameter_value: "crash-#{@dns_record_identifier}.qa.colaster.com"
1033
- },
1034
- {
1035
- parameter_key: 'HostnamePatternPriority',
1036
- parameter_value: (hostname_pattern_priority.to_i + 10).to_s
1037
- }
1038
- ]
1039
- if stack_exists?(stack_name_crash)
1040
- cur_version = get_currently_deployed_version(stack_name_crash)
1041
- update_stack(stack_name_crash, stack_body, parameters, tags) unless cur_version.include?(@projects["crash"][:revision])
1042
- else
1043
- create_stack(stack_name_crash, stack_body, parameters, tags)
540
+ def qainit_drone_shutdown!
541
+ output "Recupero le informazioni sui QA attivi..."
542
+ stack_list, envs = get_stacks
543
+
544
+ env_hash = "qa-" + get_deploy_id
545
+
546
+ cluster_stack_name = nil
547
+ stacks_to_delete = []
548
+ stack_list.each do |stack|
549
+ if stack.stack_name.match(/#{env_hash}$/)
550
+ if stack.stack_name.match(/ecs-cluster/)
551
+ cluster_stack_name = stack.stack_name
552
+ else
553
+ break unless stack.stack_name.match(/#{env_hash}$/)
554
+ stacks_to_delete.push(stack.stack_name)
555
+ delete_stack(stack.stack_name)
556
+ end
1044
557
  end
1045
558
  end
1046
559
 
1047
- # Waiting for prima healtcheck dependencies
1048
- wait_for_stack_ready(stack_name_urania) unless stack_ready?(stack_name_urania)
1049
- wait_for_stack_ready(stack_name_bburago) unless stack_ready?(stack_name_bburago)
1050
- wait_for_stack_ready(stack_name_hal9000) unless stack_ready?(stack_name_hal9000)
1051
- wait_for_stack_ready(stack_name_assange) unless stack_ready?(stack_name_assange)
1052
- wait_for_stack_ready(stack_name_fidaty) unless stack_ready?(stack_name_fidaty)
1053
-
1054
- stack_name_bolla = "ecs-task-bolla-qa-#{deploy_id}"
1055
- git_checkout_version('bolla', @projects["bolla"][:revision])
1056
- stack_body = YAML.load_file('projects/bolla/deploy/task.yml')
1057
- stack_body['Resources']['ECSServiceBolla']['Properties'].reject!{ |k| ['LoadBalancers', 'Role'].include?(k) }
1058
- stack_body = stack_body.to_yaml
1059
- parameters = [
1060
- {
1061
- parameter_key: "Environment",
1062
- parameter_value: "qa"
1063
- },
1064
- {
1065
- parameter_key: "ReleaseVersion",
1066
- parameter_value: "#{@projects["bolla"][:revision]}-#{deploy_id}"
1067
- },
1068
- {
1069
- parameter_key: "TaskDesiredCount",
1070
- parameter_value: "1"
1071
- },
1072
- {
1073
- parameter_key: "ECSClusterName",
1074
- parameter_value: @ecs_cluster_name
1075
- },
1076
- {
1077
- parameter_key: "ALBShortName",
1078
- parameter_value: "bolla-qa-#{deploy_id}"[0..31]
1079
- },
1080
- {
1081
- parameter_key: "HostnamePattern",
1082
- parameter_value: "bolla-#{@dns_record_identifier}.qa.colaster.com"
1083
- },
1084
- {
1085
- parameter_key: "HostnamePatternPriority",
1086
- parameter_value: hostname_pattern_priority
1087
- },
1088
- ]
1089
- if stack_exists?(stack_name_bolla)
1090
- cur_version = get_currently_deployed_version(stack_name_bolla)
1091
- update_stack(stack_name_bolla, stack_body, parameters, tags) unless cur_version.include?(@projects["bolla"][:revision])
1092
- else
1093
- create_stack(stack_name_bolla, stack_body, parameters, tags)
1094
- end
560
+ cluster_stack_name = "ecs-cluster-#{env_hash}"
561
+ if stack_exists?(cluster_stack_name)
562
+ aggregator_enabled = get_stack_tags(cluster_stack_name).detect do |tag|
563
+ tag.key === "hostname_pattern_priority" and tag.value === "1"
564
+ end.is_a?(Aws::CloudFormation::Types::Tag)
1095
565
 
1096
- stack_name_web = "ecs-task-web-qa-#{deploy_id}"
1097
- git_checkout_version('prima', @projects["prima"][:revision])
1098
- stack_body = IO.read('projects/prima/app/cloudformation/tasks/web.yml')
1099
- parameters = [
1100
- {
1101
- parameter_key: "Environment",
1102
- parameter_value: "qa"
1103
- },
1104
- {
1105
- parameter_key: "ReleaseVersion",
1106
- parameter_value: "#{@projects["prima"][:revision]}-#{deploy_id}"
1107
- },
1108
- {
1109
- parameter_key: "TaskDesiredCount",
1110
- parameter_value: "1"
1111
- },
1112
- {
1113
- parameter_key: "ECSClusterName",
1114
- parameter_value: @ecs_cluster_name
1115
- },
1116
- {
1117
- parameter_key: "ALBShortName",
1118
- parameter_value: "web-qa-#{deploy_id}"[0..31]
1119
- },
1120
- {
1121
- parameter_key: "WebQaBaseHostname",
1122
- parameter_value: "#{@dns_record_identifier}.qa.colaster.com"
1123
- },
1124
- {
1125
- parameter_key: "HostnamePattern",
1126
- parameter_value: "ww*-#{@dns_record_identifier}.qa.colaster.com"
1127
- },
1128
- {
1129
- parameter_key: "HostnamePatternPriority",
1130
- parameter_value: hostname_pattern_priority
1131
- },
1132
- {
1133
- parameter_key: "HostnamePatternAggregatorPriority",
1134
- parameter_value: (hostname_pattern_priority.to_i + 1).to_s
1135
- }
1136
- ]
1137
- if stack_exists?(stack_name_web)
1138
- cur_version = get_currently_deployed_version(stack_name_web)
1139
- update_stack(stack_name_web, stack_body, parameters, tags) unless cur_version.include?(@projects["prima"][:revision])
1140
- else
1141
- create_stack(stack_name_web, stack_body, parameters, tags)
566
+ if aggregator_enabled
567
+ dns_to_staging(env_hash)
568
+ end
1142
569
  end
1143
570
 
1144
- stack_name_consumer = "ecs-task-consumer-qa-#{deploy_id}"
1145
- git_checkout_version('prima', @projects["prima"][:revision])
1146
- stack_body = IO.read('projects/prima/app/cloudformation/tasks/consumer.yml')
1147
- parameters = [
1148
- {
1149
- parameter_key: "Environment",
1150
- parameter_value: "qa"
1151
- },
1152
- {
1153
- parameter_key: "ReleaseVersion",
1154
- parameter_value: "#{@projects["prima"][:revision]}-#{deploy_id}"
1155
- },
1156
- {
1157
- parameter_key: "ECSClusterName",
1158
- parameter_value: @ecs_cluster_name
1159
- }
1160
- ]
1161
- if stack_exists?(stack_name_consumer)
1162
- cur_version = get_currently_deployed_version(stack_name_consumer)
1163
- update_stack(stack_name_consumer, stack_body, parameters, tags) unless cur_version.include?(@projects["prima"][:revision])
1164
- else
1165
- create_stack(stack_name_consumer, stack_body, parameters, tags)
571
+ # Se non ha finito di cancellare le altre non si puo' cancellare il cluster
572
+ output "Attendo 10 secondi per poter eliminare il cluster ECS"
573
+
574
+ while stacks_to_delete.length > 0
575
+ sleep 13
576
+ stacks_to_delete.each do |stack_name|
577
+ stacks_to_delete = stacks_to_delete - [stack_name] unless stack_exists?(stack_name)
578
+ end
579
+ output "Stack ancora attivi: #{stacks_to_delete.length.to_s}. Attendo altri 10 secondi per eliminare il cluster ECS"
1166
580
  end
1167
581
 
1168
- wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
1169
- wait_for_stack_ready(stack_name_consumer) unless stack_ready?(stack_name_consumer)
1170
- wait_for_stack_ready(stack_name_backoffice) unless stack_ready?(stack_name_backoffice)
1171
- wait_for_stack_ready(stack_name_ermes) unless stack_ready?(stack_name_ermes)
1172
- wait_for_stack_ready(stack_name_fidaty) unless stack_ready?(stack_name_fidaty)
1173
- wait_for_stack_ready(stack_name_peano) unless stack_ready?(stack_name_peano)
1174
- wait_for_stack_ready(stack_name_rogoreport) unless stack_ready?(stack_name_rogoreport)
1175
- wait_for_stack_ready(stack_name_borat) unless stack_ready?(stack_name_borat)
1176
- wait_for_stack_ready(stack_name_bolla) unless stack_ready?(stack_name_bolla)
1177
- wait_for_stack_ready(stack_name_crash) unless stack_ready?(stack_name_crash) || !deploy_crash?
1178
-
1179
- update_service_defaults(stack_name_web)
1180
- update_service_defaults(stack_name_consumer)
1181
- update_service_defaults(stack_name_urania)
1182
- update_service_defaults(stack_name_backoffice)
1183
- update_service_defaults(stack_name_ermes)
1184
- update_service_defaults(stack_name_bburago)
1185
- update_service_defaults(stack_name_hal9000)
1186
- update_service_defaults(stack_name_fidaty)
1187
- update_service_defaults(stack_name_peano)
1188
- update_service_defaults(stack_name_rogoreport)
1189
- update_service_defaults(stack_name_assange)
1190
- update_service_defaults(stack_name_borat)
1191
- update_service_defaults(stack_name_bolla)
1192
- update_service_defaults(stack_name_crash) unless stack_ready?(stack_name_crash) || !deploy_crash?
1193
-
1194
- prima_hostname = get_route53_hostname(stack_name_web)
1195
- urania_hostname = get_route53_hostname(stack_name_urania)
1196
- bburago_hostname = get_route53_hostname(stack_name_bburago)
1197
- hal9000_hostname = get_route53_hostname(stack_name_hal9000)
1198
- ermes_hostname = get_route53_hostname(stack_name_ermes)
1199
- fidaty_hostname = get_route53_hostname(stack_name_fidaty)
1200
- peano_hostname = get_route53_hostname(stack_name_peano)
1201
- backoffice_hostname = get_route53_hostname(stack_name_backoffice)
1202
- assange_hostname = get_route53_hostname(stack_name_assange)
1203
- borat_hostname = get_route53_hostname(stack_name_borat)
1204
- bolla_hostname = get_route53_hostname(stack_name_bolla)
1205
- deploy_crash? && crash_hostname = get_route53_hostname(stack_name_crash)
1206
-
1207
- launch_marley ec2_ip_address(asg_stack_name), prima_hostname, borat_hostname
1208
-
1209
- projects_text = "
1210
- > Prima url: https://#{prima_hostname}
1211
- > Prima RI url: https://#{prima_hostname.sub("www", "wwwri")}
1212
- > Backoffice (Borat) url: https://#{borat_hostname}
1213
- > Urania url: http://#{urania_hostname}:81
1214
- > Bburago url: http://#{bburago_hostname}:83
1215
- > Ermes url: http://#{ermes_hostname}:10002
1216
- > Hal9000 url: http://#{hal9000_hostname}:10031
1217
- > Fidaty url: http://#{fidaty_hostname}:10021
1218
- > Peano url: http://#{peano_hostname}:10039
1219
- > Bolla url: http://#{ec2_ip_address(asg_stack_name)}:10046
1220
- > Assange url: https://#{assange_hostname}
1221
- > Backoffice (legacy) url: https://#{backoffice_hostname}"
1222
- projects_text.concat "
1223
- > Crash url: https://#{crash_hostname}" if deploy_crash?
1224
- projects_text.concat "
1225
- > RabbitMQ url: http://#{ec2_ip_address(asg_stack_name)}:15672
1226
- > Supervisor url: http://#{ec2_ip_address(asg_stack_name)}:9001
1227
- > Elasticsearch url: http://#{ec2_ip_address(asg_stack_name)}:9200
1228
- > Elasticsearch 2 url: http://#{ec2_ip_address(asg_stack_name)}:9201
1229
- > SSH connection: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no githubUsername@#{ec2_ip_address(asg_stack_name)}\n"
1230
- output projects_text.cyan
1231
- output "Deploy effettuato, everything is awesome!\n".green
582
+ delete_stack(cluster_stack_name) if stack_exists?(cluster_stack_name)
583
+ delete_stack(@base_stack_name_alb + env_hash[3..8]) if stack_exists?(@base_stack_name_alb + env_hash[3..8])
584
+ delete_stack(@base_stack_name_alb_ws + env_hash[3..8]) if stack_exists?(@base_stack_name_alb_ws + env_hash[3..8])
585
+ `git checkout master && git push origin --delete ${DRONE_BRANCH}`
586
+ output "Cancello il record DNS utilizzato da Lighthouse"
587
+ delete_lighthouse_dns()
588
+ output "Finito!".green
1232
589
  end
1233
590
 
1234
- def get_route53_hostname(stack_name)
1235
- case
1236
- when stack_name.include?('web')
1237
- host = "www-#{@dns_record_identifier}.qa.colaster.com"
1238
- when stack_name.include?('urania')
1239
- host = "urania-#{@dns_record_identifier}.qa.colaster.com"
1240
- when stack_name.include?('backoffice')
1241
- host = "backoffice-legacy-#{@dns_record_identifier}.qa.colaster.com"
1242
- when stack_name.include?('bburago')
1243
- host = "bburago-#{@dns_record_identifier}.qa.colaster.com"
1244
- when stack_name.include?('hal9000')
1245
- host = "hal9000-#{@dns_record_identifier}.qa.colaster.com"
1246
- when stack_name.include?('fidaty')
1247
- host = "fidaty-#{@dns_record_identifier}.qa.colaster.com"
1248
- when stack_name.include?('peano')
1249
- host = "peano-#{@dns_record_identifier}.qa.colaster.com"
1250
- when stack_name.include?('assange')
1251
- host = "assange-#{@dns_record_identifier}.qa.colaster.com"
1252
- when stack_name.include?('borat')
1253
- host = "backoffice-#{@dns_record_identifier}.qa.colaster.com"
1254
- when stack_name.include?('crash')
1255
- host = "crash-#{@dns_record_identifier}.qa.colaster.com"
1256
- when stack_name.include?('ermes')
1257
- host = "ermes-#{@dns_record_identifier}.qa.colaster.com"
1258
- when stack_name.include?('bolla')
1259
- host = "bolla-#{@dns_record_identifier}.qa.colaster.com"
591
+ def qainit_write_output(file_message, output_message)
592
+ `mkdir -p /etc/qainit-output`
593
+ qa_file_name = "/etc/qainit-output/url_qa"
594
+ File.open(qa_file_name + '.txt', 'w') { |file| file.write(file_message) }
595
+ output "#{output_message} #{qa_file_name}".green
596
+ end
597
+
598
+ def update_drone_yml!()
599
+ drone_yml = File.read('.drone.yml')
600
+ @projects.each do |key, project|
601
+ drone_yml = drone_yml.gsub(/#{key}@.+\n/, "#{key}@#{project['revision']}\n")
602
+ end
603
+ File.open(".drone.yml", "w") do |f|
604
+ f.write(drone_yml)
1260
605
  end
1261
- host
1262
606
  end
1263
607
 
1264
- def ec2_ip_address(asg_stack_name)
1265
- resp = @cf.describe_stack_resource({
1266
- stack_name: asg_stack_name,
1267
- logical_resource_id: 'ECSAutoScalingGroup'
1268
- })
1269
- resp = @asg.describe_auto_scaling_groups({
1270
- auto_scaling_group_names: [resp.stack_resource_detail.physical_resource_id],
1271
- max_records: 1
1272
- })
1273
- instance_id = resp.auto_scaling_groups[0].instances[0].instance_id
1274
- resp = @ec2.describe_instances({instance_ids: [instance_id]})
1275
- resp.reservations[0].instances[0].private_ip_address
608
+ def get_deploy_id
609
+ if @deploy_id
610
+ @deploy_id
611
+ else
612
+ @deploy_id = Digest::MD5.hexdigest(ENV['DRONE_BRANCH'])
613
+ @deploy_id
614
+ end
1276
615
  end
1277
616
 
1278
617
  def get_alb_host(stack_name)
@@ -1289,551 +628,53 @@ class Release
1289
628
  logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1290
629
  when stack_name.include?('fidaty')
1291
630
  logical_resource_id = 'EcsApplicationLoadBalancerInternal'
631
+ when stack_name.include?('activia')
632
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
633
+ when stack_name.include?('skynet')
634
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
635
+ when stack_name.include?('roger')
636
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1292
637
  when stack_name.include?('alb-http-public')
1293
638
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1294
639
  when stack_name.include?('alb-ws-public')
1295
640
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1296
641
  when stack_name.include?('peano')
1297
642
  logical_resource_id = 'EcsApplicationLoadBalancerInternal'
643
+ when stack_name.include?('leftorium')
644
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1298
645
  when stack_name.include?('assange')
1299
646
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1300
647
  when stack_name.include?('borat')
1301
648
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1302
649
  when stack_name.include?('crash')
1303
650
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
651
+ when stack_name.include?('rachele')
652
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
653
+ when stack_name.include?('starsky')
654
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
655
+ when stack_name.include?('hutch')
656
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
657
+ when stack_name.include?('maia')
658
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
659
+ when stack_name.include?('legion')
660
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1304
661
  end
1305
- resp = @cf.describe_stack_resource({
1306
- stack_name: stack_name,
1307
- logical_resource_id: logical_resource_id
1308
- })
1309
- resp = @alb.describe_load_balancers({
1310
- load_balancer_arns: [resp.stack_resource_detail.physical_resource_id]
1311
- })
662
+ resp = describe_stack_resource(stack_name, logical_resource_id)
663
+ resp = describe_load_balancers([resp.stack_resource_detail.physical_resource_id])
1312
664
  resp.load_balancers[0].dns_name
1313
665
  end
1314
666
 
1315
- def update_service_defaults(stack_name)
1316
- case
1317
- when stack_name.include?('web')
1318
- logical_resource_id = 'ECSServiceWeb'
1319
- when stack_name.include?('consumer')
1320
- logical_resource_id = 'ECSServiceConsumer'
1321
- when stack_name.include?('urania')
1322
- logical_resource_id = 'ECSServiceUrania'
1323
- when stack_name.include?('backoffice')
1324
- logical_resource_id = 'ECSServiceBackoffice'
1325
- when stack_name.include?('ermes')
1326
- logical_resource_id = 'ECSServiceErmes'
1327
- when stack_name.include?('bburago')
1328
- logical_resource_id = 'ECSServiceBburago'
1329
- when stack_name.include?('hal9000')
1330
- logical_resource_id = 'ECSServiceHal9000'
1331
- when stack_name.include?('fidaty')
1332
- logical_resource_id = 'ECSServiceFidaty'
1333
- when stack_name.include?('peano')
1334
- logical_resource_id = 'ECSServicePeano'
1335
- when stack_name.include?('rogoreport')
1336
- logical_resource_id = 'ECSServiceRogoreport'
1337
- when stack_name.include?('assange')
1338
- logical_resource_id = 'ECSServiceAssange'
1339
- when stack_name.include?('borat')
1340
- logical_resource_id = 'ECSServiceBorat'
1341
- when stack_name.include?('crash')
1342
- logical_resource_id = 'ECSServiceCrash'
1343
- when stack_name.include?('bolla')
1344
- logical_resource_id = 'ECSServiceBolla'
667
+ def deploy_pyxis?
668
+ if defined? @deploy_pyxis
669
+ @deploy_pyxis
1345
670
  else
1346
- raise "Service name non gestito per lo stack #{stack_name}"
1347
- end
1348
- resp = @cf.describe_stack_resource(
1349
- stack_name: stack_name,
1350
- logical_resource_id: logical_resource_id
1351
- )
1352
- @ecs.update_service(
1353
- cluster: @ecs_cluster_name,
1354
- service: resp.stack_resource_detail.physical_resource_id,
1355
- deployment_configuration: {
1356
- minimum_healthy_percent: 0,
1357
- maximum_percent: 100
1358
- }
1359
- )
1360
- end
1361
-
1362
- def create_urania_artifact(revision)
1363
- output "Preparo l'artifact urania .zip\n".yellow
671
+ pyxis_updated = `git log -p -1 --unified=0 | grep pyxis-npm:`.length > 0
1364
672
 
1365
- git_checkout_version('urania', revision)
673
+ update_pyxis = !@projects['pyxis-npm'].empty? && @projects['pyxis-npm']['name'] != 'master' && pyxis_updated
1366
674
 
1367
- Dir.chdir 'projects/urania'
1368
-
1369
- decrypt_secrets()
1370
-
1371
- [
1372
- "docker-compose build web",
1373
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh urania_web \
1374
- '-c' 'mix local.hex --force && mix hex.info && \
1375
- mix deps.get && mix compile && mix deps.compile && \
1376
- rm -rf _build/qa/rel/ && \
1377
- mix release --env=qa'"
1378
- ].each do |cmd|
1379
- execute_command cmd
1380
- end
1381
-
1382
- artifact_path = Dir.glob("_build/qa/rel/urania/releases/*/urania.tar.gz").first
1383
- upload_artifact(artifact_path, "microservices/urania/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1384
-
1385
- Dir.chdir '../../'
1386
- end
1387
-
1388
- def create_ermes_artifact(revision, deploy_id)
1389
- output "Preparo l'artifact ermes .zip\n".yellow
1390
-
1391
- git_checkout_version('ermes', revision)
1392
-
1393
- Dir.chdir 'projects/ermes'
1394
-
1395
- stack_name_web = 'ecs-task-web-qa-notneeded'
1396
- web_qa_host = get_route53_hostname(stack_name_web)
1397
- stack_name_peano = 'ecs-task-peano-qa-notneeded'
1398
- peano_qa_host = "#{get_route53_hostname(stack_name_peano)}:10039"
1399
-
1400
- decrypt_secrets()
1401
-
1402
- [
1403
- "if echo `docker network ls` | grep crash_default; \
1404
- then echo 'crash_default network already existing'; \
1405
- else docker network create crash_default; fi",
1406
- 'docker-compose build web',
1407
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh ermes_web \
1408
- '-c' 'sed -i \"s/peano-qa-host/#{peano_qa_host}/g\" config/qa.exs && \
1409
- sed -i \"s/web-qa-host/#{web_qa_host}/g\" config/qa.exs && \
1410
- mix local.hex --force && mix hex.info && \
1411
- mix deps.get && mix compile && mix deps.compile && \
1412
- mix phx.digest && \
1413
- rm -rf _build/qa/rel/ && \
1414
- mix release --env=qa'",
1415
- "if echo `docker ps` | grep crash; \
1416
- then echo 'cannot delete crash_default network'; \
1417
- else docker network rm crash_default; fi "
1418
- ].each do |cmd|
1419
- execute_command cmd
1420
- end
1421
-
1422
- artifact_path = Dir.glob("_build/qa/rel/ermes/releases/*/ermes.tar.gz").first
1423
- upload_artifact(artifact_path, "microservices/ermes/#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1424
-
1425
- Dir.chdir '../../'
1426
- end
1427
-
1428
- def deploy_crash?
1429
- !@projects['crash'].empty? && !@projects['crash'][:default_branch]
1430
- end
1431
-
1432
- def create_crash_artifact(revision, deploy_id)
1433
- output "Preparo l'artifact crash .zip\n".yellow
1434
-
1435
- git_checkout_version('crash', revision)
1436
-
1437
- Dir.chdir 'projects/crash'
1438
-
1439
- stack_name_web = 'ecs-task-web-qa-notneeded'
1440
- web_qa_host = get_route53_hostname(stack_name_web)
1441
- stack_name_crash = 'ecs-task-crash-qa-notneeded'
1442
- crash_qa_host = get_route53_hostname(stack_name_crash)
1443
-
1444
- ws_endpoint = "wss://#{crash_qa_host}/socket/websocket?vsn=1.0.0"
1445
- frontend_endpoint = "https://#{crash_qa_host}/graphql"
1446
-
1447
- decrypt_secrets()
1448
-
1449
- [
1450
- 'mv docker-compose-ci.yml docker-compose.yml',
1451
- 'docker-compose build web',
1452
- "docker-compose run -w $PWD -e WS_ENDPOINT=#{ws_endpoint} -e GRAPHQL_ENDPOINT=#{frontend_endpoint} -e MIX_ENV=qa web \
1453
- '-c' 'sed -i \"s/web-qa-host/#{web_qa_host}/g\" config/qa.exs && \
1454
- sed -i \"s/crash-qa-host/#{crash_qa_host}/g\" config/qa.exs && \
1455
- mix local.hex --force && mix hex.info && \
1456
- mix deps.get && \
1457
- cd assets && \
1458
- yarn --cache-folder ~/.cache/yarn && \
1459
- ./node_modules/.bin/elm-github-install && \
1460
- NODE_ENV=production sysconfcpus -n 2 ./node_modules/.bin/webpack -p --config config/webpack.config.prod.js && \
1461
- cd ../ && \
1462
- mix release.clean --implode --no-confirm && \
1463
- mix phx.digest && \
1464
- mix deps.clean --all && \
1465
- mix deps.get && \
1466
- mix compile && mix release --env=qa'",
1467
- 'docker-compose down'
1468
- ].each do |cmd|
1469
- execute_command cmd
675
+ @deploy_pyxis = update_pyxis
676
+ return update_pyxis
1470
677
  end
1471
-
1472
- artifact_path = Dir.glob('_build/qa/rel/crash/releases/*/crash.tar.gz').first
1473
- upload_artifact(artifact_path, "microservices/crash/#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1474
-
1475
- Dir.chdir '../../'
1476
- end
1477
-
1478
- def create_bburago_artifact(revision)
1479
- output "Preparo l'artifact bburago .zip\n".yellow
1480
-
1481
- git_checkout_version('bburago', revision)
1482
-
1483
- Dir.chdir 'projects/bburago'
1484
-
1485
- decrypt_secrets()
1486
-
1487
- [
1488
- "docker-compose build web",
1489
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh bburago_web \
1490
- '-c' 'mix local.hex --force && mix hex.info && \
1491
- mix deps.get && mix compile && mix deps.compile && \
1492
- rm -rf _build/qa/rel/ && \
1493
- mix release --env=qa'"
1494
- ].each do |cmd|
1495
- execute_command cmd
1496
- end
1497
-
1498
- artifact_path = Dir.glob("_build/qa/rel/bburago/releases/*/bburago.tar.gz").first
1499
- upload_artifact(artifact_path, "microservices/bburago/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1500
-
1501
- Dir.chdir '../../'
1502
- end
1503
-
1504
- def create_hal9000_artifact(revision)
1505
- output "Preparo l'artifact hal9000 .zip\n".yellow
1506
-
1507
- git_checkout_version('hal9000', revision)
1508
-
1509
- Dir.chdir 'projects/hal9000'
1510
-
1511
- decrypt_secrets()
1512
-
1513
- [
1514
- "docker-compose build web",
1515
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh hal9000_web \
1516
- '-c' 'mix local.hex --force && mix hex.info && \
1517
- mix deps.get && mix compile && mix deps.compile && \
1518
- mix phx.digest && \
1519
- rm -rf _build/qa/rel/ && \
1520
- mix release --env=qa'"
1521
- ].each do |cmd|
1522
- execute_command cmd
1523
- end
1524
-
1525
- artifact_path = Dir.glob("_build/qa/rel/hal9000/releases/*/hal9000.tar.gz").first
1526
- upload_artifact(artifact_path, "microservices/hal9000/#{revision}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1527
-
1528
- Dir.chdir '../../'
1529
- end
1530
-
1531
- def create_fidaty_artifact(revision, deploy_id)
1532
- output "Preparo l'artifact fidaty .zip\n".yellow
1533
-
1534
- git_checkout_version('fidaty', revision)
1535
-
1536
- Dir.chdir 'projects/fidaty'
1537
-
1538
- stack_name_web = "ecs-task-web-qa-notneeded"
1539
- web_qa_host = get_route53_hostname(stack_name_web)
1540
-
1541
- stack_name_peano = "ecs-task-peano-qa-notneeded"
1542
- peano_qa_host = "#{get_route53_hostname(stack_name_peano)}:10039"
1543
-
1544
- decrypt_secrets()
1545
-
1546
- [
1547
- "docker-compose build web",
1548
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh fidaty_web \
1549
- '-c' 'sed -i \"s/web-qa-host/#{web_qa_host}/g\" config/qa.exs && \
1550
- sed -i \"s/peano-qa-host/#{peano_qa_host}/g\" config/qa.exs && \
1551
- mix local.hex --force && mix hex.info && \
1552
- mix deps.get && mix compile && mix deps.compile && \
1553
- mix phx.digest && \
1554
- rm -rf _build/qa/rel/ && \
1555
- mix release --env=qa'"
1556
- ].each do |cmd|
1557
- execute_command cmd
1558
- end
1559
-
1560
- artifact_path = Dir.glob("_build/qa/rel/fidaty/releases/*/fidaty.tar.gz").first
1561
- upload_artifact(artifact_path, "microservices/fidaty/#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1562
-
1563
- Dir.chdir '../../'
1564
- end
1565
-
1566
- def create_peano_artifact(revision, deploy_id)
1567
- output "Preparo l'artifact peano .zip\n".yellow
1568
-
1569
- git_checkout_version('peano', revision)
1570
-
1571
- stack_name_assange = "ecs-task-assange-qa-notneeded"
1572
- assange_qa_host = get_route53_hostname(stack_name_assange)
1573
- stack_name_web = 'ecs-task-web-qa-notneeded'
1574
- web_qa_host = get_route53_hostname(stack_name_web)
1575
-
1576
- Dir.chdir 'projects/peano'
1577
-
1578
- stop_unless is_branch_compatible_with_current_twig_version?("peano"), "Il tuo branch del progetto peano non e' compatibile con questa versione di twig, devi REBASARE DA MASTER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!".red
1579
-
1580
- decrypt_secrets()
1581
-
1582
- [
1583
- "docker-compose build web",
1584
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh peano_web \
1585
- '-c' 'mix local.hex --force && mix hex.info && \
1586
- sed -i \"s/assange-qa-host/#{assange_qa_host}/g\" config/qa.exs && \
1587
- sed -i \"s/web-qa-host/#{web_qa_host}/g\" config/qa.exs && \
1588
- mix deps.get && mix compile && mix deps.compile && \
1589
- rm -rf _build/qa/rel/ && \
1590
- mix release --env=qa'"
1591
- ].each do |cmd|
1592
- execute_command cmd
1593
- end
1594
-
1595
- artifact_path = Dir.glob("_build/qa/rel/peano/releases/*/peano.tar.gz").first
1596
- upload_artifact(artifact_path, "microservices/peano/#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1597
-
1598
- Dir.chdir '../../'
1599
- end
1600
-
1601
- def create_rogoreport_artifact(revision, deploy_id)
1602
- output "Preparo l'artifact rogoreport .zip\n".yellow
1603
-
1604
- git_checkout_version('rogoreport', revision)
1605
-
1606
- Dir.chdir 'projects/rogoreport'
1607
-
1608
- stack_name_peano = 'ecs-task-peano-qa-notneeded'
1609
- stack_name_web = 'ecs-task-web-qa-notneeded'
1610
- peano_qa_host = "#{get_route53_hostname(stack_name_peano)}:10039"
1611
- web_qa_host = get_route53_hostname(stack_name_web)
1612
-
1613
- decrypt_secrets()
1614
-
1615
- [
1616
- "docker-compose build web",
1617
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh rogoreport_web \
1618
- '-c' 'sed -i \"s/peano-qa-host/#{peano_qa_host}/g\" apps/escile/config/qa.exs && \
1619
- sed -i \"s/web-qa-host/#{web_qa_host}/g\" apps/escile/config/qa.exs && \
1620
- cat apps/escile/config/qa.exs && \
1621
- mix local.hex --force && mix hex.info && \
1622
- mix deps.get && mix compile && mix deps.compile && \
1623
- rm -rf _build/qa/rel/ && \
1624
- mix release --name=rogoreport_qa --env=qa'"
1625
- ].each do |cmd|
1626
- execute_command cmd
1627
- end
1628
-
1629
- artifact_path = Dir.glob("_build/qa/rel/rogoreport*/releases/*/rogoreport*.tar.gz").first
1630
- upload_artifact(artifact_path, "microservices/rogoreport/rogoreport_qa-#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1631
-
1632
- Dir.chdir '../../'
1633
- end
1634
-
1635
- def create_assange_artifact(revision, deploy_id)
1636
- output "Preparo l'artifact assange .zip\n".yellow
1637
-
1638
- git_checkout_version('assange', revision)
1639
-
1640
- Dir.chdir 'projects/assange'
1641
-
1642
- stack_name_web = 'ecs-task-web-qa-notneeded'
1643
- web_qa_host = get_route53_hostname(stack_name_web)
1644
-
1645
- decrypt_secrets()
1646
-
1647
- [
1648
- "docker-compose build web",
1649
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh assange_web \
1650
- '-c' 'mix local.hex --force && mix hex.info && \
1651
- sed -i \"s/web-qa-host/#{web_qa_host}/g\" config/qa.exs && \
1652
- mix deps.get && mix compile && mix deps.compile && \
1653
- mix phx.digest && \
1654
- rm -rf _build/qa/rel/ && \
1655
- mix release --env=qa'"
1656
- ].each do |cmd|
1657
- execute_command cmd
1658
- end
1659
-
1660
- artifact_path = Dir.glob("_build/qa/rel/assange/releases/*/assange.tar.gz").first
1661
- upload_artifact(artifact_path, "microservices/assange/#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1662
-
1663
- Dir.chdir '../../'
1664
- end
1665
-
1666
- def create_bolla_artifact(revision, deploy_id)
1667
- output "Preparo l'artifact bolla .zip\n".yellow
1668
-
1669
- git_checkout_version('bolla', revision)
1670
-
1671
- Dir.chdir 'projects/bolla'
1672
-
1673
- decrypt_secrets()
1674
-
1675
- [
1676
- "docker-compose build web",
1677
- "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh assange_web \
1678
- '-c' 'mix local.hex --force && mix hex.info && \
1679
- mix deps.get && mix compile && mix deps.compile && \
1680
- rm -rf _build/qa/rel/ && \
1681
- mix release --env=qa'"
1682
- ].each do |cmd|
1683
- execute_command cmd
1684
- end
1685
-
1686
- artifact_path = Dir.glob("_build/qa/rel/migrator/releases/*/migrator.tar.gz").first
1687
- upload_artifact(artifact_path, "microservices/bolla/#{revision}-#{deploy_id}-qa-migrator.tar.gz", "#{@s3_bucket}-encrypted")
1688
-
1689
- Dir.chdir '../../'
1690
- end
1691
-
1692
- def create_borat_artifact(revision, deploy_id)
1693
- output "Preparo l'artifact borat .zip\n".yellow
1694
-
1695
- git_checkout_version('borat', revision)
1696
-
1697
- Dir.chdir 'projects/borat'
1698
-
1699
- stack_name_web = "ecs-task-web-qa-notneeded"
1700
- web_qa_host = get_route53_hostname(stack_name_web)
1701
- stack_name_backoffice = "ecs-task-backoffice-qa-notneeded"
1702
- backoffice_qa_host = get_route53_hostname(stack_name_backoffice)
1703
- stack_name_assange = "ecs-task-assange-qa-notneeded"
1704
- assange_qa_host = get_route53_hostname(stack_name_assange)
1705
- stack_name_peano = "ecs-task-peano-qa-notneeded"
1706
- peano_qa_host = "#{get_route53_hostname(stack_name_peano)}:10039"
1707
- stack_name_borat = "ecs-task-borat-qa-notneeded"
1708
- borat_qa_host = get_route53_hostname(stack_name_borat)
1709
-
1710
- ws_endpoint = "wss://#{borat_qa_host}/socket/websocket?vsn=1.0.0"
1711
- frontend_endpoint = "https://#{web_qa_host}/"
1712
-
1713
- stop_unless is_branch_compatible_with_current_twig_version?("borat"), "Il tuo branch del progetto borat non e' compatibile con questa versione di twig, devi REBASARE DA MASTER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!".red
1714
-
1715
- decrypt_secrets()
1716
-
1717
- [
1718
- "docker-compose build backend",
1719
- "docker run -v $PWD:/code -w /code -e WS_ENDPOINT=#{ws_endpoint} -e FRONTEND=#{frontend_endpoint} -e MIX_ENV=qa --entrypoint /bin/sh borat_backend \
1720
- '-c' 'sed -i \"s/web-qa-host/#{web_qa_host}/g\" config/qa.exs && \
1721
- sed -i \"s/backoffice-legacy-qa-host/#{backoffice_qa_host}/g\" config/qa.exs && \
1722
- sed -i \"s/assange-qa-host/#{assange_qa_host}/g\" config/qa.exs && \
1723
- sed -i \"s/peano-qa-host/#{peano_qa_host}/g\" config/qa.exs && \
1724
- sed -i \"s/borat-qa-host/#{borat_qa_host}/g\" config/qa.exs && \
1725
- mix local.hex --force && mix hex.info && \
1726
- mix deps.get && \
1727
- cd assets && \
1728
- yarn --cache-folder ~/.cache/yarn && \
1729
- ./node_modules/.bin/elm-github-install && \
1730
- sysconfcpus -n 2 ./node_modules/.bin/webpack -p --config config/webpack.config.prod.js && \
1731
- cd ../ && \
1732
- mix phx.digest && \
1733
- mix compile && mix deps.compile && \
1734
- rm -rf _build/qa/rel/ && \
1735
- mix release --env=qa'"
1736
- ].each do |cmd|
1737
- execute_command cmd
1738
- end
1739
-
1740
- artifact_path = Dir.glob("_build/qa/rel/backend/releases/*/backend.tar.gz").first
1741
- upload_artifact(artifact_path, "microservices/borat/#{revision}-#{deploy_id}-qa.tar.gz", "#{@s3_bucket}-encrypted")
1742
-
1743
- Dir.chdir '../../'
1744
- end
1745
-
1746
- def create_backoffice_artifact(revision, deploy_id)
1747
- output "Preparo l'artifact backoffice .zip\n".yellow
1748
-
1749
- git_checkout_version('backoffice', revision)
1750
-
1751
- Dir.chdir 'projects/backoffice'
1752
-
1753
- ['node_modules'].each do |dir|
1754
- unless File.directory?(dir)
1755
- if File.directory?("../../../backoffice/#{dir}")
1756
- exec_step "rsync -a ../../../backoffice/#{dir} ."
1757
- end
1758
- end
1759
- end
1760
-
1761
- stack_name_web = "ecs-task-web-qa-notneeded"
1762
- web_qa_host = get_route53_hostname(stack_name_web)
1763
- webri_qa_host = web_qa_host.sub("www", "wwwri")
1764
-
1765
- [
1766
- "docker-compose build workers",
1767
- "rm -rf src/ && git checkout -- .",
1768
- "cd ../../ && docker run -e GIT_DIR=$PWD -v $PWD:/usr/app/src -w /usr/app/src/projects/backoffice blinkmobile/bower install --allow-root",
1769
- "docker run -v $PWD:/code -w /code -e PHANTOMJS_BIN=/code/node_modules/grunt-selenium-webdriver/node_modules/phantomjs/bin/phantomjs --entrypoint /bin/bash backoffice_workers '-c' 'sed -i \"s/web-qa-url/#{web_qa_host}/g\" Gruntfile.js && sed -i \"s/web-qa-ri-url/#{webri_qa_host}/g\" Gruntfile.js && npm install && grunt qa'"
1770
- ].each do |cmd|
1771
- execute_command cmd
1772
- end
1773
-
1774
- artifact_path = '/tmp/backoffice.zip'
1775
- exec_step "rm -f #{artifact_path} && zip -9 -r #{artifact_path} bin/"
1776
- upload_artifact(artifact_path, "backoffice/#{revision}-#{deploy_id}.zip")
1777
-
1778
- Dir.chdir '../../'
1779
- end
1780
-
1781
- def create_prima_artifact(revision, branch_name, deploy_id)
1782
- output "Preparo l'artifact prima .zip\n".yellow
1783
-
1784
- git_checkout_version('prima', revision)
1785
-
1786
- Dir.chdir 'projects/prima'
1787
-
1788
- ['vendor'].each do |dir|
1789
- unless File.directory?(dir)
1790
- if File.directory?("../../../prima/#{dir}")
1791
- exec_step "rsync -a ../../../prima/#{dir} ."
1792
- end
1793
- end
1794
- end
1795
-
1796
- backoffice_qa_host = get_route53_hostname("ecs-task-borat-qa-notneeded")
1797
- web_qa_host = get_route53_hostname("ecs-task-web-qa-notneeded")
1798
- assange_qa_host = get_route53_hostname("ecs-task-assange-qa-notneeded")
1799
-
1800
- [
1801
- "bin/local_build_artifact.sh #{branch_name} #{web_qa_host} #{backoffice_qa_host} #{assange_qa_host} #{deploy_id} #{'update' if @deploy_update}"
1802
- ].each do |cmd|
1803
- execute_command cmd
1804
- end
1805
-
1806
- Dir.chdir "../../"
1807
- end
1808
-
1809
- def git_checkout_version(project, revision)
1810
- Dir.chdir "projects/#{project}"
1811
- exec_step "git checkout -- . && git checkout #{revision}"
1812
- Dir.chdir "../../"
1813
- end
1814
-
1815
- def create_asg_stack(stack_name, tags = [])
1816
- stack_body = IO.read('cloudformation/stacks/asg/ecs-asg-allinone.yml')
1817
- parameters = [
1818
- {
1819
- parameter_key: "Environment",
1820
- parameter_value: "qa"
1821
- },
1822
- {
1823
- parameter_key: "InstanceType",
1824
- parameter_value: "t2.large"
1825
- },
1826
- {
1827
- parameter_key: "ECSClusterName",
1828
- parameter_value: @ecs_cluster_name
1829
- }
1830
- ]
1831
- create_stack(stack_name, stack_body, parameters, tags)
1832
- end
1833
-
1834
- def create_cluster_stack(stack_name, tags = [])
1835
- stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
1836
- create_stack(stack_name, stack_body, [], tags)
1837
678
  end
1838
679
 
1839
680
  def update_cluster_stack(stack_name, tags = [])
@@ -1841,84 +682,13 @@ class Release
1841
682
  update_stack(stack_name, stack_body, [], tags)
1842
683
  end
1843
684
 
1844
- def create_alb_stack(stack_name, role)
1845
- stack_body = IO.read('cloudformation/stacks/alb/ecs-alb-public.yml')
1846
- parameters = [
1847
- {
1848
- parameter_key: "Environment",
1849
- parameter_value: "qa"
1850
- },
1851
- {
1852
- parameter_key: "Role",
1853
- parameter_value: role
1854
- }
1855
- ]
1856
- create_stack(stack_name, stack_body, parameters)
1857
- end
1858
-
1859
- def import_redis_crash(qa_ip_address)
1860
- output "Importo dump di Redis da staging\n".yellow
1861
-
1862
- redis_qa = Redis.new(:url => "redis://#{qa_ip_address}:6379/10")
1863
-
1864
- return unless redis_qa.keys('CODICI').empty?
1865
-
1866
- redis_staging = Redis.new(:url => 'redis://staging.cache-1.prima.it:6379/10')
1867
-
1868
- dump_staging = redis_staging.dump 'CODICI'
1869
-
1870
- redis_qa.restore 'CODICI', 0, dump_staging
1871
- end
1872
-
1873
- def import_dbs(ip_address)
1874
- resp = @ecs.run_task({
1875
- cluster: @ecs_cluster_name,
1876
- task_definition: @import_db_task,
1877
- overrides: {
1878
- container_overrides: [
1879
- {
1880
- name: 'dbrestore',
1881
- environment: [
1882
- {
1883
- name: 'EC2_IP_ADDRESS',
1884
- value: ip_address
1885
- }
1886
- ]
1887
- }
1888
- ]
1889
- },
1890
- count: 1
1891
- })
1892
- output "Attendo che i DB vengano importati...\n".yellow
1893
- stopped_at = nil
1894
- while stopped_at.nil?
1895
- unless resp.tasks[0].nil?
1896
- resp = @ecs.describe_tasks({
1897
- cluster: @ecs_cluster_name,
1898
- tasks: [resp.tasks[0].task_arn]
1899
- })
1900
- end
1901
- stopped_at = resp.tasks[0].stopped_at unless resp.tasks[0].nil?
1902
- sleep_seconds = 10
1903
- seconds_elapsed = 0
1904
- while true && stopped_at.nil?
1905
- break if seconds_elapsed >= sleep_seconds
1906
- print '.'.yellow; STDOUT.flush
1907
- sleep 1
1908
- seconds_elapsed += 1
1909
- end
1910
- end
1911
- print "\n"
1912
- end
1913
-
1914
685
  def choose_branch_to_deploy(project_name, select_master = false)
1915
- return {} if project_name == 'crash' && select_master
1916
686
  Dir.chdir "projects/#{project_name}"
1917
687
  output "Recupero la lista dei branch del progetto #{project_name}..."
1918
688
  `git remote prune origin`
1919
689
  out = %x[ git fetch ]
1920
690
  branches = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname) %(committeremail)' | sed 's/refs\\/remotes\\/origin\\///g' ]
1921
- .split("\n").delete_if { |b| b.include?('HEAD') || b.include?('dev') }[0..49]
691
+ .split("\n").delete_if { |b| b.include?('HEAD') }[0..49]
1922
692
 
1923
693
  master_branch = nil
1924
694
 
@@ -1927,16 +697,20 @@ class Release
1927
697
  break unless master_branch.nil?
1928
698
  end
1929
699
 
1930
- if select_master
700
+ if select_master || branches.length == 1
1931
701
  branch_name = master_branch
1932
702
  else
703
+ branches.insert(0, branches.delete(master_branch))
1933
704
  branch_name = choose do |menu|
1934
705
  menu.prompt = "Scegli il branch di #{project_name} da deployare: ".cyan
1935
706
  menu.shell = true
1936
707
 
1937
- branches.each do |branch|
708
+ git_mail = get_git_mail
709
+
710
+ branches.each_with_index do |branch, index|
1938
711
  title = @prima.reduce_size(branch, 100)
1939
- msg = "#{title}".light_blue
712
+ msg = index.odd? ? title.white : title.light_yellow # uno bianco e uno giallo alternati
713
+ msg = branch.include?(git_mail) ? msg.on_blue : msg.on_black # i branch aggiornati da chi lancia la creazione sono su sfondo blu
1940
714
  menu.choice(msg) { branch }
1941
715
  menu.default = branch if branch == master_branch
1942
716
  end
@@ -1948,7 +722,7 @@ class Release
1948
722
  name = branch_name.split(' ')[0]
1949
723
  revision = branch_name.split(' ')[1]
1950
724
  committer_email = branch_name.split(' ')[2].tr('<>', '')
1951
- { name: name, revision: revision[0..14], committer: committer_email, default_branch: select_master }
725
+ { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email, 'default_branch' => select_master }
1952
726
  end
1953
727
 
1954
728
  def select_branch_to_deploy(project_name, branch_name)
@@ -1957,41 +731,14 @@ class Release
1957
731
  `git remote prune origin`
1958
732
  out = %x[ git fetch ]
1959
733
  branch_name = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname) %(committeremail)' | sed 's/refs\\/remotes\\/origin\\///g' ]
1960
- .split("\n").delete_if { |b| !b.include?(branch_name) }[0..49]
734
+ .split("\n").delete_if { |b| !b.match("^#{Regexp.escape(branch_name)}") }[0..49]
1961
735
  .first
1962
736
 
1963
737
  Dir.chdir "../../"
1964
738
  name = branch_name.split(' ')[0]
1965
739
  revision = branch_name.split(' ')[1]
1966
740
  committer_email = branch_name.split(' ')[2].tr('<>', '')
1967
- { name: name, revision: revision[0..14], committer: committer_email }
1968
- end
1969
-
1970
- def is_branch_compatible_with_current_twig_version?(project)
1971
- case
1972
- when project == 'prima'
1973
- File.readlines("app/config/config_qa.yml").grep(/replaceme-assange.qa.staging.colaster.com/).size > 0
1974
- when project == 'urania'
1975
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1976
- when project == 'backoffice'
1977
- File.readlines("deploy/deploy.sh").grep(/HOSTNAME_PATTERN/).size > 0
1978
- when project == 'bburago'
1979
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1980
- when project == 'hal9000'
1981
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1982
- when project == 'fidaty'
1983
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1984
- when project == 'peano'
1985
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1986
- when project == 'assange'
1987
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1988
- when project == 'borat'
1989
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1990
- when project == 'crash'
1991
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1992
- when project == 'ermes'
1993
- File.readlines("deploy/deploy").grep(/HOSTNAME_PATTERN/).size > 0
1994
- end
741
+ { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email }
1995
742
  end
1996
743
 
1997
744
  def get_stacks()
@@ -2006,87 +753,32 @@ class Release
2006
753
  return stack_list, envs
2007
754
  end
2008
755
 
2009
- def hostname_pattern_priority()
2010
- (Time.now.to_i.to_s[-4..-1].to_i + Random.rand(40000)).to_s
2011
- end
2012
-
2013
- def launch_marley(ip_address, prima_hostname, borat_hostname)
2014
- resp = @cf.describe_stack_resource({
2015
- stack_name: 'batch-job-marley',
2016
- logical_resource_id: 'JobDefinition'
2017
- })
2018
-
2019
- @batch.submit_job({
2020
- job_name: "marley-#{@dns_record_identifier}", # required
2021
- job_queue: "marley", # required
2022
- job_definition: resp.stack_resource_detail.physical_resource_id, # required
2023
- container_overrides: {
2024
- environment: [
2025
- {
2026
- name: 'PRIMA_URL',
2027
- value: "https://#{prima_hostname}/"
2028
- },
2029
- {
2030
- name: 'PRIMA_IP',
2031
- value: ip_address
2032
- },
2033
- {
2034
- name: 'PROJECTS_JSON',
2035
- value: @projects.to_json
2036
- },
2037
- {
2038
- name: 'BACKOFFICE_URL',
2039
- value: "https://#{borat_hostname}"
2040
- }
2041
- ]
2042
- }
2043
- })
2044
-
2045
- output "Marley lanciato con successo!\n".green
2046
- end
2047
-
2048
- def get_currently_deployed_version(stack_name)
2049
- parameters = get_stack_parameters(stack_name)
2050
- currently_deployed_version = nil
2051
- parameters.each do |parameter|
2052
- if parameter.parameter_key == "ReleaseVersion"
2053
- currently_deployed_version = parameter.parameter_value
756
+ def get_clusters()
757
+ envs = {}
758
+ cluster_list = cluster_list()
759
+ cluster_list.each do |stack|
760
+ unless stack.stack_name.match(/spotfleet-allinone-qa-(\w+)$/)
761
+ env_hash = stack.stack_name.match(/qa-(\w+)$/)[0]
762
+ envs[env_hash] = stack.tags unless envs.has_key?(env_hash) || stack.tags.empty?
2054
763
  end
2055
764
  end
2056
- currently_deployed_version
765
+ return cluster_list, envs
2057
766
  end
2058
767
 
2059
- def decrypt_secrets()
2060
- docker_image = "prima/biscuit_populate_configs"
2061
- [
2062
- "docker pull #{docker_image}",
2063
- "docker run -t --rm -v $HOME/.aws:/root/.aws -v $PWD:$PWD -w $PWD #{docker_image}"
2064
- ].each do |cmd|
2065
- execute_command cmd
2066
- end
768
+ def hostname_pattern_priority()
769
+ (Time.now.to_i.to_s[-4..-1].to_i + Random.rand(40000)).to_s
2067
770
  end
2068
771
 
2069
- def select_branches(project_name = nil)
772
+ def select_branches(project_names = nil)
2070
773
  output "Deploy feature menu"
2071
- if project_name.nil?
2072
- @projects["prima"] = choose_branch_to_deploy('prima')
2073
- @projects["backoffice"] = choose_branch_to_deploy('backoffice')
2074
- @projects["urania"] = choose_branch_to_deploy('urania')
2075
- @projects["ermes"] = choose_branch_to_deploy('ermes')
2076
- @projects["bburago"] = choose_branch_to_deploy('bburago')
2077
- @projects["hal9000"] = choose_branch_to_deploy('hal9000')
2078
- @projects["fidaty"] = choose_branch_to_deploy('fidaty')
2079
- @projects["peano"] = choose_branch_to_deploy('peano')
2080
- @projects["rogoreport"] = choose_branch_to_deploy('rogoreport')
2081
- @projects["assange"] = choose_branch_to_deploy('assange')
2082
- @projects["borat"] = choose_branch_to_deploy('borat')
2083
- @projects["bolla"] = choose_branch_to_deploy('bolla')
2084
- @projects['crash'] = choose_branch_to_deploy('crash')
774
+ if project_names.nil?
775
+ @projects.each{ |key, value| @projects[key] = choose_branch_to_deploy(key) }
2085
776
  else
2086
- stop_unless File.directory?("./projects/#{project_name}"), "progetto #{project_name} inesistente o non supportato"
2087
- @projects[project_name] = choose_branch_to_deploy(project_name)
777
+ project_names.each do |project|
778
+ @projects[project] = choose_branch_to_deploy(project)
779
+ end
2088
780
  @projects.each_key do |branch_project|
2089
- @projects[branch_project] = choose_branch_to_deploy(branch_project, true) unless branch_project == project_name
781
+ @projects[branch_project] = choose_branch_to_deploy(branch_project, true) unless project_names.include? branch_project
2090
782
  end
2091
783
  end
2092
784
  end
@@ -2113,6 +805,12 @@ Description
2113
805
 
2114
806
  start creates a new feature branch
2115
807
  finish finishes the feature by merging to dev and master
808
+ qainit deploys a new environment with selected branches from every project
809
+ qainit $PROJECT_NAME deploys a new environment allowing to selected a branch from the input project (everything else is master)
810
+ qainit shutdown deletes a specific qa environment
811
+
812
+ Available only to devops (from artemide)
813
+ -----------
2116
814
  deploy deploys the feature branch to a temporary AWS Elastic Beanstalk env
2117
815
  deploy stop destroys the AWS Elastic Beanstalk env
2118
816
  deploy update updates a feature branch with current branches
@@ -2132,4 +830,11 @@ if args.include?('--help')
2132
830
  exit
2133
831
  end
2134
832
 
2135
- Release.new.execute!(args)
833
+ gem_update = true
834
+ if args.include?('no-gem-update')
835
+ gem_update = false
836
+ end
837
+
838
+ args.delete('no-gem-update')
839
+
840
+ Release.new(gem_update).execute!(args)