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