prima-twig 0.13.37 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 80453e18a20c633202fb9511c8467c7a55fe041d4f95c48dcba8c94438c30fd5
4
- data.tar.gz: 61157b2ab76835811dda1be558bfb1a33013e28e4a134cebc1d3811672ce7e27
2
+ SHA1:
3
+ metadata.gz: 5f327ab5415e9942da77bcd72b306ee83fb183c9
4
+ data.tar.gz: 32a4d9ae10f89a8dc829a2f58ade4debc5ff7b3a
5
5
  SHA512:
6
- metadata.gz: 748b849608be9eb2a7b8a23eb453e9e3bfce1bad2af8b167fb58001f000a8bd40f2bb0e0f1d61f847dc5919815a22d789639cd31fc9ea4bb9c766c6dffc14a69
7
- data.tar.gz: 86882fe4d74c2ee22934c51002e0f076577647ca4b67e116e05534ed1ed74e3442987a266dc49128096c0996200e84e5c89f97a7ffa3a72cb195927735744778
6
+ metadata.gz: fea86d11be56b30e65b4e164c9d7836776ded2f2decc1db6685febb5271bde01a1f17d0cf737170e3f33a28c4ca61b015831689cbfb9f5e3ef9cde21505b5632
7
+ data.tar.gz: 4a1ca207cf83cd866451bf4a726deb01775c701d4e9dab75064814f9deb4f65b63b5fe446afad2d35d33ac9adea3542042eb36584311ad69c7b024e590fe895a
@@ -2,13 +2,9 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require_relative '../lib/prima_twig.rb'
5
- require_relative '../lib/prima_aws_client.rb'
6
5
  require 'colorize'
7
6
  require 'highline/import'
8
- require 'aws-sdk-batch'
9
- require 'aws-sdk-cloudformation'
10
- require 'aws-sdk-ecs'
11
- require 'aws-sdk-s3'
7
+ require 'aws-sdk'
12
8
  require 'redcarpet'
13
9
  require 'mail'
14
10
  require 'erb'
@@ -49,17 +45,12 @@ end
49
45
 
50
46
  class Review
51
47
  include Command
52
- include PrimaAwsClient
53
48
 
54
49
  def initialize
55
50
  @prima = Prima.new
56
- output "Controllo se ci sono aggiornamenti da fare..."
57
- exec "gem update prima-twig && twig deploy #{ARGV.join ' '}" unless `gem outdated`.lines.grep(/^prima-twig \(.*\)/).empty?
58
51
  @cf = Aws::CloudFormation::Client.new
59
52
  @ecs = Aws::ECS::Client.new
60
53
  @s3 = Aws::S3::Client.new
61
- @batch = Aws::Batch::Client.new
62
- @s3_bucket = "prima-artifacts-encrypted"
63
54
  end
64
55
 
65
56
  def execute! args
@@ -94,10 +85,19 @@ class Review
94
85
  end
95
86
  end
96
87
 
97
- user = `git config user.name`.delete "\n"
88
+ user = `git config user.name`
98
89
  artifact = artifacts.select {|v| v[:rev] == artifact_rev}.first
99
90
 
100
91
  do_deploy! artifact_rev
92
+ exec_step "terminal-notifier -message 'Deploy terminato, vuoi lanciare paparatzinger?'" if which 'terminal-notifier'
93
+
94
+ confirm_message = "Vuoi lanciare paparatzinger?"
95
+ launch_paparatzinger = @prima.yesno confirm_message.blue
96
+
97
+ if launch_paparatzinger
98
+ output "Avvio paparatzinger per gli screenshot".yellow
99
+ job_name = launch_paparatzinger(artifact[:commit_msg])
100
+ end
101
101
 
102
102
  mail = Mail.new do
103
103
  from 'deploy@prima.it'
@@ -113,6 +113,7 @@ class Review
113
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"
114
114
  body << "Branch: [#{artifact[:branch]}](https://github.com/primait/prima/tree/#{artifact[:branch]})\n\n"
115
115
  body << "Commit: #{commit_msg.gsub(/_/, '\_')}\n\n"
116
+ body << "Screenshots (tra qualche minuto): [BrowserStack](https://www.browserstack.com/automate) (Filtrare per: \"#{get_paparatzinger_job_name(commit_msg).gsub(/_/, '\_')}\")" if launch_paparatzinger
116
117
 
117
118
  htmlBody = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render body
118
119
 
@@ -127,38 +128,21 @@ class Review
127
128
  mail.html_part = html_part
128
129
  mail.text_part = text_part
129
130
 
130
- opts = {address: 'email-smtp.eu-west-1.amazonaws.com', port: '587'}
131
- opts[:user_name] = @prima.config['aws_username']
132
- opts[:password] = @prima.config['aws_password']
133
-
134
- exec_step "git checkout master"
131
+ opts = {address: 'smtp.mandrillapp.com', port: '587'}
132
+ opts[:user_name] = 'deploy@prima.it'
133
+ opts[:password] = @prima.config['mandrill']
135
134
 
136
135
  mail.delivery_method(:smtp, opts)
137
136
  mail.deliver
138
137
 
139
- invalidate_prismic_cache
140
-
141
- launch_crawler
142
-
138
+ exec_step "git checkout master"
143
139
  exec_step "terminal-notifier -message 'Deploy terminato'" if which 'terminal-notifier'
144
140
  end
145
141
 
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
-
158
142
  def reload_parameters!
159
143
  artifact_rev = ''
160
144
  resp = @cf.describe_stacks({
161
- stack_name: "ecs-task-web-vpc-production"
145
+ stack_name: "ecs-task-web-production"
162
146
  })
163
147
  resp.stacks[0].parameters.each do |param|
164
148
  if param.parameter_key == 'ReleaseVersion'
@@ -187,42 +171,111 @@ class Review
187
171
  exec_step "git checkout #{artifact_rev}"
188
172
  exec_step deploy_command
189
173
 
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'
174
+ stack_name_web = 'ecs-task-web-production'
175
+ stack_name_consumer = 'ecs-task-consumer-production'
176
+ stack_name_cron = 'ecs-task-consumer-production'
194
177
  wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
195
178
  wait_for_stack_ready(stack_name_consumer) unless stack_ready?(stack_name_consumer)
196
179
  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)
198
180
  end
199
181
 
200
182
  def get_artifacts
201
183
  artifacts = []
202
- resp = @s3.list_objects(bucket: @s3_bucket, prefix: 'prima')
184
+ resp = @s3.list_objects(bucket: 'prima-artifacts', prefix: 'prima')
203
185
  resp.contents.each do |l|
204
- # aggiungiamo solo gli artefatti prodotti a partire dal branch master, riconosciuti tramite i metadata
205
- rev = l.key.match(/^prima\/(\w{15}).tar.gz$/).captures.first if l.key.match(/^prima\/(\w{15}).tar.gz$/)
186
+ rev = l.key.match(/(\w{15}).tar.gz$/).captures.first if l.key.match(/(\w{15}).tar.gz$/)
206
187
  if rev
207
- object = @s3.head_object(bucket: @s3_bucket, key: l.key)
188
+ object = @s3.head_object(bucket: 'prima-artifacts', key: l.key)
208
189
  commit_msg = ''
209
190
  commit_msg = Base64.decode64(object.metadata['commit_msg']).strip if object.metadata.has_key? 'commit_msg'
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')
191
+ artifacts << {rev: rev, created_at: object.last_modified, branch: object.metadata['branch'], commit_msg: commit_msg } if object.metadata.has_key? 'branch'
211
192
  end
212
193
  end
213
194
  artifacts.sort_by { |v| v[:created_at] }.reverse
214
195
  end
215
196
 
