prima-twig 1.2.6 → 1.3.4
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 +4 -4
- data/bin/twig-feature +155 -160
- data/bin/twig-packer-builder +84 -0
- data/bin/twig-update-ami +48 -114
- data/lib/command.rb +2 -2
- data/lib/prima_aws_client.rb +146 -146
- metadata +14 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 51cb0052822145cda1bf819fcfe58de19406d13d3a1124220e0b46c029d386b9
|
|
4
|
+
data.tar.gz: 0771ece2ce724ae9aa119fa6dbb6b2532083fb2a9aaef73f23a2fc2586a28ee5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4301bf537b0eb0971092f3ff7118dc4b4a75ba077509a97be26af3145bbd153a0a8f20cb896a9a4d3829ace185c159564d80381ec72ef4cf2acd7744e8a284db
|
|
7
|
+
data.tar.gz: f97669324765a6445657d49649b06d1c740a737f9b71fc874585bdb476dbeaea8fa09036d28517cf1594358f14f938161050f8374d862f7d412a0c5309639e3d
|
data/bin/twig-feature
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
3
|
require 'rubygems'
|
|
4
|
-
require_relative '../lib/prima_twig
|
|
5
|
-
require_relative '../lib/prima_aws_client
|
|
4
|
+
require_relative '../lib/prima_twig'
|
|
5
|
+
require_relative '../lib/prima_aws_client'
|
|
6
6
|
require 'digest'
|
|
7
7
|
require 'json'
|
|
8
8
|
require 'launchy'
|
|
@@ -14,11 +14,11 @@ class Release
|
|
|
14
14
|
include Command
|
|
15
15
|
include PrimaAwsClient
|
|
16
16
|
|
|
17
|
-
def initialize(update_gem=true)
|
|
17
|
+
def initialize(update_gem = true)
|
|
18
18
|
@prima = Prima.new
|
|
19
19
|
if update_gem
|
|
20
20
|
output 'Controllo se ci sono aggiornamenti da fare (potrebbe richiedere qualche minuto)'
|
|
21
|
-
unless `gem update prima-twig
|
|
21
|
+
unless `gem update prima-twig` == "Updating installed gems\nNothing to update\n"
|
|
22
22
|
output 'Gemma prima-twig aggiornata'
|
|
23
23
|
exec "twig feature #{ARGV.join ' '}"
|
|
24
24
|
end
|
|
@@ -47,20 +47,22 @@ class Release
|
|
|
47
47
|
'legion' => {},
|
|
48
48
|
'vianello' => {},
|
|
49
49
|
'domus' => {},
|
|
50
|
-
'toretto' => {}
|
|
50
|
+
'toretto' => {},
|
|
51
|
+
'lira' => {},
|
|
52
|
+
'frontale' => {}
|
|
51
53
|
}
|
|
52
54
|
@base_stack_name_alb = 'ecs-alb-http-public-qa-'
|
|
53
55
|
@base_stack_name_alb_ws = 'ecs-alb-ws-public-qa-'
|
|
54
56
|
@cloudflare = Rubyflare.connect_with(ENV['CLOUDFLARE_EMAIL'], ENV['CLOUDFLARE_APIKEY'])
|
|
55
57
|
@config = YAML.load_file 'twig.yml'
|
|
56
|
-
@gh = Octokit::Client.new(:
|
|
58
|
+
@gh = Octokit::Client.new(access_token: @config['github'])
|
|
57
59
|
end
|
|
58
60
|
|
|
59
61
|
def execute!(args)
|
|
60
62
|
case args[0]
|
|
61
63
|
when 'qainit'
|
|
62
|
-
abort('Non sei nella cartella di qainit') unless Dir.pwd.match
|
|
63
|
-
if [
|
|
64
|
+
abort('Non sei nella cartella di qainit') unless Dir.pwd.match('qainit$') || Dir.pwd.match('/drone/src')
|
|
65
|
+
if %w[terminate stop shutdown halt destroy].include? args[1]
|
|
64
66
|
qainit_deploy_shutdown!
|
|
65
67
|
elsif 'update' == args[1]
|
|
66
68
|
qainit_deploy_update!
|
|
@@ -75,13 +77,11 @@ class Release
|
|
|
75
77
|
when 'suite'
|
|
76
78
|
abort('Non sei nella cartella di qainit') unless Dir.pwd.match 'qainit$'
|
|
77
79
|
if 'deploy' == args[1]
|
|
78
|
-
suite_py_branches
|
|
80
|
+
suite_py_branches
|
|
79
81
|
qainit_deploy!(true)
|
|
80
82
|
end
|
|
81
83
|
when 'deploy'
|
|
82
|
-
if 'lock' == args[1]
|
|
83
|
-
deploy_lock!
|
|
84
|
-
end
|
|
84
|
+
deploy_lock! if 'lock' == args[1]
|
|
85
85
|
when 'aggregator'
|
|
86
86
|
if 'enable' == args[1]
|
|
87
87
|
aggregator_enable!
|
|
@@ -103,25 +103,25 @@ class Release
|
|
|
103
103
|
def aggregator_disable!
|
|
104
104
|
output 'Disable aggregator'
|
|
105
105
|
|
|
106
|
-
output
|
|
107
|
-
output
|
|
108
|
-
stack_list, envs = get_stacks
|
|
106
|
+
output 'Recupero le informazioni relative al puntamento dei record DNS...'
|
|
107
|
+
output 'Recupero le informazioni sui QA attivi...'
|
|
108
|
+
stack_list, envs = get_stacks
|
|
109
109
|
|
|
110
110
|
env_hash = nil
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
if envs.empty?
|
|
112
|
+
output 'Nessun QA trovato'.red
|
|
113
|
+
exit
|
|
114
|
+
else
|
|
115
|
+
env_hash = envs.detect do |_key, tags|
|
|
113
116
|
aggregator_enabled = tags.detect do |tag|
|
|
114
|
-
tag.key ===
|
|
117
|
+
tag.key === 'hostname_pattern_priority' and tag.value === '1'
|
|
115
118
|
end.is_a?(Aws::CloudFormation::Types::Tag)
|
|
116
119
|
aggregator_enabled
|
|
117
120
|
end[0]
|
|
118
|
-
dns_records = @cloudflare.get(
|
|
119
|
-
stop_if dns_records.body[:result].empty?,
|
|
120
|
-
change_hostname_priority(env_hash, hostname_pattern_priority
|
|
121
|
+
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]) })
|
|
122
|
+
stop_if dns_records.body[:result].empty?, 'I record DNS degli aggregatori non stanno puntando ad un QA'.red
|
|
123
|
+
change_hostname_priority(env_hash, hostname_pattern_priority)
|
|
121
124
|
dns_to_staging(env_hash)
|
|
122
|
-
else
|
|
123
|
-
output 'Nessun QA trovato'.red
|
|
124
|
-
exit
|
|
125
125
|
end
|
|
126
126
|
|
|
127
127
|
output 'Finito!'.green
|
|
@@ -134,46 +134,46 @@ class Release
|
|
|
134
134
|
dns_records = @cloudflare.get('zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records', { per_page: 100, type: 'CNAME', content: 'staging.prima.it' })
|
|
135
135
|
stop_if dns_records.body[:result].empty?, "I record DNS degli aggregatori stanno gia' puntando ad un QA".red
|
|
136
136
|
|
|
137
|
-
output
|
|
138
|
-
stack_list, envs = get_stacks
|
|
137
|
+
output 'Recupero le informazioni sui QA attivi...'
|
|
138
|
+
stack_list, envs = get_stacks
|
|
139
139
|
|
|
140
140
|
env_hash = nil
|
|
141
|
-
|
|
141
|
+
if envs.empty?
|
|
142
|
+
output 'Nessun QA trovato'.red
|
|
143
|
+
exit
|
|
144
|
+
else
|
|
142
145
|
env_hash = choose do |menu|
|
|
143
|
-
menu.prompt =
|
|
146
|
+
menu.prompt = 'Scegli il QA al quale vuoi far puntare gli ambienti di staging dei comparatori: '.cyan
|
|
144
147
|
menu.shell = true
|
|
145
148
|
envs.each do |key, env|
|
|
146
|
-
title =
|
|
149
|
+
title = ''
|
|
147
150
|
env.each do |e|
|
|
148
151
|
title << "\n#{e.key.upcase}: #{e.value}"
|
|
149
152
|
end
|
|
150
|
-
msg =
|
|
153
|
+
msg = @prima.reduce_size(title, 1000).to_s.light_blue
|
|
151
154
|
menu.choice(msg) { key }
|
|
152
155
|
end
|
|
153
156
|
end
|
|
154
|
-
else
|
|
155
|
-
output "Nessun QA trovato".red
|
|
156
|
-
exit
|
|
157
157
|
end
|
|
158
158
|
|
|
159
|
-
change_hostname_priority(env_hash,
|
|
159
|
+
change_hostname_priority(env_hash, '1')
|
|
160
160
|
|
|
161
161
|
dns_records.body[:result].each do |dns|
|
|
162
|
-
if dns[:name] =~ /^\w
|
|
162
|
+
if dns[:name] =~ /^\w+-\w+-staging\.prima\.it$/
|
|
163
163
|
output "Changing #{dns[:name]} DNS record"
|
|
164
|
-
@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})
|
|
164
|
+
@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 })
|
|
165
165
|
end
|
|
166
166
|
end
|
|
167
167
|
|
|
168
|
-
output
|
|
168
|
+
output 'Finito!'.green
|
|
169
169
|
end
|
|
170
170
|
|
|
171
171
|
def change_hostname_priority(env_hash, hostname_pattern_priority)
|
|
172
172
|
cluster_stack_name = "ecs-cluster-#{env_hash}"
|
|
173
173
|
tags = get_stack_tags(cluster_stack_name).map do |tag|
|
|
174
|
-
if tag.key ===
|
|
174
|
+
if tag.key === 'hostname_pattern_priority'
|
|
175
175
|
{
|
|
176
|
-
key:
|
|
176
|
+
key: 'hostname_pattern_priority',
|
|
177
177
|
value: hostname_pattern_priority
|
|
178
178
|
}
|
|
179
179
|
else
|
|
@@ -198,14 +198,14 @@ class Release
|
|
|
198
198
|
|
|
199
199
|
stack_name_web = "ecs-task-web-#{env_hash}"
|
|
200
200
|
parameters = get_stack_parameters(stack_name_web).map do |param|
|
|
201
|
-
if param.parameter_key ===
|
|
201
|
+
if param.parameter_key === 'HostnamePatternPriority'
|
|
202
202
|
{
|
|
203
|
-
parameter_key:
|
|
203
|
+
parameter_key: 'HostnamePatternPriority',
|
|
204
204
|
parameter_value: hostname_pattern_priority
|
|
205
205
|
}
|
|
206
|
-
elsif param.parameter_key ===
|
|
206
|
+
elsif param.parameter_key === 'HostnamePatternAggregatorPriority'
|
|
207
207
|
{
|
|
208
|
-
parameter_key:
|
|
208
|
+
parameter_key: 'HostnamePatternAggregatorPriority',
|
|
209
209
|
parameter_value: (hostname_pattern_priority.to_i + 1).to_s
|
|
210
210
|
}
|
|
211
211
|
else
|
|
@@ -219,22 +219,25 @@ class Release
|
|
|
219
219
|
end
|
|
220
220
|
|
|
221
221
|
def dns_to_staging(env_hash)
|
|
222
|
-
output
|
|
223
|
-
dns_records = @cloudflare.get(
|
|
222
|
+
output 'Recupero le informazioni relative al puntamento dei record DNS...'
|
|
223
|
+
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]) })
|
|
224
224
|
dns_records.body[:result].each do |dns|
|
|
225
|
-
if dns[:name] =~ /^\w
|
|
225
|
+
if dns[:name] =~ /^\w+-\w+-staging\.prima\.it$/
|
|
226
226
|
output "Changing #{dns[:name]} DNS record"
|
|
227
|
-
@cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", {type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1})
|
|
227
|
+
@cloudflare.put("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns[:id]}", { type: 'CNAME', name: dns[:name], content: 'staging.prima.it', proxied: true, ttl: 1 })
|
|
228
228
|
end
|
|
229
229
|
end
|
|
230
230
|
end
|
|
231
231
|
|
|
232
232
|
def deploy_shutdown!
|
|
233
|
-
output
|
|
233
|
+
output 'Recupero le informazioni sui QA attivi...'
|
|
234
234
|
stack_list, envs = get_stacks
|
|
235
235
|
|
|
236
236
|
env_hash = nil
|
|
237
|
-
|
|
237
|
+
if envs.empty?
|
|
238
|
+
output 'Nessun environment trovato'.red
|
|
239
|
+
exit
|
|
240
|
+
else
|
|
238
241
|
env_hash = choose do |menu|
|
|
239
242
|
menu.prompt = "Scegli l'environment che vuoi spegnere: ".cyan
|
|
240
243
|
menu.shell = true
|
|
@@ -248,9 +251,6 @@ class Release
|
|
|
248
251
|
menu.choice(msg) { key }
|
|
249
252
|
end
|
|
250
253
|
end
|
|
251
|
-
else
|
|
252
|
-
output 'Nessun environment trovato'.red
|
|
253
|
-
exit
|
|
254
254
|
end
|
|
255
255
|
|
|
256
256
|
cluster_stack_name = nil
|
|
@@ -261,6 +261,7 @@ class Release
|
|
|
261
261
|
cluster_stack_name = stack.stack_name
|
|
262
262
|
else
|
|
263
263
|
break unless stack.stack_name.match(/#{env_hash}$/)
|
|
264
|
+
|
|
264
265
|
stacks_to_delete.push(stack.stack_name)
|
|
265
266
|
delete_stack(stack.stack_name)
|
|
266
267
|
end
|
|
@@ -269,138 +270,134 @@ class Release
|
|
|
269
270
|
|
|
270
271
|
cluster_stack_name = "ecs-cluster-#{env_hash}"
|
|
271
272
|
aggregator_enabled = get_stack_tags(cluster_stack_name).detect do |tag|
|
|
272
|
-
tag.key ===
|
|
273
|
+
tag.key === 'hostname_pattern_priority' and tag.value === '1'
|
|
273
274
|
end.is_a?(Aws::CloudFormation::Types::Tag)
|
|
274
275
|
|
|
275
|
-
if aggregator_enabled
|
|
276
|
-
dns_to_staging(env_hash)
|
|
277
|
-
end
|
|
276
|
+
dns_to_staging(env_hash) if aggregator_enabled
|
|
278
277
|
|
|
279
278
|
# Se non ha finito di cancellare le altre non si puo' cancellare il cluster
|
|
280
|
-
output
|
|
279
|
+
output 'Attendo 10 secondi per poter eliminare il cluster ECS'
|
|
281
280
|
|
|
282
281
|
while stacks_to_delete.length > 0
|
|
283
282
|
sleep 13
|
|
284
283
|
stacks_to_delete.each do |stack_name|
|
|
285
|
-
stacks_to_delete
|
|
284
|
+
stacks_to_delete -= [stack_name] unless stack_exists?(stack_name)
|
|
286
285
|
end
|
|
287
|
-
output "Stack ancora attivi: #{stacks_to_delete.length
|
|
286
|
+
output "Stack ancora attivi: #{stacks_to_delete.length}. Attendo altri 10 secondi per eliminare il cluster ECS"
|
|
288
287
|
end
|
|
289
288
|
|
|
290
289
|
delete_stack(cluster_stack_name)
|
|
291
290
|
delete_stack(@base_stack_name_alb + env_hash[3..8])
|
|
292
291
|
delete_stack(@base_stack_name_alb_ws + env_hash[3..8])
|
|
293
|
-
output
|
|
292
|
+
output 'Finito!'.green
|
|
294
293
|
end
|
|
295
294
|
|
|
296
295
|
def deploy_lock!
|
|
297
|
-
output
|
|
296
|
+
output 'Deploy update menu'
|
|
298
297
|
`git pull`
|
|
299
298
|
|
|
300
|
-
output
|
|
301
|
-
stack_list, envs = get_clusters
|
|
299
|
+
output 'Recupero le informazioni sui QA attivi...'
|
|
300
|
+
stack_list, envs = get_clusters
|
|
302
301
|
|
|
303
302
|
env_hash = nil
|
|
304
|
-
|
|
303
|
+
if envs.empty?
|
|
304
|
+
output 'Nessun QA trovato'.red
|
|
305
|
+
exit
|
|
306
|
+
else
|
|
305
307
|
env_hash = choose do |menu|
|
|
306
|
-
menu.prompt =
|
|
308
|
+
menu.prompt = 'Scegli il QA che vuoi proteggere dallo spegnimento automatico: '.cyan
|
|
307
309
|
menu.shell = true
|
|
308
310
|
envs.each do |key, env|
|
|
309
|
-
title =
|
|
311
|
+
title = ''
|
|
310
312
|
env.each do |e|
|
|
311
|
-
title <<
|
|
313
|
+
title << e.value.to_s if e.key == 'qainit'
|
|
312
314
|
end
|
|
313
|
-
msg =
|
|
315
|
+
msg = @prima.reduce_size(title, 1000).to_s.light_blue
|
|
314
316
|
menu.choice(msg) { key }
|
|
315
317
|
end
|
|
316
318
|
end
|
|
317
|
-
else
|
|
318
|
-
output "Nessun QA trovato".red
|
|
319
|
-
exit
|
|
320
319
|
end
|
|
321
320
|
|
|
322
321
|
cluster_stack_name = "ecs-cluster-#{env_hash}"
|
|
323
322
|
if stack_exists?(cluster_stack_name)
|
|
324
323
|
tags = get_stack_tags(cluster_stack_name)
|
|
325
|
-
tag_keep_data = Aws::CloudFormation::Types::Tag.new({key:'AUTOMATIC_DELETION_PROTECTION', value:'true'})
|
|
324
|
+
tag_keep_data = Aws::CloudFormation::Types::Tag.new({ key: 'AUTOMATIC_DELETION_PROTECTION', value: 'true' })
|
|
326
325
|
tags.push tag_keep_data
|
|
327
326
|
end
|
|
328
327
|
|
|
329
328
|
update_cluster_stack(cluster_stack_name, tags, get_stack_parameters(cluster_stack_name))
|
|
330
329
|
|
|
331
|
-
output
|
|
330
|
+
output 'Finito!'.green
|
|
332
331
|
end
|
|
333
332
|
|
|
334
333
|
def deploy_update!
|
|
335
|
-
output
|
|
334
|
+
output 'Deploy update menu'
|
|
336
335
|
`git pull`
|
|
337
336
|
|
|
338
|
-
output
|
|
339
|
-
stack_list, envs = get_stacks
|
|
337
|
+
output 'Recupero le informazioni sui QA attivi...'
|
|
338
|
+
stack_list, envs = get_stacks
|
|
340
339
|
|
|
341
340
|
env_hash = nil
|
|
342
|
-
|
|
341
|
+
if envs.empty?
|
|
342
|
+
output 'Nessun QA trovato'.red
|
|
343
|
+
exit
|
|
344
|
+
else
|
|
343
345
|
env_hash = choose do |menu|
|
|
344
|
-
menu.prompt =
|
|
346
|
+
menu.prompt = 'Scegli il QA che vuoi aggiornare: '.cyan
|
|
345
347
|
menu.shell = true
|
|
346
348
|
envs.each do |key, env|
|
|
347
|
-
title =
|
|
349
|
+
title = ''
|
|
348
350
|
env.each do |e|
|
|
349
351
|
title << "\n#{e.key.upcase}: #{e.value}"
|
|
350
352
|
end
|
|
351
|
-
msg =
|
|
353
|
+
msg = @prima.reduce_size(title, 1000).to_s.light_blue
|
|
352
354
|
menu.choice(msg) { key }
|
|
353
355
|
end
|
|
354
356
|
end
|
|
355
|
-
else
|
|
356
|
-
output "Nessun QA trovato".red
|
|
357
|
-
exit
|
|
358
357
|
end
|
|
359
358
|
|
|
360
359
|
envs[env_hash].each do |env|
|
|
361
|
-
unless [
|
|
360
|
+
unless %w[hostname_pattern_priority AUTOMATIC_DELETION_PROTECTION].include? env.key
|
|
362
361
|
@projects[env.key] = select_branch_to_deploy(env.key, env.value)
|
|
363
362
|
end
|
|
364
363
|
end
|
|
365
364
|
deploy_feature!
|
|
366
365
|
|
|
367
|
-
output
|
|
366
|
+
output 'Finito!'.green
|
|
368
367
|
end
|
|
369
368
|
|
|
370
369
|
def get_default_branch_name(projects)
|
|
371
370
|
projects.each_key do |project|
|
|
372
|
-
return projects[project]['name']
|
|
371
|
+
return projects[project]['name'] unless projects[project]['default_branch']
|
|
373
372
|
end
|
|
374
373
|
end
|
|
375
374
|
|
|
376
|
-
def suite_py_branches
|
|
377
|
-
if File.exist?(
|
|
378
|
-
arg_projects = YAML.load(File.read(
|
|
375
|
+
def suite_py_branches
|
|
376
|
+
if File.exist?('suitepy-projects.yml')
|
|
377
|
+
arg_projects = YAML.load(File.read('suitepy-projects.yml'))
|
|
379
378
|
|
|
380
379
|
@projects.merge!(arg_projects)
|
|
381
380
|
|
|
382
381
|
`rm suitepy-projects.yml`
|
|
383
382
|
|
|
384
383
|
@projects.each_key do |project|
|
|
385
|
-
if @projects[project].empty?
|
|
386
|
-
@projects[project] = choose_branch_to_deploy(project, true)
|
|
387
|
-
end
|
|
384
|
+
@projects[project] = choose_branch_to_deploy(project, true) if @projects[project].empty?
|
|
388
385
|
end
|
|
389
386
|
end
|
|
390
387
|
end
|
|
391
388
|
|
|
392
|
-
def get_git_user
|
|
389
|
+
def get_git_user
|
|
393
390
|
`git config user.name`.gsub(/[^A-Za-z]/, '').gsub("\n", '')
|
|
394
391
|
end
|
|
395
392
|
|
|
396
|
-
def get_git_mail
|
|
393
|
+
def get_git_mail
|
|
397
394
|
`git config user.email`.gsub("\n", '')
|
|
398
395
|
end
|
|
399
396
|
|
|
400
397
|
def qainit_deploy!(quiet = false)
|
|
401
|
-
`git checkout master && git pull && git remote prune origin`
|
|
398
|
+
`git checkout master && git fetch && git pull && git remote prune origin`
|
|
402
399
|
|
|
403
|
-
`git
|
|
400
|
+
`git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -D $branch; done`
|
|
404
401
|
|
|
405
402
|
default_name = get_default_branch_name @projects
|
|
406
403
|
feature_number = ''
|
|
@@ -417,7 +414,7 @@ class Release
|
|
|
417
414
|
`git checkout -b #{branch_name}`
|
|
418
415
|
end
|
|
419
416
|
|
|
420
|
-
File.open(
|
|
417
|
+
File.open('projects.yml', 'w') { |file| file.write(@projects.to_yaml) }
|
|
421
418
|
|
|
422
419
|
update_drone_yml!
|
|
423
420
|
|
|
@@ -436,7 +433,7 @@ class Release
|
|
|
436
433
|
git_user = get_git_user
|
|
437
434
|
# stampiamo la lista
|
|
438
435
|
chosen_branch = choose do |menu|
|
|
439
|
-
menu.prompt =
|
|
436
|
+
menu.prompt = 'Scegli il QA che vuoi aggiornare: '.cyan
|
|
440
437
|
menu.shell = true
|
|
441
438
|
former_branches.delete('master')
|
|
442
439
|
former_branches.each_with_index do |branch, index|
|
|
@@ -451,14 +448,14 @@ class Release
|
|
|
451
448
|
# aggiornare il commit (revision a cui fa riferimento)
|
|
452
449
|
|
|
453
450
|
# leggo il file projects.yml / recupero i nomi dei branch / riscrivo tutto
|
|
454
|
-
projects = YAML.load(File.read(
|
|
451
|
+
projects = YAML.load(File.read('projects.yml'))
|
|
455
452
|
|
|
456
453
|
projects.each do |key, project|
|
|
457
454
|
@projects[key] = select_branch_to_deploy(key, project['name'])
|
|
458
455
|
@projects[key]['default_branch'] = project['default_branch']
|
|
459
456
|
end
|
|
460
457
|
|
|
461
|
-
File.open(
|
|
458
|
+
File.open('projects.yml', 'w') { |file| file.write(@projects.to_yaml) }
|
|
462
459
|
|
|
463
460
|
update_drone_yml!
|
|
464
461
|
|
|
@@ -474,7 +471,7 @@ class Release
|
|
|
474
471
|
if selection.nil?
|
|
475
472
|
# stampiamo la lista
|
|
476
473
|
chosen_branch = choose do |menu|
|
|
477
|
-
menu.prompt =
|
|
474
|
+
menu.prompt = 'Scegli il QA che vuoi spegnere: '.cyan
|
|
478
475
|
menu.shell = true
|
|
479
476
|
git_user = get_git_user
|
|
480
477
|
former_branches.delete('master')
|
|
@@ -493,10 +490,10 @@ class Release
|
|
|
493
490
|
end
|
|
494
491
|
|
|
495
492
|
def qainit_drone_shutdown!
|
|
496
|
-
output
|
|
493
|
+
output 'Recupero le informazioni sui QA attivi...'
|
|
497
494
|
stack_list, envs = get_stacks
|
|
498
495
|
|
|
499
|
-
env_hash =
|
|
496
|
+
env_hash = 'qa-' + get_deploy_id
|
|
500
497
|
|
|
501
498
|
cluster_stack_name = nil
|
|
502
499
|
stacks_to_delete = []
|
|
@@ -506,6 +503,7 @@ class Release
|
|
|
506
503
|
cluster_stack_name = stack.stack_name
|
|
507
504
|
else
|
|
508
505
|
break unless stack.stack_name.match(/#{env_hash}$/)
|
|
506
|
+
|
|
509
507
|
stacks_to_delete.push(stack.stack_name)
|
|
510
508
|
delete_stack(stack.stack_name)
|
|
511
509
|
end
|
|
@@ -515,47 +513,45 @@ class Release
|
|
|
515
513
|
cluster_stack_name = "ecs-cluster-#{env_hash}"
|
|
516
514
|
if stack_exists?(cluster_stack_name)
|
|
517
515
|
aggregator_enabled = get_stack_tags(cluster_stack_name).detect do |tag|
|
|
518
|
-
tag.key ===
|
|
516
|
+
tag.key === 'hostname_pattern_priority' and tag.value === '1'
|
|
519
517
|
end.is_a?(Aws::CloudFormation::Types::Tag)
|
|
520
518
|
|
|
521
|
-
if aggregator_enabled
|
|
522
|
-
dns_to_staging(env_hash)
|
|
523
|
-
end
|
|
519
|
+
dns_to_staging(env_hash) if aggregator_enabled
|
|
524
520
|
end
|
|
525
521
|
|
|
526
522
|
# Se non ha finito di cancellare le altre non si puo' cancellare il cluster
|
|
527
|
-
output
|
|
523
|
+
output 'Attendo 10 secondi per poter eliminare il cluster ECS'
|
|
528
524
|
|
|
529
525
|
while stacks_to_delete.length > 0
|
|
530
526
|
sleep 13
|
|
531
527
|
stacks_to_delete.each do |stack_name|
|
|
532
|
-
stacks_to_delete
|
|
528
|
+
stacks_to_delete -= [stack_name] unless stack_exists?(stack_name)
|
|
533
529
|
end
|
|
534
|
-
output "Stack ancora attivi: #{stacks_to_delete.length
|
|
530
|
+
output "Stack ancora attivi: #{stacks_to_delete.length}. Attendo altri 10 secondi per eliminare il cluster ECS"
|
|
535
531
|
end
|
|
536
532
|
|
|
537
533
|
delete_stack(cluster_stack_name) if stack_exists?(cluster_stack_name)
|
|
538
534
|
delete_stack(@base_stack_name_alb + env_hash[3..8]) if stack_exists?(@base_stack_name_alb + env_hash[3..8])
|
|
539
535
|
delete_stack(@base_stack_name_alb_ws + env_hash[3..8]) if stack_exists?(@base_stack_name_alb_ws + env_hash[3..8])
|
|
540
536
|
`git checkout master && git push origin --delete ${DRONE_BRANCH}`
|
|
541
|
-
output
|
|
542
|
-
delete_lighthouse_dns
|
|
543
|
-
output
|
|
537
|
+
output 'Cancello il record DNS utilizzato da Lighthouse'
|
|
538
|
+
delete_lighthouse_dns
|
|
539
|
+
output 'Finito!'.green
|
|
544
540
|
end
|
|
545
541
|
|
|
546
542
|
def qainit_write_output(file_message, output_message)
|
|
547
543
|
`mkdir -p /etc/qainit-output`
|
|
548
|
-
qa_file_name =
|
|
544
|
+
qa_file_name = '/etc/qainit-output/url_qa'
|
|
549
545
|
File.open(qa_file_name + '.txt', 'w') { |file| file.write(file_message) }
|
|
550
546
|
output "#{output_message} #{qa_file_name}".green
|
|
551
547
|
end
|
|
552
548
|
|
|
553
|
-
def update_drone_yml!
|
|
549
|
+
def update_drone_yml!
|
|
554
550
|
drone_yml = File.read('.drone.yml')
|
|
555
551
|
@projects.each do |key, project|
|
|
556
552
|
drone_yml = drone_yml.gsub(/#{key}@.+\n/, "#{key}@#{project['revision']}\n")
|
|
557
553
|
end
|
|
558
|
-
File.open(
|
|
554
|
+
File.open('.drone.yml', 'w') do |f|
|
|
559
555
|
f.write(drone_yml)
|
|
560
556
|
end
|
|
561
557
|
end
|
|
@@ -570,10 +566,9 @@ class Release
|
|
|
570
566
|
end
|
|
571
567
|
|
|
572
568
|
def get_alb_host(stack_name)
|
|
573
|
-
|
|
574
|
-
when stack_name.include?('alb-http-public')
|
|
569
|
+
if stack_name.include?('alb-http-public')
|
|
575
570
|
logical_resource_id = 'EcsApplicationLoadBalancerPublic'
|
|
576
|
-
|
|
571
|
+
elsif stack_name.include?('alb-ws-public')
|
|
577
572
|
logical_resource_id = 'EcsApplicationLoadBalancerPublic'
|
|
578
573
|
end
|
|
579
574
|
resp = describe_stack_resource(stack_name, logical_resource_id)
|
|
@@ -589,8 +584,8 @@ class Release
|
|
|
589
584
|
def choose_branch_to_deploy(project_name, select_master = false)
|
|
590
585
|
# chiamare api octokit per recuperare i branch/commit
|
|
591
586
|
output "Recupero la lista dei branch del progetto #{project_name}..."
|
|
592
|
-
branches = @gh.branches("primait/#{project_name}", {per_page: 100})
|
|
593
|
-
master_branch = branches.select {|branch| branch[:name] == 'master'}[0]
|
|
587
|
+
branches = @gh.branches("primait/#{project_name}", { per_page: 100 })
|
|
588
|
+
master_branch = branches.select { |branch| branch[:name] == 'master' }[0]
|
|
594
589
|
|
|
595
590
|
if select_master || branches.length == 1
|
|
596
591
|
branch_name = 'master'
|
|
@@ -612,7 +607,7 @@ class Release
|
|
|
612
607
|
end
|
|
613
608
|
end
|
|
614
609
|
|
|
615
|
-
chosen_branch = branches.select {|branch| branch[:name] == branch_name}[0]
|
|
610
|
+
chosen_branch = branches.select { |branch| branch[:name] == branch_name }[0]
|
|
616
611
|
name = branch_name
|
|
617
612
|
revision = chosen_branch[:commit][:sha]
|
|
618
613
|
{ 'name' => name, 'revision' => revision[0..14], 'default_branch' => select_master }
|
|
@@ -627,7 +622,7 @@ class Release
|
|
|
627
622
|
{ 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email }
|
|
628
623
|
end
|
|
629
624
|
|
|
630
|
-
def get_stacks
|
|
625
|
+
def get_stacks
|
|
631
626
|
envs = {}
|
|
632
627
|
stack_list = stack_list()
|
|
633
628
|
stack_list.each do |stack|
|
|
@@ -636,10 +631,10 @@ class Release
|
|
|
636
631
|
envs[env_hash] = stack.tags unless envs.has_key?(env_hash) || stack.tags.empty?
|
|
637
632
|
end
|
|
638
633
|
end
|
|
639
|
-
|
|
634
|
+
[stack_list, envs]
|
|
640
635
|
end
|
|
641
636
|
|
|
642
|
-
def get_clusters
|
|
637
|
+
def get_clusters
|
|
643
638
|
envs = {}
|
|
644
639
|
cluster_list = cluster_list()
|
|
645
640
|
cluster_list.each do |stack|
|
|
@@ -648,63 +643,65 @@ class Release
|
|
|
648
643
|
envs[env_hash] = stack.tags unless envs.has_key?(env_hash) || stack.tags.empty?
|
|
649
644
|
end
|
|
650
645
|
end
|
|
651
|
-
|
|
646
|
+
[cluster_list, envs]
|
|
652
647
|
end
|
|
653
648
|
|
|
654
|
-
def hostname_pattern_priority
|
|
655
|
-
(Time.now.to_i.to_s[-4..-1].to_i + Random.rand(
|
|
649
|
+
def hostname_pattern_priority
|
|
650
|
+
(Time.now.to_i.to_s[-4..-1].to_i + Random.rand(40_000)).to_s
|
|
656
651
|
end
|
|
657
652
|
|
|
658
653
|
def select_branches(project_names = nil)
|
|
659
|
-
output
|
|
654
|
+
output 'Deploy feature menu'
|
|
660
655
|
if project_names.nil?
|
|
661
|
-
@projects.each{ |key,
|
|
656
|
+
@projects.each { |key, _value| @projects[key] = choose_branch_to_deploy(key) }
|
|
662
657
|
else
|
|
663
658
|
project_names.each do |project|
|
|
664
659
|
@projects[project] = choose_branch_to_deploy(project)
|
|
665
660
|
end
|
|
666
661
|
@projects.each_key do |branch_project|
|
|
667
|
-
|
|
662
|
+
unless project_names.include? branch_project
|
|
663
|
+
@projects[branch_project] = choose_branch_to_deploy(branch_project, true)
|
|
664
|
+
end
|
|
668
665
|
end
|
|
669
666
|
end
|
|
670
667
|
end
|
|
671
668
|
end
|
|
672
669
|
|
|
673
670
|
def help_content
|
|
674
|
-
|
|
671
|
+
<<~HELP
|
|
675
672
|
|
|
676
|
-
twig-feature
|
|
677
|
-
===========
|
|
673
|
+
twig-feature
|
|
674
|
+
===========
|
|
678
675
|
|
|
679
|
-
Manage feature branches
|
|
676
|
+
Manage feature branches
|
|
680
677
|
|
|
681
|
-
Synopsis
|
|
682
|
-
--------
|
|
678
|
+
Synopsis
|
|
679
|
+
--------
|
|
683
680
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
681
|
+
twig release start
|
|
682
|
+
twig release finish
|
|
683
|
+
twig release deploy
|
|
684
|
+
twig release aggregator
|
|
688
685
|
|
|
689
|
-
Description
|
|
690
|
-
-----------
|
|
686
|
+
Description
|
|
687
|
+
-----------
|
|
691
688
|
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
689
|
+
start creates a new feature branch
|
|
690
|
+
finish finishes the feature by merging to dev and master
|
|
691
|
+
qainit deploys a new environment with selected branches from every project
|
|
692
|
+
qainit $PROJECT_NAME deploys a new environment allowing to selected a branch from the input project (everything else is master)
|
|
693
|
+
qainit shutdown deletes a specific qa environment
|
|
697
694
|
|
|
698
|
-
Available only to devops (from artemide)
|
|
699
|
-
-----------
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
695
|
+
Available only to devops (from artemide)
|
|
696
|
+
-----------
|
|
697
|
+
deploy deploys the feature branch to a temporary AWS Elastic Beanstalk env
|
|
698
|
+
deploy stop destroys the AWS Elastic Beanstalk env
|
|
699
|
+
deploy update updates a feature branch with current branches
|
|
700
|
+
deploy lock protects a qa environment from automatic deletion
|
|
701
|
+
aggregator enable/disable directs comparator's staging environments to a qa/staging
|
|
705
702
|
|
|
706
|
-
Subcommand for Twig: <http://rondevera.github.io/twig/>
|
|
707
|
-
Author: Andrea Usuelli <https://github.com/andreausu>
|
|
703
|
+
Subcommand for Twig: <http://rondevera.github.io/twig/>
|
|
704
|
+
Author: Andrea Usuelli <https://github.com/andreausu>
|
|
708
705
|
|
|
709
706
|
HELP
|
|
710
707
|
end
|
|
@@ -717,9 +714,7 @@ if args.include?('--help')
|
|
|
717
714
|
end
|
|
718
715
|
|
|
719
716
|
gem_update = true
|
|
720
|
-
if args.include?('no-gem-update')
|
|
721
|
-
gem_update = false
|
|
722
|
-
end
|
|
717
|
+
gem_update = false if args.include?('no-gem-update')
|
|
723
718
|
|
|
724
719
|
args.delete('no-gem-update')
|
|
725
720
|
|