216
- def launch_crawler()
217
- resp = describe_stack_resource('batch-job-crawler-production', 'JobDefinition')
197
+ def wait_for_stack_ready(stack_name)
198
+ ready = false
199
+ sleep_seconds = 5
200
+ output "Attendo che lo stack #{stack_name} finisca di essere deployato...\n".yellow
201
+ while !ready
202
+ ready = true if stack_ready?(stack_name)
203
+ seconds_elapsed = 0
204
+ while true
205
+ break if seconds_elapsed >= sleep_seconds
206
+ print '.'.yellow; STDOUT.flush
207
+ sleep 1
208
+ seconds_elapsed += 1
209
+ end
210
+ end
211
+
212
+ output "\nStack #{stack_name} deployato con successo!\n".green
213
+ end
214
+
215
+ def stack_ready?(stack_name)
216
+ resp = @cf.describe_stacks({
217
+ stack_name: stack_name
218
+ })
219
+ ['CREATE_COMPLETE', 'UPDATE_COMPLETE'].include? resp.stacks[0].stack_status
220
+ end
221
+
222
+ def launch_paparatzinger(job_name)
223
+ @s3.get_object(
224
+ response_target: '/tmp/paparatzinger_twig.yml',
225
+ bucket: 'prima-deploy',
226
+ key: 'paparatzinger_twig.yml')
218
227
 
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
228
+ paparatzinger_config = YAML.load_file '/tmp/paparatzinger_twig.yml'
229
+
230
+ uri = URI.parse(paparatzinger_config['prima_api_search_url'])
231
+ body = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
232
+ req = Net::HTTP::Get.new(uri)
233
+ req["x-apikey"] = paparatzinger_config['prima_api_token']
234
+ response = http.request req
235
+ response.body
236
+ end
237
+
238
+ saves = JSON.parse body
239
+
240
+ save_code = saves.sample["code"]
241
+ url_garanzie = "https://www.prima.it/preventivo/auto/#{save_code}/garanzie?browserstack=true"
242
+ job_name = get_paparatzinger_job_name(clean_commit_message(job_name))
243
+
244
+ logical_resource_id = 'TaskDefinitionPaparatzinger'
245
+ resp = @cf.describe_stack_resource({
246
+ stack_name: 'ecs-task-paparatzinger-production',
247
+ logical_resource_id: logical_resource_id
223
248
  })
224
249
 
225
- output "Crawler lanciato con successo!\n".green
250
+ resp = @ecs.run_task({
251
+ cluster: 'ecs-cluster-tools-ECSCluster-1I4THZHRXOTO5',
252
+ task_definition: resp.stack_resource_detail.physical_resource_id,
253
+ overrides: {
254
+ container_overrides: [
255
+ {
256
+ name: 'paparatzinger',
257
+ environment: [
258
+ {
259
+ name: 'JOB_NAME',
260
+ value: job_name,
261
+ },
262
+ {
263
+ name: 'VERSION',
264
+ value: paparatzinger_config['version'],
265
+ },
266
+ {
267
+ name: 'URL_GARANZIE',
268
+ value: url_garanzie
269
+ }
270
+ ]
271
+ }
272
+ ]
273
+ },
274
+ count: 1
275
+ })
276
+ output "Paparatzinger lanciato con successo. URL: #{url_garanzie}\n".green
277
+
278
+ job_name
226
279
  end
227
280
 
228
281
  end
@@ -234,6 +287,10 @@ def clean_commit_message(commit_msg)
234
287
  commit_msg[0..99]
235
288
  end
236
289
 
290
+ def get_paparatzinger_job_name(job_name)
291
+ job_name.gsub /[^0-9a-z]/i, '-'
292
+ end
293
+
237
294
  def which(cmd)
238
295
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
239
296
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
@@ -2,113 +2,54 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require_relative '../lib/prima_twig.rb'
5
- require_relative '../lib/prima_aws_client.rb'
6
- require 'digest'
7
- require 'json'
8
5
  require 'launchy'
6
+ require 'digest'
9
7
  require 'pp'
10
- require 'redis'
11
8
 
12
9
  class Release
13
10
  include Command
14
- include PrimaAwsClient
15
11
 
16
- def initialize(update_gem=true)
12
+ def initialize
17
13
  @prima = Prima.new
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
14
+ @cf = Aws::CloudFormation::Client.new
15
+ @elb = Aws::ElasticLoadBalancing::Client.new
16
+ @alb = Aws::ElasticLoadBalancingV2::Client.new
17
+ @ec2 = Aws::EC2::Client.new
18
+ @ecs = Aws::ECS::Client.new
19
+ @s3 = Aws::S3::Client.new
20
+ @asg = Aws::AutoScaling::Client.new
21
+ @s3_bucket = 'prima-artifacts'
22
+ @artifact_path = '/tmp/prima-artifact.zip'
23
+ @import_db_task = 'arn:aws:ecs:eu-west-1:001575623345:task-definition/ecs-task-db-restore-TaskDefinitionDbRestore-8A9N41PAYMJ2:1'
24
+ @prima_built = false
25
+ @urania_built = false
26
+ @ermes_built = false
27
+ @bburago_built = false
28
+ @backoffice_built = false
25
29
  @dns_record_identifier = nil
26
30
  @ecs_cluster_name = nil
27
- @deploy_update = false
28
- @projects = {
29
- 'prima' => {},
30
- 'urania' => {},
31
- 'ermes' => {},
32
- 'bburago' => {},
33
- 'hal9000' => {},
34
- 'fidaty' => {},
35
- 'peano' => {},
36
- # 'rogoreport' => {},
37
- 'assange' => {},
38
- 'borat' => {},
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' => {}
53
- }
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'])
58
31
  end
59
32
 
60
- def execute!(args)
33
+ def execute! args
61
34
  case args[0]
62
- when 'start'
35
+ when "start"
63
36
  start_feature!
64
- when 'finish'
37
+ when "finish"
65
38
  finish_feature!
66
- when 'qainit'
67
- abort('Non sei nella cartella di qainit') unless Dir.pwd.match 'qainit$' or Dir.pwd.match '/drone/src'
39
+ when "deploy"
68
40
  if ['terminate', 'stop', 'shutdown', 'halt', 'destroy'].include? args[1]
69
- qainit_deploy_shutdown!
70
- elsif 'update' == args[1]
71
- qainit_deploy_update!
72
- else
73
- if args[1]
74
- select_branches(args[1..-1])
75
- else
76
- select_branches
77
- end
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!
90
- end
91
- when 'aggregator'
92
- if 'enable' == args[1]
93
- aggregator_enable!
94
- elsif 'disable' == args[1]
95
- aggregator_disable!
41
+ deploy_shutdown!
96
42
  else
97
- stop_for_wrong_args
43
+ deploy_feature!
98
44
  end
99
45
  else
100
- stop_for_wrong_args
46
+ stop_if true, [:wrong_args, ['start', 'finish', 'deploy', 'deploy stop']]
101
47
  end
102
48
  end
103
49
 
104
- def stop_for_wrong_args
105
- puts help_content
106
- stop_if true, [:wrong_args, ['start', 'finish', 'deploy', 'deploy project_name', 'deploy stop', 'deploy update', 'aggregator enable', 'aggregator disable']]
107
- end
108
-
109
50
  def start_feature!
110
51
  branch_name = @prima.clean_branch_name(ask('Inserisci il nome del branch (puoi omettere feature/): '.cyan))
111
- stop_unless !branch_name.empty?, 'Devi inserire il nome del branch'
52
+ stop_unless branch_name.length > 0, 'Devi inserire il nome del branch'
112
53
  branch_name.prepend 'feature/' unless branch_name.include? 'feature'
113
54
 
114
55
  output "Il nome del branch sarà " + branch_name.yellow
@@ -118,135 +59,6 @@ class Release
118
59
  exec_step "git checkout -b " + branch_name
119
60
  end
120
61
 
121
- def aggregator_disable!
122
- output 'Disable aggregator'
123
-
124
- output "Recupero le informazioni relative al puntamento dei record DNS..."
125
- output "Recupero le informazioni sui QA attivi..."
126
- stack_list, envs = get_stacks()
127
-
128
- env_hash = nil
129
- unless envs.empty?
130
- env_hash = envs.detect do |key, tags|
131
- aggregator_enabled = tags.detect do |tag|
132
- tag.key === "hostname_pattern_priority" and tag.value === "1"
133
- end.is_a?(Aws::CloudFormation::Types::Tag)
134
- aggregator_enabled
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
138
- change_hostname_priority(env_hash, hostname_pattern_priority())
139
- dns_to_staging(env_hash)
140
- else
141
- output 'Nessun QA trovato'.red
142
- exit
143
- end
144
-
145
- output 'Finito!'.green
146
- end
147
-
148
- def aggregator_enable!
149
- output 'Enable aggregator'
150
-
151
- output 'Recupero le informazioni relative al puntamento dei record DNS...'
152
- dns_records = @cloudflare.get('zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records', { per_page: 100, type: 'CNAME', content: 'staging.prima.it' })
153
- stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori stanno gia' puntando ad un QA".red
154
-
155
- output "Recupero le informazioni sui QA attivi..."
156
- stack_list, envs = get_stacks()
157
-
158
- env_hash = nil
159
- unless envs.empty?
160
- env_hash = choose do |menu|
161
- menu.prompt = "Scegli il QA al quale vuoi far puntare gli ambienti di staging dei comparatori: ".cyan
162
- menu.shell = true
163
- envs.each do |key, env|
164
- title = ""
165
- env.each do |e|
166
- title << "\n#{e.key.upcase}: #{e.value}"
167
- end
168
- msg = "#{@prima.reduce_size(title, 1000)}".light_blue
169
- menu.choice(msg) { key }
170
- end
171
- end
172
- else
173
- output "Nessun QA trovato".red
174
- exit
175
- end
176
-
177
- change_hostname_priority(env_hash, "1")
178
-
179
- dns_records.body[:result].each do |dns|
180
- if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
181
- output "Changing #{dns[:name]} DNS record"
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})
183
- end
184
- end
185
-
186
- output "Finito!".green
187
- end
188
-
189
- def change_hostname_priority(env_hash, hostname_pattern_priority)
190
- cluster_stack_name = "ecs-cluster-#{env_hash}"
191
- tags = get_stack_tags(cluster_stack_name).map do |tag|
192
- if tag.key === "hostname_pattern_priority"
193
- {
194
- key: "hostname_pattern_priority",
195
- value: hostname_pattern_priority
196
- }
197
- else
198
- tag
199
- end
200
- end
201
-
202
- stack_list = stack_list()
203
-
204
- stack_list.each do |stack|
205
- if stack.stack_name.match(/#{env_hash}$/)
206
- stack_name = stack.stack_name
207
- update_stack(stack_name, get_stack_template(stack_name), get_stack_parameters(stack_name), tags)
208
- end
209
- end
210
-
211
- stack_list.each do |stack|
212
- if stack.stack_name.match(/#{env_hash}$/)
213
- wait_for_stack_ready(stack.stack_name) unless stack_ready?(stack.stack_name)
214
- end
215
- end
216
-
217
- stack_name_web = "ecs-task-web-#{env_hash}"
218
- parameters = get_stack_parameters(stack_name_web).map do |param|
219
- if param.parameter_key === "HostnamePatternPriority"
220
- {
221
- parameter_key: "HostnamePatternPriority",
222
- parameter_value: hostname_pattern_priority
223
- }
224
- elsif param.parameter_key === "HostnamePatternAggregatorPriority"
225
- {
226
- parameter_key: "HostnamePatternAggregatorPriority",
227
- parameter_value: (hostname_pattern_priority.to_i + 1).to_s
228
- }
229
- else
230
- param
231
- end
232
- end
233
-
234
- update_stack(stack_name_web, get_stack_template(stack_name_web), parameters)
235
-
236
- wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
237
- end
238
-
239
- def dns_to_staging(env_hash)
240
- output "Recupero le informazioni relative al puntamento dei record DNS..."
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])})
242
- dns_records.body[:result].each do |dns|
243
- if dns[:name] =~ /^\w+\-\w+\-staging\.prima\.it$/
244
- output "Changing #{dns[:name]} DNS record"
245
- @cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1})
246
- end
247
- end
248
- end
249
-
250
62
  def finish_feature!
251
63
  current_branch_name = @prima.twig.current_branch_name
252
64
  stop_unless (current_branch_name =~ /^feature\//), "Non sei su un branch di feature, non posso mergiare nulla"
@@ -267,8 +79,13 @@ class Release
267
79
  end
268
80
 
269
81
  def deploy_shutdown!
270
- output "Recupero le informazioni sui QA attivi..."
271
- stack_list, envs = get_stacks
82
+ envs = {}
83
+ stack_list.each do |stack|
84
+ unless stack.stack_name.match(/spotfleet-allinone-qa-(\w+)$/)
85
+ env_hash = stack.stack_name.match(/qa-(\w+)$/)[0]
86
+ envs[env_hash] = stack.tags unless envs.has_key?(env_hash)
87
+ end
88
+ end
272
89
 
273
90
  env_hash = nil
274
91
  unless envs.empty?
@@ -277,511 +94,818 @@ class Release
277
94
  menu.shell = true
278
95
 
279
96
  envs.each do |key, env|
280
- title = ''
281
- env.each do |e|
282
- title << "\n#{e.key}: #{e.value} "
283
- end
284
- msg = @prima.reduce_size(title, 1000).to_s.light_blue
97
+ title = @prima.reduce_size("#{env[0].key}: #{env[0].value} #{env[1].key}: #{env[1].value} #{env[2].key}: #{env[2].value} #{env[3].key}: #{env[3].value}", 100)
98
+ msg = "#{title}".light_blue
285
99
  menu.choice(msg) { key }
286
100
  end
287
101
  end
288
102
  else
289
- output 'Nessun environment trovato'.red
103
+ output "Nessun environment trovato".red
290
104
  exit
291
105
  end
292
106
 
293
107
  cluster_stack_name = nil
294
- stacks_to_delete = []
295
108
  stack_list.each do |stack|
296
109
  if stack.stack_name.match(/#{env_hash}$/)
297
110
  if stack.stack_name.match(/ecs-cluster/)
298
111
  cluster_stack_name = stack.stack_name
299
112
  else
300
- break unless stack.stack_name.match(/#{env_hash}$/)
301
- stacks_to_delete.push(stack.stack_name)
302
- delete_stack(stack.stack_name)
113
+ delete_stack(stack.stack_name) if stack.stack_name.match(/#{env_hash}$/)
303
114
  end
304
115
  end
305
116
  end
306
117
 
307
- cluster_stack_name = "ecs-cluster-#{env_hash}"
308
- aggregator_enabled = get_stack_tags(cluster_stack_name).detect do |tag|
309
- tag.key === "hostname_pattern_priority" and tag.value === "1"
310
- end.is_a?(Aws::CloudFormation::Types::Tag)
311
-
312
- if aggregator_enabled
313
- dns_to_staging(env_hash)
314
- end
315
-
316
118
  # Se non ha finito di cancellare le altre non si puo' cancellare il cluster
317
- output "Attendo 10 secondi per poter eliminare il cluster ECS"
318
-
319
- while stacks_to_delete.length > 0
320
- sleep 13
321
- stacks_to_delete.each do |stack_name|
322
- stacks_to_delete = stacks_to_delete - [stack_name] unless stack_exists?(stack_name)
323
- end
324
- output "Stack ancora attivi: #{stacks_to_delete.length.to_s}. Attendo altri 10 secondi per eliminare il cluster ECS"
325
- end
326
-
119
+ output "Attendo 60 secondi per poter eliminare il cluster ECS"
120
+ sleep 60
327
121
  delete_stack(cluster_stack_name)
328
- delete_stack(@base_stack_name_alb + env_hash[3..8])
329
- delete_stack(@base_stack_name_alb_ws + env_hash[3..8])
330
122
  output "Finito!".green
331
123
  end
332
124
 
333
- def deploy_lock!
334
- output "Deploy update menu"
125
+ def deploy_feature!
126
+ `sudo true` # cosi' non chiede la password dopo
335
127
  `git pull && git submodule init && git submodule update`
336
-
337
- @deploy_update = true
338
-
339
- output "Recupero le informazioni sui QA attivi..."
340
- stack_list, envs = get_clusters()
341
-
342
- env_hash = nil
343
- unless envs.empty?
344
- env_hash = choose do |menu|
345
- menu.prompt = "Scegli il QA che vuoi proteggere dallo spegnimento automatico: ".cyan
346
- menu.shell = true
347
- envs.each do |key, env|
348
- title = ""
349
- env.each do |e|
350
- title << "#{e.value}" if e.key == 'qainit'
351
- end
352
- msg = "#{@prima.reduce_size(title, 1000)}".light_blue
353
- menu.choice(msg) { key }
354
- end
355
- end
128
+ prima_branch = choose_branch_to_deploy('prima')
129
+ backoffice_branch = choose_branch_to_deploy('backoffice')
130
+ urania_branch = choose_branch_to_deploy('urania')
131
+ ermes_branch = choose_branch_to_deploy('ermes')
132
+ bburago_branch = choose_branch_to_deploy('bburago')
133
+ socket_branch = {name: "master"}
134
+ pamela_branch = {name: "master"}
135
+
136
+ @dns_record_identifier = "#{@prima.clean_branch_name(prima_branch[:name])}-#{@prima.clean_branch_name(backoffice_branch[:name])}-#{@prima.clean_branch_name(urania_branch[:name])}-#{@prima.clean_branch_name(ermes_branch[:name])}-#{@prima.clean_branch_name(bburago_branch[:name])}".gsub(/feature./, '')[0..35].gsub(/(-+$)/, '')
137
+
138
+ tags = [
139
+ {
140
+ key: "prima",
141
+ value: prima_branch[:name]
142
+ },
143
+ {
144
+ key: "urania",
145
+ value: urania_branch[:name]
146
+ },
147
+ {
148
+ key: "backoffice",
149
+ value: backoffice_branch[:name]
150
+ },
151
+ {
152
+ key: "ermes",
153
+ value: ermes_branch[:name]
154
+ },
155
+ {
156
+ key: "bburago",
157
+ value: bburago_branch[:name]
158
+ }
159
+ ]
160
+
161
+ deploy_id = Digest::MD5.hexdigest(prima_branch[:name] + backoffice_branch[:name] + urania_branch[:name] + socket_branch[:name] + pamela_branch[:name] + ermes_branch[:name] + bburago_branch[:name])
162
+
163
+ cluster_stack_name = "ecs-cluster-qa-#{deploy_id}"
164
+ create_cluster_stack(cluster_stack_name, tags) unless stack_exists?(cluster_stack_name)
165
+ wait_for_stack_ready(cluster_stack_name) unless stack_ready?(cluster_stack_name)
166
+
167
+ resp = @cf.describe_stack_resource({stack_name: cluster_stack_name, logical_resource_id: 'ECSCluster'})
168
+ @ecs_cluster_name = resp.stack_resource_detail.physical_resource_id
169
+
170
+ asg_stack_name = "ecs-asg-allinone-qa-#{deploy_id}"
171
+ create_asg_stack(asg_stack_name, tags) unless stack_exists?(asg_stack_name)
172
+
173
+ stack_name_db = "ecs-task-db-qa-#{deploy_id}"
174
+ stack_body = IO.read('cloudformation/stacks/task/db.yml')
175
+ parameters = [
176
+ {
177
+ parameter_key: "Environment",
178
+ parameter_value: "qa"
179
+ },
180
+ {
181
+ parameter_key: "ECSClusterName",
182
+ parameter_value: @ecs_cluster_name
183
+ }
184
+ ]
185
+ create_stack(stack_name_db, stack_body, parameters, tags) unless stack_exists?(stack_name_db)
186
+
187
+ create_prima_artifact(prima_branch[:revision], prima_branch[:name]) unless artifact_exists?('prima-artifacts', "prima/#{prima_branch[:revision]}")
188
+ create_urania_artifact(urania_branch[:revision]) unless artifact_exists?('prima-artifacts', "microservices/urania/#{urania_branch[:revision]}-qa.tar.gz")
189
+ create_ermes_artifact(ermes_branch[:revision]) unless artifact_exists?('prima-artifacts', "microservices/ermes/#{ermes_branch[:revision]}-qa.tar.gz")
190
+ create_bburago_artifact(bburago_branch[:revision]) unless artifact_exists?('prima-artifacts', "microservices/bburago/#{bburago_branch[:revision]}-qa.tar.gz")
191
+ create_backoffice_artifact(backoffice_branch[:revision], deploy_id) unless artifact_exists?('prima-artifacts', "backoffice/#{backoffice_branch[:revision]}-#{deploy_id}.zip")
192
+
193
+ wait_for_stack_ready(stack_name_db) unless stack_ready?(stack_name_db)
194
+ import_dbs(ec2_ip_address(asg_stack_name)) unless stack_exists?("ecs-task-web-qa-#{deploy_id}")
195
+
196
+ stack_name_web = "ecs-task-web-qa-#{deploy_id}"
197
+ git_checkout_version('prima', prima_branch[:revision])
198
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/web.yml')
199
+ parameters = [
200
+ {
201
+ parameter_key: "Environment",
202
+ parameter_value: "qa"
203
+ },
204
+ {
205
+ parameter_key: "ReleaseVersion",
206
+ parameter_value: prima_branch[:revision]
207
+ },
208
+ {
209
+ parameter_key: "TaskDesiredCount",
210
+ parameter_value: "1"
211
+ },
212
+ {
213
+ parameter_key: "ECSClusterName",
214
+ parameter_value: @ecs_cluster_name
215
+ },
216
+ {
217
+ parameter_key: "ALBShortName",
218
+ parameter_value: "ecs-task-web-qa-#{deploy_id}"[0..31]
219
+ },
220
+ {
221
+ parameter_key: "WebQaBaseHostname",
222
+ parameter_value: "#{@dns_record_identifier}.qa.colaster.com"
223
+ }
224
+ ]
225
+ if stack_exists?(stack_name_web)
226
+ update_stack(stack_name_web, stack_body, parameters) if @prima_built
356
227
  else
357
- output "Nessun QA trovato".red
358
- exit
228
+ create_stack(stack_name_web, stack_body, parameters, tags)
229
+ end
230
+
231
+ stack_name_consumer = "ecs-task-consumer-qa-#{deploy_id}"
232
+ git_checkout_version('prima', prima_branch[:revision])
233
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/consumer.yml')
234
+ parameters = [
235
+ {
236
+ parameter_key: "Environment",
237
+ parameter_value: "qa"
238
+ },
239
+ {
240
+ parameter_key: "ReleaseVersion",
241
+ parameter_value: prima_branch[:revision]
242
+ },
243
+ {
244
+ parameter_key: "ECSClusterName",
245
+ parameter_value: @ecs_cluster_name
246
+ }
247
+ ]
248
+ if stack_exists?(stack_name_consumer)
249
+ update_stack(stack_name_consumer, stack_body, parameters) if @prima_built
250
+ else
251
+ create_stack(stack_name_consumer, stack_body, parameters, tags)
252
+ end
253
+
254
+ stack_name_urania = "ecs-task-urania-qa-#{deploy_id}"
255
+ git_checkout_version('urania', urania_branch[:revision])
256
+ stack_body = IO.read('projects/urania/deploy/task.yml')
257
+ parameters = [
258
+ {
259
+ parameter_key: "Environment",
260
+ parameter_value: "qa"
261
+ },
262
+ {
263
+ parameter_key: "ReleaseVersion",
264
+ parameter_value: urania_branch[:revision]
265
+ },
266
+ {
267
+ parameter_key: "TaskDesiredCount",
268
+ parameter_value: "1"
269
+ },
270
+ {
271
+ parameter_key: "ECSClusterName",
272
+ parameter_value: @ecs_cluster_name
273
+ },
274
+ {
275
+ parameter_key: "ALBShortName",
276
+ parameter_value: "ecs-task-urania-qa-#{deploy_id}"[0..31]
277
+ }
278
+ ]
279
+ if stack_exists?(stack_name_urania)
280
+ update_stack(stack_name_urania, stack_body, parameters) if @urania_built
281
+ else
282
+ create_stack(stack_name_urania, stack_body, parameters, tags)
283
+ end
284
+
285
+ stack_name_ermes = "ecs-task-ermes-qa-#{deploy_id}"
286
+ git_checkout_version('ermes', ermes_branch[:revision])
287
+ stack_body = IO.read('projects/ermes/deploy/task.yml')
288
+ parameters = [
289
+ {
290
+ parameter_key: "Environment",
291
+ parameter_value: "qa"
292
+ },
293
+ {
294
+ parameter_key: "ReleaseVersion",
295
+ parameter_value: ermes_branch[:revision]
296
+ },
297
+ {
298
+ parameter_key: "ECSClusterName",
299
+ parameter_value: @ecs_cluster_name
300
+ }
301
+ ]
302
+ if stack_exists?(stack_name_ermes)
303
+ update_stack(stack_name_ermes, stack_body, parameters) if @ermes_built
304
+ else
305
+ create_stack(stack_name_ermes, stack_body, parameters, tags)
306
+ end
307
+
308
+ stack_name_bburago = "ecs-task-bburago-qa-#{deploy_id}"
309
+ git_checkout_version('bburago', bburago_branch[:revision])
310
+ stack_body = IO.read('projects/bburago/deploy/task.yml')
311
+ parameters = [
312
+ {
313
+ parameter_key: "Environment",
314
+ parameter_value: "qa"
315
+ },
316
+ {
317
+ parameter_key: "ReleaseVersion",
318
+ parameter_value: bburago_branch[:revision]
319
+ },
320
+ {
321
+ parameter_key: "ECSClusterName",
322
+ parameter_value: @ecs_cluster_name
323
+ },
324
+ {
325
+ parameter_key: "TaskDesiredCount",
326
+ parameter_value: "1"
327
+ },
328
+ {
329
+ parameter_key: "ALBShortName",
330
+ parameter_value: "ecs-task-bburago-qa-#{deploy_id}"[0..31]
331
+ }
332
+ ]
333
+ if stack_exists?(stack_name_bburago)
334
+ update_stack(stack_name_bburago, stack_body, parameters) if @bburago_built
335
+ else
336
+ create_stack(stack_name_bburago, stack_body, parameters, tags)
337
+ end
338
+
339
+ git_checkout_version('backoffice', backoffice_branch[:revision])
340
+ stack_name_backoffice = "ecs-task-backoffice-qa-#{deploy_id}"
341
+ stack_body = IO.read('projects/backoffice/deploy/task.yml')
342
+ parameters = [
343
+ {
344
+ parameter_key: "Environment",
345
+ parameter_value: "qa"
346
+ },
347
+ {
348
+ parameter_key: "ReleaseVersion",
349
+ parameter_value: "#{backoffice_branch[:revision]}-#{deploy_id}"
350
+ },
351
+ {
352
+ parameter_key: "TaskDesiredCount",
353
+ parameter_value: "1"
354
+ },
355
+ {
356
+ parameter_key: "ECSClusterName",
357
+ parameter_value: @ecs_cluster_name
358
+ },
359
+ {
360
+ parameter_key: "ALBShortName",
361
+ parameter_value: "ecs-task-backoffice-qa-#{deploy_id}"[0..31]
362
+ }
363
+ ]
364
+ if stack_exists?(stack_name_backoffice)
365
+ update_stack(stack_name_backoffice, stack_body, parameters) if @backoffice_built
366
+ else
367
+ create_stack(stack_name_backoffice, stack_body, parameters, tags)
359
368
  end
360
369
 
361
- cluster_stack_name = "ecs-cluster-#{env_hash}"
362
- if stack_exists?(cluster_stack_name)
363
- tags = get_stack_tags(cluster_stack_name)
364
- tag_keep_data = Aws::CloudFormation::Types::Tag.new({key:'AUTOMATIC_DELETION_PROTECTION', value:'true'})
365
- tags.push tag_keep_data
370
+ wait_for_stack_ready(stack_name_web) unless stack_ready?(stack_name_web)
371
+ wait_for_stack_ready(stack_name_consumer) unless stack_ready?(stack_name_consumer)
372
+ wait_for_stack_ready(stack_name_urania) unless stack_ready?(stack_name_urania)
373
+ wait_for_stack_ready(stack_name_backoffice) unless stack_ready?(stack_name_backoffice)
374
+ wait_for_stack_ready(stack_name_ermes) unless stack_ready?(stack_name_ermes)
375
+ wait_for_stack_ready(stack_name_bburago) unless stack_ready?(stack_name_bburago)
376
+
377
+ update_service_defaults(stack_name_web)
378
+ update_service_defaults(stack_name_consumer)
379
+ update_service_defaults(stack_name_urania)
380
+ update_service_defaults(stack_name_backoffice)
381
+ update_service_defaults(stack_name_ermes)
382
+ update_service_defaults(stack_name_bburago)
383
+
384
+ stack_name_route53 = "ecs-route53-qa-#{deploy_id}"
385
+ stack_body = IO.read('cloudformation/stacks/route53/qa.yml')
386
+ parameters = [
387
+ {
388
+ parameter_key: "DnsRecordIdentifier",
389
+ parameter_value: @dns_record_identifier
390
+ },
391
+ {
392
+ parameter_key: "PrimaElbHostname",
393
+ parameter_value: get_alb_host(stack_name_web)
394
+ },
395
+ {
396
+ parameter_key: "BackofficeElbHostname",
397
+ parameter_value: get_alb_host(stack_name_backoffice)
398
+ },
399
+ {
400
+ parameter_key: "UraniaElbHostname",
401
+ parameter_value: get_alb_host(stack_name_urania)
402
+ },
403
+ {
404
+ parameter_key: "BburagoElbHostname",
405
+ parameter_value: get_alb_host(stack_name_bburago)
406
+ }
407
+ ]
408
+ create_stack(stack_name_route53, stack_body, parameters, tags) unless stack_exists?(stack_name_route53)
409
+
410
+ prima_hostname = get_route53_hostname(stack_name_web)
411
+ urania_hostname = get_route53_hostname(stack_name_urania)
412
+ bburago_hostname = get_route53_hostname(stack_name_bburago)
413
+ backoffice_hostname = get_route53_hostname(stack_name_backoffice)
414
+
415
+ wait_for_stack_ready(stack_name_route53) unless stack_ready?(stack_name_route53)
416
+
417
+ output "Prima url: #{prima_hostname}\n".cyan
418
+ output "Prima RI url: #{prima_hostname.sub("www", "wwwri")}\n".cyan
419
+ output "Urania url: #{urania_hostname}\n".cyan
420
+ output "Backoffice url: #{backoffice_hostname}\n".cyan
421
+ output "Bburago url: #{bburago_hostname}\n".cyan
422
+ output "SSH connection: ssh ec2-user@#{ec2_ip_address(asg_stack_name)} -i ~/.ssh/ecs-cluster-qa.pem".cyan
423
+ output "Deploy effettuato, everything is awesome!\n".green
424
+ end
425
+
426
+ def get_route53_hostname(stack_name)
427
+ case
428
+ when stack_name.include?('web')
429
+ host = "www.#{@dns_record_identifier}.qa.colaster.com"
430
+ when stack_name.include?('urania')
431
+ host = "urania.#{@dns_record_identifier}.qa.colaster.com"
432
+ when stack_name.include?('backoffice')
433
+ host = "backoffice.#{@dns_record_identifier}.qa.colaster.com"
434
+ when stack_name.include?('bburago')
435
+ host = "bburago.#{@dns_record_identifier}.qa.colaster.com"
366
436
  end
367
-
368
- update_cluster_stack(cluster_stack_name, tags)
369
-
370
- output "Finito!".green
437
+ host
371
438
  end
372
439
 
373
- def deploy_update!
374
- output "Deploy update menu"
375
- `git pull && git submodule init && git submodule update`
376
-
377
- @deploy_update = true
440
+ def ec2_ip_address(asg_stack_name)
441
+ resp = @cf.describe_stack_resource({
442
+ stack_name: asg_stack_name,
443
+ logical_resource_id: 'ECSAutoScalingGroup'
444
+ })
445
+ resp = @asg.describe_auto_scaling_groups({
446
+ auto_scaling_group_names: [resp.stack_resource_detail.physical_resource_id],
447
+ max_records: 1
448
+ })
449
+ instance_id = resp.auto_scaling_groups[0].instances[0].instance_id
450
+ resp = @ec2.describe_instances({instance_ids: [instance_id]})
451
+ resp.reservations[0].instances[0].private_ip_address
452
+ end
378
453
 
379
- output "Recupero le informazioni sui QA attivi..."
380
- stack_list, envs = get_stacks()
454
+ def get_alb_host(stack_name)
455
+ case
456
+ when stack_name.include?('web')
457
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
458
+ when stack_name.include?('urania')
459
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
460
+ when stack_name.include?('backoffice')
461
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
462
+ when stack_name.include?('bburago')
463
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
464
+ end
465
+ resp = @cf.describe_stack_resource({
466
+ stack_name: stack_name,
467
+ logical_resource_id: logical_resource_id
468
+ })
469
+ resp = @alb.describe_load_balancers({
470
+ load_balancer_arns: [resp.stack_resource_detail.physical_resource_id]
471
+ })
472
+ resp.load_balancers[0].dns_name
473
+ end
381
474
 
382
- env_hash = nil
383
- unless envs.empty?
384
- env_hash = choose do |menu|
385
- menu.prompt = "Scegli il QA che vuoi aggiornare: ".cyan
386
- menu.shell = true
387
- envs.each do |key, env|
388
- title = ""
389
- env.each do |e|
390
- title << "\n#{e.key.upcase}: #{e.value}"
391
- end
392
- msg = "#{@prima.reduce_size(title, 1000)}".light_blue
393
- menu.choice(msg) { key }
394
- end
395
- end
396
- else
397
- output "Nessun QA trovato".red
398
- exit
475
+ def get_elb_host(stack_name)
476
+ case
477
+ when stack_name.include?('web')
478
+ logical_resource_id = 'EcsElasticLoadBalancerPublic'
479
+ when stack_name.include?('urania')
480
+ logical_resource_id = 'EcsElasticLoadBalancerInternal'
481
+ when stack_name.include?('backoffice')
482
+ logical_resource_id = 'EcsElasticLoadBalancerPublic'
483
+ when stack_name.include?('bburago')
484
+ logical_resource_id = 'EcsElasticLoadBalancerInternal'
399
485
  end
486
+ resp = @cf.describe_stack_resource({
487
+ stack_name: stack_name,
488
+ logical_resource_id: logical_resource_id
489
+ })
490
+ resp = @elb.describe_load_balancers({
491
+ load_balancer_names: [resp.stack_resource_detail.physical_resource_id],
492
+ page_size: 1
493
+ })
494
+ resp.load_balancer_descriptions[0].dns_name
495
+ end
400
496
 
401
- envs[env_hash].each do |env|
402
- unless ['hostname_pattern_priority', 'AUTOMATIC_DELETION_PROTECTION'].include? env.key
403
- @projects[env.key] = select_branch_to_deploy(env.key, env.value)
497
+ def update_service_defaults(stack_name)
498
+ case
499
+ when stack_name.include?('web')
500
+ logical_resource_id = 'ECSServiceWeb'
501
+ when stack_name.include?('consumer')
502
+ logical_resource_id = 'ECSServiceConsumer'
503
+ when stack_name.include?('urania')
504
+ logical_resource_id = 'ECSServiceUrania'
505
+ when stack_name.include?('backoffice')
506
+ logical_resource_id = 'ECSServiceBackoffice'
507
+ when stack_name.include?('ermes')
508
+ logical_resource_id = 'ECSServiceErmes'
509
+ when stack_name.include?('bburago')
510
+ logical_resource_id = 'ECSServiceBburago'
511
+ else
512
+ raise "Service name non gestito per lo stack #{stack_name}"
513
+ end
514
+ resp = @cf.describe_stack_resource({
515
+ stack_name: stack_name,
516
+ logical_resource_id: logical_resource_id
517
+ })
518
+ resp = @ecs.update_service({
519
+ cluster: @ecs_cluster_name,
520
+ service: resp.stack_resource_detail.physical_resource_id,
521
+ deployment_configuration: {
522
+ minimum_healthy_percent: 0,
523
+ maximum_percent: 100
524
+ }
525
+ })
526
+ end
527
+
528
+ def create_urania_artifact(revision)
529
+ @urania_built = true
530
+ output "Preparo l'artifact .zip\n".yellow
531
+
532
+ git_checkout_version('urania', revision)
533
+
534
+ Dir.chdir 'projects/urania'
535
+
536
+ [
537
+ "docker-compose build web",
538
+ "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh urania_web \
539
+ '-c' 'mix local.hex --force && mix hex.info && \
540
+ mix deps.get && mix compile && mix deps.compile && \
541
+ mv rel/vm.args rel/config.exs /tmp/ && mix release.clean --implode --no-confirm && \
542
+ mkdir rel && mv /tmp/vm.args /tmp/config.exs rel/ && mix release --env=qa'",
543
+ "sudo chown -R `whoami` ."
544
+ ].each do |cmd|
545
+ output "Eseguo #{cmd}".yellow
546
+ res = %x[ #{cmd} ]
547
+ if $?.exitstatus != 0
548
+ color = 'red'
549
+ else
550
+ color = 'green'
404
551
  end
552
+ output res.send color
553
+ stop_if (color == 'red'), "Errore durante la build dell'artifact".red
405
554
  end
406
- deploy_feature!
407
555
 
408
- output "Finito!".green
409
- end
556
+ artifact_path = Dir.glob("rel/urania/releases/*/urania.tar.gz").first
557
+ upload_artifact(artifact_path, "microservices/urania/#{revision}-qa.tar.gz")
410
558
 
411
- def get_default_branch_name(projects)
412
- projects.each_key do |project|
413
- return projects[project]['name'] if not projects[project]['default_branch']
414
- end
559
+ Dir.chdir '../../'
415
560
  end
416
561
 
417
- def suite_py_branches(args_json)
418
- arg_projects = JSON.parse(args_json)
562
+ def create_ermes_artifact(revision)
563
+ @ermes_built = true
564
+ output "Preparo l'artifact .zip\n".yellow
565
+
566
+ git_checkout_version('ermes', revision)
419
567
 
420
- @projects.merge!(arg_projects)
568
+ Dir.chdir 'projects/ermes'
421
569
 
422
- @projects.each_key do |project|
423
- if @projects[project].empty?
424
- @projects[project] = choose_branch_to_deploy(project, true)
570
+ [
571
+ "docker-compose build app",
572
+ "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh ermes_app \
573
+ '-c' 'mix local.hex --force && mix hex.info && \
574
+ mix deps.get && mix compile && mix deps.compile && \
575
+ mv rel/vm.args rel/config.exs /tmp/ && mix release.clean --implode --no-confirm && \
576
+ mkdir rel && mv /tmp/vm.args /tmp/config.exs rel/ && mix release --env=qa'",
577
+ "sudo chown -R `whoami` ."
578
+ ].each do |cmd|
579
+ output "Eseguo #{cmd}".yellow
580
+ res = %x[ #{cmd} ]
581
+ if $?.exitstatus != 0
582
+ color = 'red'
583
+ else
584
+ color = 'green'
425
585
  end
586
+ output res.send color
587
+ stop_if (color == 'red'), "Errore durante la build dell'artifact".red
426
588
  end
427
- end
428
589
 
429
- def get_git_user()
430
- `git config user.name`.gsub(/[^A-Za-z]/, '').gsub("\n", '')
431
- end
590
+ artifact_path = Dir.glob("rel/ermes/releases/*/ermes.tar.gz").first
591
+ upload_artifact(artifact_path, "microservices/ermes/#{revision}-qa.tar.gz")
432
592
 
433
- def get_git_mail()
434
- `git config user.email`.gsub("\n", '')
593
+ Dir.chdir '../../'
435
594
  end
436
595
 
437
- def qainit_deploy!(quiet = false)
438
- `git checkout master && git pull && git submodule update --init --recursive && git remote prune origin`
596
+ def create_bburago_artifact(revision)
597
+ @bburago_built = true
598
+ output "Preparo l'artifact .zip\n".yellow
439
599
 
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`
600
+ git_checkout_version('bburago', revision)
441
601
 
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)
447
- end
448
- feature_number = default_name if feature_number.empty?
449
- branch_name = get_git_user + '_' + feature_number
602
+ Dir.chdir 'projects/bburago'
450
603
 
451
- if `git branch -l | grep #{branch_name}`.size > 0
452
- `git checkout #{branch_name} && git pull`
453
- else
454
- `git checkout -b #{branch_name}`
604
+ [
605
+ "docker-compose build web",
606
+ "docker run -v $PWD:/code -w /code -e MIX_ENV=qa --entrypoint /bin/sh bburago_web \
607
+ '-c' 'mix local.hex --force && mix hex.info && \
608
+ mix deps.get && mix compile && mix deps.compile && \
609
+ mv rel/vm.args rel/config.exs /tmp/ && mix release.clean --implode --no-confirm && \
610
+ mkdir rel && mv /tmp/vm.args /tmp/config.exs rel/ && mix release --env=qa'",
611
+ "sudo chown -R `whoami` ."
612
+ ].each do |cmd|
613
+ output "Eseguo #{cmd}".yellow
614
+ res = %x[ #{cmd} ]
615
+ if $?.exitstatus != 0
616
+ color = 'red'
617
+ else
618
+ color = 'green'
619
+ end
620
+ output res.send color
621
+ stop_if (color == 'red'), "Errore durante la build dell'artifact".red
455
622
  end
456
623
 
457
- @git_branch = branch_name
624
+ artifact_path = Dir.glob("rel/bburago/releases/*/bburago.tar.gz").first
625
+ upload_artifact(artifact_path, "microservices/bburago/#{revision}-qa.tar.gz")
458
626
 
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`
627
+ Dir.chdir '../../'
468
628
  end
469
629
 
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
487
- end
488
- # checkout master, checkout branch, pull branch
489
- `git checkout master && git checkout #{chosen_branch} && git pull`
630
+ def create_backoffice_artifact(revision, deploy_id)
631
+ @backoffice_built = true
632
+ output "Preparo l'artifact .zip\n".yellow
633
+
634
+ git_checkout_version('backoffice', revision)
490
635
 
491
- # aggiornare il commit (revision a cui fa riferimento)
636
+ Dir.chdir 'projects/backoffice'
492
637
 
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)
638
+ ['node_modules'].each do |dir|
639
+ unless File.directory?(dir)
640
+ if File.directory?("../../../backoffice/#{dir}")
641
+ exec_step "rsync -a ../../../backoffice/#{dir} ."
642
+ end
498
643
  end
499
644
  end
500
645
 
501
- projects.each do |key, project|
502
- @projects[key] = select_branch_to_deploy(key, project['name'])
503
- @projects[key]['default_branch'] = project['default_branch']
646
+ stack_name_web = "ecs-task-web-qa-notneeded"
647
+ web_qa_host = get_route53_hostname(stack_name_web)
648
+ webri_qa_host = web_qa_host.sub("www", "wwwri")
649
+
650
+ [
651
+ "docker-compose build workers",
652
+ "cd ../../ && docker run -e GIT_DIR=$PWD -v $PWD:/usr/app/src -w /usr/app/src/projects/backoffice blinkmobile/bower install --allow-root",
653
+ "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'",
654
+ "sudo chown -R `whoami` ."
655
+ ].each do |cmd|
656
+ output "Eseguo #{cmd}".yellow
657
+ res = %x[ #{cmd} ]
658
+ if $?.exitstatus != 0
659
+ color = 'red'
660
+ else
661
+ color = 'green'
662
+ end
663
+ output res.send color
664
+ stop_if (color == 'red'), "Errore durante la build dell'artifact".red
504
665
  end
505
666
 
506
- File.open('branch_names', 'w') { |file| file.write(JSON.generate(@projects)) }
507
-
508
- update_drone_yml!
667
+ artifact_path = '/tmp/backoffice.zip'
668
+ exec_step "rm -f #{artifact_path} && zip -9 -r #{artifact_path} bin/"
669
+ upload_artifact(artifact_path, "backoffice/#{revision}-#{deploy_id}.zip")
509
670
 
510
- `git add branch_names .drone.yml`
511
- `git commit -m 'update'`
512
- `git push && git checkout master`
671
+ Dir.chdir '../../'
513
672
  end
514
673
 
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
532
- else
533
- chosen_branch = selection
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
674
+ def create_prima_artifact(revision, branch_name)
675
+ @prima_built = true
676
+ output "Preparo l'artifact .zip\n".yellow
539
677
 
540
- def qainit_drone_shutdown!
541
- output "Recupero le informazioni sui QA attivi..."
542
- stack_list, envs = get_stacks
678
+ git_checkout_version('prima', revision)
543
679
 
544
- env_hash = "qa-" + get_deploy_id
680
+ Dir.chdir 'projects/prima'
545
681
 
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)
682
+ ['vendor'].each do |dir|
683
+ unless File.directory?(dir)
684
+ if File.directory?("../../../prima/#{dir}")
685
+ exec_step "rsync -a ../../../prima/#{dir} ."
556
686
  end
557
687
  end
558
688
  end
559
689
 
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)
690
+ backoffice_qa_host = get_route53_hostname("ecs-task-backoffice-qa-notneeded")
691
+ web_qa_host = get_route53_hostname("ecs-task-web-qa-notneeded")
565
692
 
566
- if aggregator_enabled
567
- dns_to_staging(env_hash)
693
+ [
694
+ "bin/local_build_artifact.sh #{branch_name} #{web_qa_host} #{backoffice_qa_host}"
695
+ ].each do |cmd|
696
+ output "Eseguo #{cmd}".yellow
697
+ res = %x[ #{cmd} ]
698
+ if $?.exitstatus != 0
699
+ color = 'red'
700
+ else
701
+ color = 'green'
568
702
  end
703
+ output res.send color
704
+ exec_step "docker stop redis" if color == 'red'
705
+ stop_if (color == 'red'), "Errore durante la build dell'artifact".red
569
706
  end
570
707
 
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"
708
+ Dir.chdir "../../"
709
+ end
710
+
711
+ def git_checkout_version(project, revision)
712
+ Dir.chdir "projects/#{project}"
713
+ exec_step "git checkout -- . && git clean -f -d && git checkout #{revision}"
714
+ Dir.chdir "../../"
715
+ end
716
+
717
+ def upload_artifact(source_path, destination_path)
718
+ output "Upload dell'artifact in corso (#{(File.size(source_path).to_f / 2**20).round(2)} MiB)\n".yellow
719
+ s3 = Aws::S3::Resource.new
720
+ obj = s3.bucket(@s3_bucket).object(destination_path)
721
+ obj.upload_file(source_path)
573
722
 
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)
723
+ output "#{@s3_bucket}/#{destination_path} uploadato con successo!\n".green
724
+ end
725
+
726
+ def wait_for_stack_ready(stack_name)
727
+ ready = false
728
+ sleep_seconds = 10
729
+ output "Attendo che lo stack #{stack_name} finisca di essere inizializzato...\n".yellow
730
+ while !ready
731
+ ready = true if stack_ready?(stack_name)
732
+ seconds_elapsed = 0
733
+ while true
734
+ break if seconds_elapsed >= sleep_seconds
735
+ print '.'.yellow; STDOUT.flush
736
+ sleep 1
737
+ seconds_elapsed += 1
578
738
  end
579
- output "Stack ancora attivi: #{stacks_to_delete.length.to_s}. Attendo altri 10 secondi per eliminare il cluster ECS"
580
739
  end
581
740
 
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
741
+ output "\nStack #{stack_name} pronto!\n".green
589
742
  end
590
743
 
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
744
+ def stack_list
745
+ resp = @cf.describe_stacks
746
+ stacks = resp.stacks
747
+ stacks.keep_if { |stack| stack.stack_name.include? '-qa-' }
748
+ stacks
596
749
  end
597
750
 
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)
605
- end
751
+ def delete_stack(stack_name)
752
+ @cf.delete_stack({stack_name: stack_name})
753
+ output "Stack #{stack_name} spenta con successo\n".green
606
754
  end
607
755
 
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
756
+ def stack_ready?(stack_name)
757
+ resp = @cf.describe_stacks({
758
+ stack_name: stack_name
759
+ })
760
+ ['CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_ROLLBACK_COMPLETE'].include? resp.stacks[0].stack_status
615
761
  end
616
762
 
617
- def get_alb_host(stack_name)
618
- case
619
- when stack_name.include?('web')
620
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
621
- when stack_name.include?('urania')
622
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
623
- when stack_name.include?('backoffice')
624
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
625
- when stack_name.include?('bburago')
626
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
627
- when stack_name.include?('hal9000')
628
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
629
- when stack_name.include?('fidaty')
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'
637
- when stack_name.include?('alb-http-public')
638
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
639
- when stack_name.include?('alb-ws-public')
640
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
641
- when stack_name.include?('peano')
642
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
643
- when stack_name.include?('leftorium')
644
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
645
- when stack_name.include?('assange')
646
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
647
- when stack_name.include?('borat')
648
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
649
- when stack_name.include?('crash')
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'
763
+ def create_asg_stack(stack_name, tags = [])
764
+ stack_body = IO.read('cloudformation/stacks/asg/ecs-asg-allinone.yml')
765
+ parameters = [
766
+ {
767
+ parameter_key: "Environment",
768
+ parameter_value: "qa"
769
+ },
770
+ {
771
+ parameter_key: "InstanceType",
772
+ parameter_value: "t2.large"
773
+ },
774
+ {
775
+ parameter_key: "ECSClusterName",
776
+ parameter_value: @ecs_cluster_name
777
+ }
778
+ ]
779
+ create_stack(stack_name, stack_body, parameters, tags)
780
+ end
781
+
782
+ def create_cluster_stack(stack_name, tags = [])
783
+ stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
784
+ create_stack(stack_name, stack_body, [], tags)
785
+ end
786
+
787
+ def import_dbs(ip_address)
788
+ resp = @ecs.run_task({
789
+ cluster: @ecs_cluster_name,
790
+ task_definition: @import_db_task,
791
+ overrides: {
792
+ container_overrides: [
793
+ {
794
+ name: 'dbrestore',
795
+ environment: [
796
+ {
797
+ name: 'EC2_IP_ADDRESS',
798
+ value: ip_address,
799
+ }
800
+ ]
801
+ }
802
+ ]
803
+ },
804
+ count: 1
805
+ })
806
+ output "Attendo che i DB vengano importati...\n".yellow
807
+ stopped_at = nil
808
+ while stopped_at.nil?
809
+ resp = @ecs.describe_tasks({
810
+ cluster: @ecs_cluster_name,
811
+ tasks: [resp.tasks[0].task_arn]
812
+ })
813
+ stopped_at = resp.tasks[0].stopped_at
814
+ sleep_seconds = 10
815
+ seconds_elapsed = 0
816
+ while true && stopped_at.nil?
817
+ break if seconds_elapsed >= sleep_seconds
818
+ print '.'.yellow; STDOUT.flush
819
+ sleep 1
820
+ seconds_elapsed += 1
821
+ end
661
822
  end
662
- resp = describe_stack_resource(stack_name, logical_resource_id)
663
- resp = describe_load_balancers([resp.stack_resource_detail.physical_resource_id])
664
- resp.load_balancers[0].dns_name
823
+ print "\n"
665
824
  end
666
825
 
667
- def deploy_pyxis?
668
- if defined? @deploy_pyxis
669
- @deploy_pyxis
826
+ def stack_exists?(stack_name)
827
+ begin
828
+ res = @cf.describe_stacks({
829
+ stack_name: stack_name
830
+ })
831
+ rescue Aws::CloudFormation::Errors::ValidationError => e
832
+ if e.message.include? 'does not exist'
833
+ false
834
+ else
835
+ raise e
836
+ end
670
837
  else
671
- pyxis_updated = `git log -p -1 --unified=0 | grep pyxis-npm:`.length > 0
672
-
673
- update_pyxis = !@projects['pyxis-npm'].empty? && @projects['pyxis-npm']['name'] != 'master' && pyxis_updated
674
-
675
- @deploy_pyxis = update_pyxis
676
- return update_pyxis
838
+ true
839
+ end
840
+ end
841
+
842
+ def create_stack(stack_name, stack_body, parameters = [], tags = [])
843
+ @cf.create_stack({
844
+ stack_name: stack_name,
845
+ template_body: stack_body,
846
+ parameters: parameters,
847
+ tags: tags,
848
+ capabilities: ["CAPABILITY_IAM"],
849
+ on_failure: "ROLLBACK"
850
+ })
851
+ output "La creazione dello stack #{stack_name} è stata avviata".green
852
+ end
853
+
854
+ def update_stack(stack_name, stack_body, parameters = [])
855
+ begin
856
+ @cf.update_stack({
857
+ stack_name: stack_name,
858
+ template_body: stack_body,
859
+ parameters: parameters,
860
+ capabilities: ["CAPABILITY_IAM"]
861
+ })
862
+ rescue Aws::CloudFormation::Errors::ValidationError => e
863
+ # if e.message.include? 'does not exist'
864
+ # false
865
+ # else
866
+ # raise e
867
+ # end
868
+ raise e
869
+ else
870
+ output "L'update dello stack #{stack_name} è stato avviato".green
677
871
  end
678
872
  end
679
873
 
680
- def update_cluster_stack(stack_name, tags = [])
681
- stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
682
- update_stack(stack_name, stack_body, [], tags)
874
+ def artifact_exists?(bucket, path)
875
+ resp = @s3.list_objects({
876
+ bucket: bucket,
877
+ max_keys: 1,
878
+ prefix: path
879
+ })
880
+ !resp.contents.empty?
683
881
  end
684
882
 
685
- def choose_branch_to_deploy(project_name, select_master = false)
883
+ def choose_branch_to_deploy(project_name)
686
884
  Dir.chdir "projects/#{project_name}"
687
885
  output "Recupero la lista dei branch del progetto #{project_name}..."
688
- `git remote prune origin`
689
886
  out = %x[ git fetch ]
690
- branches = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname) %(committeremail)' | sed 's/refs\\/remotes\\/origin\\///g' ]
691
- .split("\n").delete_if { |b| b.include?('HEAD') }[0..49]
692
-
693
- master_branch = nil
694
-
695
- branches.each do |branch|
696
- master_branch = branch if branch.match(/^master\s+/)
697
- break unless master_branch.nil?
698
- end
887
+ branches = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname)' | sed 's/refs\\/remotes\\/origin\\///g' ]
888
+ .split("\n").delete_if { |b| b.include?('HEAD') || b.include?('dev') }[0..49]
699
889
 
700
- if select_master || branches.length == 1
701
- branch_name = master_branch
702
- else
703
- branches.insert(0, branches.delete(master_branch))
704
- branch_name = choose do |menu|
705
- menu.prompt = "Scegli il branch di #{project_name} da deployare: ".cyan
706
- menu.shell = true
890
+ branch_name = choose do |menu|
891
+ menu.prompt = "Scegli il branch di #{project_name} da deployare: ".cyan
892
+ menu.shell = true
707
893
 
708
- git_mail = get_git_mail
894
+ branches.each do |branch|
709
895
 
710
- branches.each_with_index do |branch, index|
711
- title = @prima.reduce_size(branch, 100)
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
714
- menu.choice(msg) { branch }
715
- menu.default = branch if branch == master_branch
716
- end
896
+ title = @prima.reduce_size(branch, 100)
897
+ msg = "#{title}".light_blue
898
+ menu.choice(msg) { branch }
717
899
  end
718
900
  end
719
901
 
720
902
  Dir.chdir "../../"
721
903
 
722
- name = branch_name.split(' ')[0]
723
- revision = branch_name.split(' ')[1]
724
- committer_email = branch_name.split(' ')[2].tr('<>', '')
725
- { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email, 'default_branch' => select_master }
726
- end
727
-
728
- def select_branch_to_deploy(project_name, branch_name)
729
- Dir.chdir "projects/#{project_name}"
730
- output "Recupero il branch #{project_name}:#{branch_name} ..."
731
- `git remote prune origin`
732
- out = %x[ git fetch ]
733
- branch_name = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname) %(committeremail)' | sed 's/refs\\/remotes\\/origin\\///g' ]
734
- .split("\n").delete_if { |b| !b.match("^#{Regexp.escape(branch_name)}") }[0..49]
735
- .first
736
-
737
- Dir.chdir "../../"
738
- name = branch_name.split(' ')[0]
739
- revision = branch_name.split(' ')[1]
740
- committer_email = branch_name.split(' ')[2].tr('<>', '')
741
- { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email }
742
- end
743
-
744
- def get_stacks()
745
- envs = {}
746
- stack_list = stack_list()
747
- stack_list.each do |stack|
748
- unless stack.stack_name.match(/spotfleet-allinone-qa-(\w+)$/)
749
- env_hash = stack.stack_name.match(/qa-(\w+)$/)[0]
750
- envs[env_hash] = stack.tags unless envs.has_key?(env_hash) || stack.tags.empty?
751
- end
752
- end
753
- return stack_list, envs
754
- end
755
-
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?
763
- end
764
- end
765
- return cluster_list, envs
904
+ name = branch_name.split(' ').first
905
+ revision = branch_name.split(' ').last
906
+ { name: name, revision: revision[0..14] }
766
907
  end
767
908
 
768
- def hostname_pattern_priority()
769
- (Time.now.to_i.to_s[-4..-1].to_i + Random.rand(40000)).to_s
770
- end
771
-
772
- def select_branches(project_names = nil)
773
- output "Deploy feature menu"
774
- if project_names.nil?
775
- @projects.each{ |key, value| @projects[key] = choose_branch_to_deploy(key) }
776
- else
777
- project_names.each do |project|
778
- @projects[project] = choose_branch_to_deploy(project)
779
- end
780
- @projects.each_key do |branch_project|
781
- @projects[branch_project] = choose_branch_to_deploy(branch_project, true) unless project_names.include? branch_project
782
- end
783
- end
784
- end
785
909
  end
786
910
 
787
911
  def help_content
@@ -798,24 +922,14 @@ Synopsis
798
922
  twig release start
799
923
  twig release finish
800
924
  twig release deploy
801
- twig release aggregator
802
925
 
803
926
  Description
804
927
  -----------
805
928
 
806
- start creates a new feature branch
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
- -----------
814
- deploy deploys the feature branch to a temporary AWS Elastic Beanstalk env
815
- deploy stop destroys the AWS Elastic Beanstalk env
816
- deploy update updates a feature branch with current branches
817
- deploy lock protects a qa environment from automatic deletion
818
- aggregator enable/disable directs comparator's staging environments to a qa/staging
929
+ start creates a new feature branch
930
+ finish finishes the feature by merging to dev and master
931
+ deploy deploys the feature branch to a temporary AWS Elastic Beanstalk env
932
+ deploy stop destroys the AWS Elastic Beanstalk env
819
933
 
820
934
  Subcommand for Twig: <http://rondevera.github.io/twig/>
821
935
  Author: Andrea Usuelli <https://github.com/andreausu>
@@ -830,11 +944,4 @@ if args.include?('--help')
830
944
  exit
831
945
  end
832
946
 
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)
947
+ Release.new.execute!(args)