prima-twig 1.0.45 → 1.2.3

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
2
  SHA256:
3
- metadata.gz: 8106c87ca7833a515d937c8d6f0d008904db85da4582457501dfb6b2837df228
4
- data.tar.gz: 69f41ddfe5ab189c666b47c77ae857d30490ab43972e419ec65e76afe13258cb
3
+ metadata.gz: a8d26488e09dd811fb37302eb857d843490d31cb6f4a3661eed8bfdaa3971320
4
+ data.tar.gz: 6b851729f8a6215aaee3d092f8378e60a54b2faa905ffea229ac6fcf28c25227
5
5
  SHA512:
6
- metadata.gz: 4c9500ce30eb5c7b103e9a6c4447eab68551f480f65c04e528494c64c446a6ee3bcdbf1fdf09e6e7128906b678493cb83955a69c3d13e245160622a85a144def
7
- data.tar.gz: 38e2132ff67cfc126cb13423dadc358c9cd2083611701fe9943d5566e73c6b53716044022ab3a75f526d1ff8206e39ffe6296e7dd64e7ff46a0a3c5a1d5281d1
6
+ metadata.gz: e077ed692aa53693dd06b1658c72feab99c24d4ffbe5a8d050041774ce1d2926ff7379779b5c30ef43131a4b2972cce4cbbf2e459d202b2e92c18b46a9524a38
7
+ data.tar.gz: b9f4db60c9a24d2f578ab5cb928021483187a53e1a98f1bce290a599702a51b722d1b4604cbbc9fe04d2aca8c7fd9ba61257c3f0837b4b90b0d5f8c87a70a80d
@@ -8,6 +8,7 @@ require 'json'
8
8
  require 'launchy'
9
9
  require 'pp'
10
10
  require 'redis'
11
+ require 'octokit'
11
12
 
12
13
  class Release
13
14
  include Command
@@ -24,7 +25,6 @@ class Release
24
25
  end
25
26
  @dns_record_identifier = nil
26
27
  @ecs_cluster_name = nil
27
- @deploy_update = false
28
28
  @projects = {
29
29
  'prima' => {},
30
30
  'urania' => {},
@@ -33,7 +33,6 @@ class Release
33
33
  'hal9000' => {},
34
34
  'fidaty' => {},
35
35
  'peano' => {},
36
- # 'rogoreport' => {},
37
36
  'assange' => {},
38
37
  'borat' => {},
39
38
  'crash' => {},
@@ -42,7 +41,6 @@ class Release
42
41
  'roger' => {},
43
42
  'rachele' => {},
44
43
  'leftorium' => {},
45
- 'pyxis-npm' => {},
46
44
  'starsky' => {},
47
45
  'hutch' => {},
48
46
  'maia' => {},
@@ -53,16 +51,13 @@ class Release
53
51
  }
54
52
  @base_stack_name_alb = 'ecs-alb-http-public-qa-'
55
53
  @base_stack_name_alb_ws = 'ecs-alb-ws-public-qa-'
56
- @git_branch = ''
57
54
  @cloudflare = Rubyflare.connect_with(ENV['CLOUDFLARE_EMAIL'], ENV['CLOUDFLARE_APIKEY'])
55
+ @config = YAML.load_file 'twig.yml'
56
+ @gh = Octokit::Client.new(:access_token => @config['github'])
58
57
  end
59
58
 
60
59
  def execute!(args)
61
60
  case args[0]
62
- when 'start'
63
- start_feature!
64
- when 'finish'
65
- finish_feature!
66
61
  when 'qainit'
67
62
  abort('Non sei nella cartella di qainit') unless Dir.pwd.match 'qainit$' or Dir.pwd.match '/drone/src'
68
63
  if ['terminate', 'stop', 'shutdown', 'halt', 'destroy'].include? args[1]
@@ -84,7 +79,6 @@ class Release
84
79
  qainit_deploy!(true)
85
80
  end
86
81
  when 'deploy'
87
- abort('Non sei nella cartella di artemide') unless Dir.pwd.match 'artemide$'
88
82
  if 'lock' == args[1]
89
83
  deploy_lock!
90
84
  end
@@ -106,18 +100,6 @@ class Release
106
100
  stop_if true, [:wrong_args, ['start', 'finish', 'deploy', 'deploy project_name', 'deploy stop', 'deploy update', 'aggregator enable', 'aggregator disable']]
107
101
  end
108
102
 
109
- def start_feature!
110
- branch_name = @prima.clean_branch_name(ask('Inserisci il nome del branch (puoi omettere feature/): '.cyan))
111
- stop_unless !branch_name.empty?, 'Devi inserire il nome del branch'
112
- branch_name.prepend 'feature/' unless branch_name.include? 'feature'
113
-
114
- output "Il nome del branch sarà " + branch_name.yellow
115
-
116
- exec_step "git checkout master"
117
- exec_step "git pull origin master"
118
- exec_step "git checkout -b " + branch_name
119
- end
120
-
121
103
  def aggregator_disable!
122
104
  output 'Disable aggregator'
123
105
 
@@ -247,25 +229,6 @@ class Release
247
229
  end
248
230
  end
249
231
 
250
- def finish_feature!
251
- current_branch_name = @prima.twig.current_branch_name
252
- stop_unless (current_branch_name =~ /^feature\//), "Non sei su un branch di feature, non posso mergiare nulla"
253
-
254
- # Mergia la PR
255
- pr = @prima.get_pr
256
- stop_unless pr, 'Pull Request not found'
257
- @prima.merge_pull_request pr
258
-
259
- output "La Pull Request e' stata mergiata!".green
260
-
261
- # Chiude la issue
262
- issue_number = @prima.twig.get_branch_property(current_branch_name, 'issue')
263
- @prima.close_issue(issue_number) if issue_number
264
-
265
- # Rimuove il branch remoto
266
- exec_step "git push origin :#{current_branch_name}" if @prima.yesno "Vuoi eliminare il branch remoto #{current_branch_name}?".blue
267
- end
268
-
269
232
  def deploy_shutdown!
270
233
  output "Recupero le informazioni sui QA attivi..."
271
234
  stack_list, envs = get_stacks
@@ -332,9 +295,7 @@ class Release
332
295
 
333
296
  def deploy_lock!
334
297
  output "Deploy update menu"
335
- `git pull && git submodule init && git submodule update`
336
-
337
- @deploy_update = true
298
+ `git pull`
338
299
 
339
300
  output "Recupero le informazioni sui QA attivi..."
340
301
  stack_list, envs = get_clusters()
@@ -365,16 +326,29 @@ class Release
365
326
  tags.push tag_keep_data
366
327
  end
367
328
 
368
- update_cluster_stack(cluster_stack_name, tags)
329
+ parameters = [
330
+ {
331
+ parameter_key: "Environment",
332
+ parameter_value: "qa"
333
+ },
334
+ {
335
+ parameter_key: "Country",
336
+ parameter_value: "IT"
337
+ },
338
+ {
339
+ parameter_key: "ClusterRole",
340
+ parameter_value: "allinone"
341
+ }
342
+ ]
343
+
344
+ update_cluster_stack(cluster_stack_name, tags, parameters)
369
345
 
370
346
  output "Finito!".green
371
347
  end
372
348
 
373
349
  def deploy_update!
374
350
  output "Deploy update menu"
375
- `git pull && git submodule init && git submodule update`
376
-
377
- @deploy_update = true
351
+ `git pull`
378
352
 
379
353
  output "Recupero le informazioni sui QA attivi..."
380
354
  stack_list, envs = get_stacks()
@@ -439,7 +413,7 @@ class Release
439
413
  end
440
414
 
441
415
  def qainit_deploy!(quiet = false)
442
- `git checkout master && git pull && git submodule update --init --recursive && git remote prune origin`
416
+ `git checkout master && git pull && git remote prune origin`
443
417
 
444
418
  `git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -D`
445
419
 
@@ -458,14 +432,11 @@ class Release
458
432
  `git checkout -b #{branch_name}`
459
433
  end
460
434
 
461
- @git_branch = branch_name
462
-
463
435
  File.open("projects.yml", "w") { |file| file.write(@projects.to_yaml) }
464
436
 
465
437
  update_drone_yml!
466
438
 
467
- `git add projects && \
468
- git add projects.yml .drone.yml && \
439
+ `git add projects.yml .drone.yml && \
469
440
  git commit -m '#{branch_name}' && \
470
441
  git push -f --set-upstream origin #{branch_name} && \
471
442
  git checkout master`
@@ -615,89 +586,29 @@ class Release
615
586
 
616
587
  def get_alb_host(stack_name)
617
588
  case
618
- when stack_name.include?('web')
619
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
620
- when stack_name.include?('urania')
621
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
622
- when stack_name.include?('backoffice')
623
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
624
- when stack_name.include?('bburago')
625
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
626
- when stack_name.include?('hal9000')
627
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
628
- when stack_name.include?('fidaty')
629
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
630
- when stack_name.include?('activia')
631
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
632
- when stack_name.include?('skynet')
633
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
634
- when stack_name.include?('roger')
635
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
636
589
  when stack_name.include?('alb-http-public')
637
590
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
638
591
  when stack_name.include?('alb-ws-public')
639
592
  logical_resource_id = 'EcsApplicationLoadBalancerPublic'
640
- when stack_name.include?('peano')
641
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
642
- when stack_name.include?('leftorium')
643
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
644
- when stack_name.include?('assange')
645
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
646
- when stack_name.include?('borat')
647
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
648
- when stack_name.include?('crash')
649
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
650
- when stack_name.include?('rachele')
651
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
652
- when stack_name.include?('starsky')
653
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
654
- when stack_name.include?('hutch')
655
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
656
- when stack_name.include?('maia')
657
- logical_resource_id = 'EcsApplicationLoadBalancerPublic'
658
- when stack_name.include?('legion')
659
- logical_resource_id = 'EcsApplicationLoadBalancerInternal'
660
593
  end
661
594
  resp = describe_stack_resource(stack_name, logical_resource_id)
662
595
  resp = describe_load_balancers([resp.stack_resource_detail.physical_resource_id])
663
596
  resp.load_balancers[0].dns_name
664
597
  end
665
598
 
666
- def deploy_pyxis?
667
- if defined? @deploy_pyxis
668
- @deploy_pyxis
669
- else
670
- pyxis_updated = `git log -p -1 --unified=0 | grep pyxis-npm:`.length > 0
671
-
672
- update_pyxis = !@projects['pyxis-npm'].empty? && @projects['pyxis-npm']['name'] != 'master' && pyxis_updated
673
-
674
- @deploy_pyxis = update_pyxis
675
- return update_pyxis
676
- end
677
- end
678
-
679
- def update_cluster_stack(stack_name, tags = [])
680
- stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
681
- update_stack(stack_name, stack_body, [], tags)
599
+ def update_cluster_stack(stack_name, tags = [], parameters = [])
600
+ stack_body = get_stack_template(stack_name)
601
+ update_stack(stack_name, stack_body, parameters, tags)
682
602
  end
683
603
 
684
604
  def choose_branch_to_deploy(project_name, select_master = false)
685
- Dir.chdir "projects/#{project_name}"
605
+ # chiamare api octokit per recuperare i branch/commit
686
606
  output "Recupero la lista dei branch del progetto #{project_name}..."
687
- `git remote prune origin`
688
- out = %x[ git fetch ]
689
- branches = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname) %(committeremail)' | sed 's/refs\\/remotes\\/origin\\///g' ]
690
- .split("\n").delete_if { |b| b.include?('HEAD') }[0..49]
691
-
692
- master_branch = nil
693
-
694
- branches.each do |branch|
695
- master_branch = branch if branch.match(/^master\s+/)
696
- break unless master_branch.nil?
697
- end
607
+ branches = @gh.branches("primait/#{project_name}", {per_page: 100})
608
+ master_branch = branches.select {|branch| branch[:name] == 'master'}[0]
698
609
 
699
610
  if select_master || branches.length == 1
700
- branch_name = master_branch
611
+ branch_name = 'master'
701
612
  else
702
613
  branches.insert(0, branches.delete(master_branch))
703
614
  branch_name = choose do |menu|
@@ -707,36 +618,27 @@ class Release
707
618
  git_mail = get_git_mail
708
619
 
709
620
  branches.each_with_index do |branch, index|
710
- title = @prima.reduce_size(branch, 100)
621
+ title = @prima.reduce_size(branch[:name], 100)
711
622
  msg = index.odd? ? title.white : title.light_yellow # uno bianco e uno giallo alternati
712
- msg = branch.include?(git_mail) ? msg.on_blue : msg.on_black # i branch aggiornati da chi lancia la creazione sono su sfondo blu
713
- menu.choice(msg) { branch }
714
- menu.default = branch if branch == master_branch
623
+ # msg = branch.include?(git_mail) ? msg.on_blue : msg.on_black # i branch aggiornati da chi lancia la creazione sono su sfondo blu
624
+ menu.choice(msg) { branch[:name] }
625
+ menu.default = branch[:name] if branch == master_branch
715
626
  end
716
627
  end
717
628
  end
718
629
 
719
- Dir.chdir "../../"
720
-
721
- name = branch_name.split(' ')[0]
722
- revision = branch_name.split(' ')[1]
723
- committer_email = branch_name.split(' ')[2].tr('<>', '')
724
- { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email, 'default_branch' => select_master }
630
+ chosen_branch = branches.select {|branch| branch[:name] == branch_name}[0]
631
+ name = branch_name
632
+ revision = chosen_branch[:commit][:sha]
633
+ { 'name' => name, 'revision' => revision[0..14], 'default_branch' => select_master }
725
634
  end
726
635
 
727
636
  def select_branch_to_deploy(project_name, branch_name)
728
- Dir.chdir "projects/#{project_name}"
729
637
  output "Recupero il branch #{project_name}:#{branch_name} ..."
730
- `git remote prune origin`
731
- out = %x[ git fetch ]
732
- branch_name = %x[ git for-each-ref --sort=-committerdate refs/remotes/ --format='%(refname) %(objectname) %(committeremail)' | sed 's/refs\\/remotes\\/origin\\///g' ]
733
- .split("\n").delete_if { |b| !b.match("^#{Regexp.escape(branch_name)}") }[0..49]
734
- .first
735
-
736
- Dir.chdir "../../"
737
- name = branch_name.split(' ')[0]
738
- revision = branch_name.split(' ')[1]
739
- committer_email = branch_name.split(' ')[2].tr('<>', '')
638
+ branch = @gh.branch("primait/#{project_name}", branch_name)
639
+ name = branch[:name]
640
+ revision = branch[:commit][:sha]
641
+ committer_email = branch[:commit][:commit][:author][:email]
740
642
  { 'name' => name, 'revision' => revision[0..14], 'committer' => committer_email }
741
643
  end
742
644
 
@@ -30,7 +30,7 @@ class TwigUpdateAmi
30
30
  update_instance_name(ami_id, ami_name, ami_description, ami_template)
31
31
  output 'running packer update (this could take some time)'.light_green
32
32
  new_ami_id = update_packer(ami_template, env)
33
- # new_ami_id = 'ami-026890988d91ee8c6'
33
+ # new_ami_id = 'ami-0d8488b68731e8756'
34
34
  Dir.chdir '..'
35
35
  stop_if(new_ami_id.to_s.empty?, 'Failed to generate AMI!'.red)
36
36
  output "new ami id: #{new_ami_id}"
@@ -51,32 +51,19 @@ class TwigUpdateAmi
51
51
  output "skipping stack #{stack} because is a qa"
52
52
  next
53
53
  else
54
- stack_tags = tags_to_hashes(get_stack_tags(stack))
55
- stack_tags['TemplateVersion'] = stack_tags['TemplateVersion'].to_i + 1
56
-
54
+ stack_parameters = get_stack_parameters(stack)
55
+ stack_parameters = update_stack_parameters(stack_parameters, "AMIID", new_ami_id)
57
56
  if stack.include?('batch')
58
- stack_parameters = update_stack_parameters(get_stack_parameters(stack),
59
- [
60
- { parameter_key: 'AMIID', parameter_value: new_ami_id },
61
- { parameter_key: 'TemplateVersion', parameter_value: stack_tags['TemplateVersion'].to_s }
62
- ]
63
- )
64
57
  if stack.include?('offsite-backups')
65
58
  stack_template = File.read("./cloudformation/stacks/batch/compute-environment-offsite-backups.yml")
66
59
  else
67
60
  stack_template = File.read("./cloudformation/stacks/batch/compute-environment.yml")
68
61
  end
69
62
  else
70
- stack_parameters = update_stack_parameters(get_stack_parameters(stack),
71
- [
72
- { parameter_key: 'AMIID', parameter_value: new_ami_id },
73
- { parameter_key: 'DesiredCapacity', parameter_value: get_desired_capacity(stack).to_s },
74
- { parameter_key: 'TemplateVersion', parameter_value: stack_tags['TemplateVersion'].to_s }
75
- ]
76
- )
63
+ stack_parameters = update_stack_parameters(stack_parameters, "DesiredCapacity", get_desired_capacity(stack).to_s)
77
64
  stack_template = File.read("./cloudformation/stacks/asg/#{stack.to_s.split("/")[1]}.yml")
78
65
  end
79
- update_stack(stack, stack_template, stack_parameters, hashes_to_tags(stack_tags))
66
+ update_stack(stack, stack_template, stack_parameters)
80
67
  end
81
68
  end
82
69
 
@@ -120,10 +107,11 @@ class TwigUpdateAmi
120
107
  old_values.uniq
121
108
  end
122
109
 
123
- def update_stack_parameters(stack_parameters, new_parameters)
124
- new_parameters.each do |new_param|
125
- stack_parameters.reject{ |k| k["parameter_key"] == new_param["parameter_key"] }
126
- stack_parameters.push(new_param)
110
+ def update_stack_parameters(stack_parameters, key, value)
111
+ stack_parameters.each do |param|
112
+ if param.parameter_key == key
113
+ param.parameter_value = value
114
+ end
127
115
  end
128
116
  stack_parameters
129
117
  end
@@ -143,7 +131,7 @@ class TwigUpdateAmi
143
131
  def get_desired_capacity(stack_name)
144
132
  stack_outputs = get_stack_outputs(stack_name)
145
133
  stack_outputs.each do |out|
146
- if out.export_name.include?('EC2Fleet') or out.export_name.include?('AutoScalingGroup')
134
+ if out.export_name.include?('EC2Fleet') or out.export_name.include?('AutoScalingGroup') or out.export_name.include?('NodeGroup')
147
135
  return get_autoscaling_capacity(out.output_value)
148
136
  end
149
137
  end
@@ -474,21 +474,4 @@ module PrimaAwsClient
474
474
  resp = ec2_client.describe_spot_fleet_requests(spot_fleet_request_ids: [fleet_arn])
475
475
  resp.spot_fleet_request_configs[0].spot_fleet_request_config.target_capacity
476
476
  end
477
-
478
- def hashes_to_tags(hashes)
479
- tags = []
480
- hkeys = hashes.keys
481
- hkeys.each do |hkey|
482
- tags.insert(0, { key: hkey, value: hashes[hkey].to_s })
483
- end
484
- tags
485
- end
486
-
487
- def tags_to_hashes(tags)
488
- hash = Hash.new
489
- tags.each do |tags_obj|
490
- hash[tags_obj.key] = tags_obj.value
491
- end
492
- hash
493
- end
494
477
  end
@@ -8,12 +8,7 @@ require 'aws-sdk-core'
8
8
  require 'rubyflare'
9
9
 
10
10
  class Prima
11
- LABEL_REVIEW='review'
12
- LABEL_WIP='wip'
13
- LABEL_HOTFIX='hotfix'
14
- LABEL_NEXT_RELEASE='next release'
15
- LABEL_IN_STAGING='in staging'
16
- CONFIG_KEYS=['github', 'mandrill', 'sparkpost', 'cloudflare_email', 'cloudflare_apikey', 'aws_username', 'aws_password', 'prima_apikey']
11
+ CONFIG_KEYS=['github', 'cloudflare_email', 'cloudflare_apikey', 'aws_username', 'aws_password', 'prima_apikey']
17
12
  attr_reader :gh, :twig, :config, :rugged, :aws
18
13
 
19
14
  def initialize
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prima-twig
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.45
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matteo Giachino
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2020-07-14 00:00:00.000000000 Z
17
+ date: 2020-08-04 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: aws-sdk-autoscaling
@@ -285,24 +285,12 @@ dependencies:
285
285
  description: Our tools to manage git and github
286
286
  email: matteo.giachino@prima.it
287
287
  executables:
288
- - twig-circle
289
- - twig-deploy
290
288
  - twig-feature
291
- - twig-hotfix
292
- - twig-open-pr
293
- - twig-pick-issue
294
- - twig-review
295
289
  - twig-update-ami
296
290
  extensions: []
297
291
  extra_rdoc_files: []
298
292
  files:
299
- - bin/twig-circle
300
- - bin/twig-deploy
301
293
  - bin/twig-feature
302
- - bin/twig-hotfix
303
- - bin/twig-open-pr
304
- - bin/twig-pick-issue
305
- - bin/twig-review
306
294
  - bin/twig-update-ami
307
295
  - lib/command.rb
308
296
  - lib/prima_aws_client.rb
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require_relative '../lib/prima_twig.rb'
5
- require 'colorize'
6
- require 'highline/import'
7
- require 'launchy'
8
-
9
-
10
- def help_content
11
- <<-HELP
12
-
13
- twig-circle
14
- ===========
15
-
16
- Opens circleci contextual to the current branch
17
-
18
- Synopsis
19
- --------
20
-
21
- twig circle [-b|--branch <branch>]
22
-
23
- Description
24
- -----------
25
-
26
- Opens circleci contextual to the current branch
27
-
28
- Subcommand for Twig: <http://rondevera.github.io/twig/>
29
- Author: Matteo Giachino <https://github.com/matteosister>
30
-
31
- HELP
32
- end
33
-
34
- args = ARGV.dup
35
-
36
- if args.include?('--help')
37
- puts help_content
38
- exit
39
- end
40
-
41
- class Circle
42
- def initialize
43
- @prima = Prima.new
44
- end
45
-
46
- def execute!
47
- Launchy.open("https://circleci.com/gh/#{ @prima.repo_name }/tree/#{ @prima.current_branch_name }")
48
- end
49
- end
50
-
51
- Circle.new.execute!
@@ -1,248 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require_relative '../lib/prima_twig.rb'
5
- require_relative '../lib/prima_aws_client.rb'
6
- require 'colorize'
7
- require 'highline/import'
8
- require 'aws-sdk-batch'
9
- require 'aws-sdk-cloudformation'
10
- require 'aws-sdk-ecs'
11
- require 'aws-sdk-s3'
12
- require 'redcarpet'
13
- require 'mail'
14
- require 'erb'
15
- require 'base64'
16
- require 'rubyflare'
17
- require 'pp'
18
-
19
- def help_content
20
- <<-HELP
21
-
22
- twig-deploy
23
- ===========
24
-
25
- Deploys prima in production
26
-
27
- Synopsis
28
- --------
29
-
30
- twig deploy
31
-
32
- Description
33
- -----------
34
-
35
- It will ask you which artifact you want to deploy, run bin/deploy script and then send an email to the team when it's done.
36
-
37
- Subcommand for Twig: <http://rondevera.github.io/twig/>
38
- Author: Andrea Usuelli <https://github.com/andreausu>
39
-
40
- HELP
41
- end
42
-
43
- args = ARGV.dup
44
-
45
- if args.include?('--help')
46
- puts help_content
47
- exit
48
- end
49
-
50
- class Review
51
- include Command
52
- include PrimaAwsClient
53
-
54
- def initialize
55
- @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
- @cf = Aws::CloudFormation::Client.new
59
- @ecs = Aws::ECS::Client.new
60
- @s3 = Aws::S3::Client.new
61
- @batch = Aws::Batch::Client.new
62
- @s3_bucket = "prima-artifacts-encrypted"
63
- end
64
-
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!
79
- stop_if @prima.head_detached?, :detached_head
80
- stop_if @prima.repo_has_modified_files?, "Non posso deployare con file non commitati"
81
-
82
- output "Recupero degli artifacts in corso, attendi qualche secondo...".yellow
83
- artifacts = get_artifacts[0..49]
84
-
85
- artifact_rev = choose do |menu|
86
- menu.prompt = 'Scegli la release da deployare: '.cyan
87
- menu.shell = true
88
-
89
- artifacts.each do |v|
90
- title = @prima.reduce_size(v[:branch], 100)
91
- commit_msg = @prima.reduce_size(v[:commit_msg], 250)
92
- msg = "#{title} #{v[:created_at].strftime('%d/%m/%Y %H:%M:%S')} #{v[:rev]} #{commit_msg}".light_blue
93
- menu.choice(msg) {v[:rev]}
94
- end
95
- end
96
-
97
- user = `git config user.name`.delete "\n"
98
- artifact = artifacts.select {|v| v[:rev] == artifact_rev}.first
99
-
100
- do_deploy! artifact_rev
101
-
102
- mail = Mail.new do
103
- from 'deploy@prima.it'
104
- to 'deploy@prima.it'
105
- subject "#{user} ha effettuato il deploy della revision #{artifact[:rev]}"
106
- end
107
-
108
- commit_msg = clean_commit_message(artifact[:commit_msg])
109
-
110
- body = "## Deploy in produzione effettuato con successo\n\n"
111
- body << "Data: #{Time.now.strftime('%d/%m/%Y %H:%M:%S')}\n\n"
112
- body << "Utente: #{user}\n\n"
113
- body << "Revision: [#{artifact[:rev]}](https://github.com/primait/prima/commit/#{artifact[:rev]}) del #{artifact[:created_at].strftime('%d/%m/%Y %H:%M:%S')}\n\n"
114
- body << "Branch: [#{artifact[:branch]}](https://github.com/primait/prima/tree/#{artifact[:branch]})\n\n"
115
- body << "Commit: #{commit_msg.gsub(/_/, '\_')}\n\n"
116
-
117
- htmlBody = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render body
118
-
119
- html_part = Mail::Part.new do
120
- content_type 'text/html; charset=UTF-8'
121
- body htmlBody
122
- end
123
- text_part = Mail::Part.new do
124
- body htmlBody.gsub(/<br\s?\/?>/, "\r\n").gsub(/<\/?[^>]*>/, '')
125
- end
126
-
127
- mail.html_part = html_part
128
- mail.text_part = text_part
129
-
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"
135
-
136
- mail.delivery_method(:smtp, opts)
137
- mail.deliver
138
-
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
- end
199
-
200
- def get_artifacts
201
- artifacts = []
202
- resp = @s3.list_objects(bucket: @s3_bucket, prefix: 'prima')
203
- 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$/)
206
- if rev
207
- object = @s3.head_object(bucket: @s3_bucket, key: l.key)
208
- commit_msg = ''
209
- 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')
211
- end
212
- end
213
- artifacts.sort_by { |v| v[:created_at] }.reverse
214
- end
215
-
216
- def launch_crawler()
217
- resp = describe_stack_resource('batch-job-crawler-production', 'JobDefinition')
218
-
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
- })
224
-
225
- output "Crawler lanciato con successo!\n".green
226
- end
227
-
228
- end
229
-
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
236
-
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
- }
244
- end
245
- return nil
246
- end
247
-
248
- Review.new.execute! args
@@ -1,105 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require_relative '../lib/prima_twig.rb'
5
-
6
- class Hotfix
7
- include Command
8
-
9
- def initialize
10
- @prima = Prima.new
11
- end
12
-
13
- def execute! args
14
- possible_args = ["start", "finish"]
15
- stop_if args.empty?, [:wrong_args, possible_args]
16
- stop_if args.length > 1, [:wrong_args, possible_args]
17
-
18
- stop_if @prima.head_detached?, :detached_head
19
- stop_unless @prima.is_clean?, :clean
20
-
21
- case args[0]
22
- when "start"
23
- start_hotfix!
24
- when "finish"
25
- merge_hotfix!
26
- else
27
- stop_if true, [:wrong_args, possible_args]
28
- end
29
- end
30
-
31
- def start_hotfix!
32
-
33
- branch_name = @prima.clean_branch_name(ask('Inserisci il nome del branch (puoi omettere hotfix/): '.cyan))
34
- stop_unless branch_name.length > 0, 'Devi inserire il nome del branch'
35
- branch_name.prepend 'hotfix/' unless branch_name.include? 'hotfix'
36
-
37
- output "Il nome del branch sarà " + branch_name.yellow
38
-
39
- exec_step "git checkout master"
40
- exec_step "git pull origin master"
41
- exec_step "git checkout -b " + branch_name
42
- end
43
-
44
- def merge_hotfix!
45
- current_branch_name = @prima.twig.current_branch_name
46
- stop_unless (current_branch_name =~ /^hotfix\//), "Non sei su un branch di hotfix, non posso mergiare nulla"
47
-
48
- # Mergia la PR
49
- pr = @prima.get_pr
50
- stop_unless pr, 'Pull Request not found'
51
- @prima.merge_pull_request pr
52
-
53
- output "La Pull Request e' stata mergiata!".green
54
-
55
- # Mergia il branch su dev e pusha
56
- exec_step 'git fetch'
57
- exec_step 'git checkout dev'
58
- exec_step 'git merge origin/dev'
59
- exec_step "git merge --no-ff #{current_branch_name}"
60
-
61
- exec_step 'git push origin dev' if @prima.yesno 'Vuoi effettuare il push di dev?'.blue
62
-
63
- # Chiude la issue
64
- issue_number = @prima.twig.get_branch_property(current_branch_name, 'issue')
65
- @prima.close_issue(issue_number) if issue_number
66
-
67
- # Rimuove il branch remoto
68
- exec_step "git push origin :#{current_branch_name}" if @prima.yesno "Vuoi eliminare il branch remoto #{current_branch_name}?".blue
69
- end
70
- end
71
-
72
- def help_content
73
- <<-HELP
74
-
75
- twig-hotfix
76
- ===========
77
-
78
- Manage hotfix creation and merging
79
-
80
- Synopsis
81
- --------
82
-
83
- twig hotfix start
84
- twig hotfix close
85
-
86
- Description
87
- -----------
88
-
89
- start creates an hotfix from master branch
90
- close closes the actual hotfix by merging to dev and master
91
-
92
- Subcommand for Twig: <http://rondevera.github.io/twig/>
93
- Author: Matteo Giachino <https://github.com/matteosister>
94
-
95
- HELP
96
- end
97
-
98
- args = ARGV.dup
99
-
100
- if args.include?('--help')
101
- puts help_content
102
- exit
103
- end
104
-
105
- Hotfix.new.execute!(args)
@@ -1,115 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require_relative '../lib/prima_twig.rb'
5
- require 'colorize'
6
- require 'highline/import'
7
- require 'launchy'
8
-
9
-
10
- def help_content
11
- <<-HELP
12
-
13
- twig-open-pr
14
- ============
15
-
16
- Opens a PR on github for this branch, if not already opened
17
-
18
- Synopsis
19
- --------
20
-
21
- twig open-pr
22
-
23
- Description
24
- -----------
25
-
26
- Checks if a pr is already opened for this branch, if not opens it, otherwise do nothing
27
-
28
- Subcommand for Twig: <http://rondevera.github.io/twig/>
29
- Author: Matteo Giachino <https://github.com/matteosister>
30
-
31
- HELP
32
- end
33
-
34
- args = ARGV.dup
35
-
36
- if args.include?('--help')
37
- puts help_content
38
- exit
39
- end
40
-
41
- class OpenPR
42
- def initialize
43
- @prima = Prima.new
44
- end
45
-
46
- def execute!
47
- unless @prima.gh.user_authenticated?
48
- puts 'Non autenticato'
49
- exit 1
50
- end
51
-
52
- unless @prima.is_a_valid_branch?
53
- puts "Non puoi creare una pull request dal branch #{ @prima.current_branch_name }".red
54
- exit 1
55
- end
56
-
57
- unless is_on_github?
58
- puts "Il branch #{ @prima.current_branch_name } non è su github".red
59
- push = @prima.yesno 'Vuoi effettuare il push su github'.blue
60
- if push
61
- cmd = %{ git push -u origin "#{ @prima.current_branch_name }"}
62
- system(cmd)
63
- else
64
- exit 1
65
- end
66
- end
67
-
68
- unless @prima.get_pr_url.nil?
69
- puts "Esiste già una pull request per il branch #{ @prima.current_branch_name }. url: #{ @prima.get_pr_url }".yellow
70
- pr_property = @prima.twig.get_branch_property(@prima.current_branch_name, 'pr')
71
- if pr_property.nil?
72
- cmd = %{ twig pr "#{ @prima.get_pr.number }"}
73
- exec(cmd)
74
- end
75
- open = @prima.yesno 'Vuoi aprirla nel browser'.blue
76
- if open
77
- Launchy.open(@prima.get_pr.html_url)
78
- end
79
- exit 0
80
- end
81
-
82
- pr = create_pull_request('master')
83
- puts "Pull Request ##{ pr.number } creata".green
84
- cmd = %{ twig pr "#{ pr.number }"}
85
- exec(cmd)
86
- @prima.update_issue_with_label(@prima.get_property('pr'), Prima::LABEL_WIP)
87
- puts "Aggiunta label \"#{ Prima::LABEL_WIP }\" sulla pull request ##{ pr.number }".green
88
- puts pr.html_url
89
- exit 0
90
- end
91
-
92
- def is_on_github?
93
- begin
94
- @prima.gh.branch @prima.repo_name, @prima.current_branch_name
95
- true
96
- rescue Octokit::NotFound
97
- return false
98
- end
99
- end
100
-
101
- def create_pull_request(base_branch)
102
- current_branch_name = @prima.current_branch_name
103
- puts "Creazione pull request sul branch #{ base_branch }"
104
- title = ask('Titolo: ')
105
- head = @prima.current_branch_name
106
- body = ask('Body: ')
107
- unless @prima.twig.get_branch_property(current_branch_name, 'issue').nil?
108
- body << " Issue di riferimento: primait/board##{@prima.twig.get_branch_property(current_branch_name, 'issue')}"
109
- end
110
- pr = @prima.create_pull_request base_branch, head, title, body
111
- @prima.assign_pull_request_to_me(pr.number)
112
- end
113
- end
114
-
115
- OpenPR.new.execute!
@@ -1,108 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require_relative '../lib/prima_twig.rb'
5
- require 'colorize'
6
- require 'highline/import'
7
- require 'pp'
8
-
9
- def help_content
10
- <<-HELP
11
-
12
- twig-pick-issue
13
- ===============
14
-
15
- Picks an issue from github and open a branch for it
16
-
17
- Synopsis
18
- --------
19
-
20
- twig pick-issue
21
-
22
-
23
- Subcommand for Twig: <http://rondevera.github.io/twig/>
24
- Author: Matteo Giachino <https://github.com/matteosister>
25
-
26
- HELP
27
- end
28
-
29
- args = ARGV.dup
30
-
31
- if args.include?('--help')
32
- puts help_content
33
- exit
34
- end
35
-
36
-
37
- class PickIssue
38
- include Command
39
-
40
- def initialize
41
- @prima = Prima.new
42
- end
43
-
44
- def execute!
45
- unless @prima.is_clean?
46
- puts 'hai dei file non committati...non posso continuare'.red
47
- exit(1)
48
- end
49
-
50
- issues = @prima.list_issues
51
-
52
- issue_number = nil
53
- args = ARGV.dup
54
- if args[0] && args[0].to_i > 0
55
- issues.keep_if do |issue|
56
- issue.number == args[0].to_i
57
- end
58
- stop_if issues.empty?, "Issue #{args[0].to_i} non trovata!"
59
- issue_number = args[0].to_i
60
- else
61
- issues.delete_if do |issue|
62
- issue.pull_request?
63
- end
64
- issue_number = choose_issue issues
65
- end
66
-
67
- issue_type = 'feature'
68
- base_branch_name_default = 'master'
69
- branch_name = ask('Inserisci il nome del branch (puoi omettere feature/): '.cyan)
70
- if branch_name.length == 0
71
- puts 'Devi inserire il nome del branch'.red
72
- exit 1
73
- end
74
- branch_name.prepend issue_type + '/' unless branch_name.include? issue_type
75
- branch_name << "-#{issue_number}"
76
-
77
- base_branch_name = ask('from which branch?'.cyan) { |q| q.default = base_branch_name_default }
78
-
79
- puts "creo branch con nome #{branch_name} partendo da #{base_branch_name}"
80
- @prima.rugged.branches.create(branch_name, base_branch_name)
81
-
82
- @prima.twig.set_branch_property(branch_name, 'issue', issue_number)
83
- @prima.twig.set_branch_property(branch_name, 'diff-branch', base_branch_name)
84
- @prima.rugged.checkout(branch_name)
85
- @prima.update_issue_with_label(issue_number, Prima::LABEL_WIP)
86
- puts "Aggiunta label \"#{ Prima::LABEL_WIP }\" sulla issue primait/board##{ issue_number }".green
87
- @prima.assign_issue_to_me(issue_number)
88
- puts "Issue primait/board##{ issue_number } assegnata a #{ @prima.user_login }".green
89
- end
90
-
91
- def choose_issue(issues)
92
- choose do |menu|
93
- menu.prompt = 'Pick an issue: '.cyan
94
- menu.shell = true
95
-
96
- issues.each do |issue|
97
- milestone = issue.milestone
98
- issue_number = "##{issue.number}".green
99
- title = @prima.reduce_size(issue.title, 100).light_blue
100
- msg = "#{issue_number} - #{title}"
101
- msg << " [#{milestone.title}]".blue unless milestone.nil?
102
- menu.choice(msg) {issue.number}
103
- end
104
- end
105
- end
106
- end
107
-
108
- PickIssue.new.execute!
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require_relative '../lib/prima_twig.rb'
5
- require 'colorize'
6
- require 'highline/import'
7
-
8
-
9
- def help_content
10
- <<-HELP
11
-
12
- twig-review
13
- ===========
14
-
15
- Puts the pull request for the current branch in review
16
-
17
- Synopsis
18
- --------
19
-
20
- twig review
21
-
22
- Description
23
- -----------
24
-
25
- Puts the current branch pr in review
26
-
27
- Subcommand for Twig: <http://rondevera.github.io/twig/>
28
- Author: Matteo Giachino <https://github.com/matteosister>
29
-
30
- HELP
31
- end
32
-
33
- args = ARGV.dup
34
-
35
- if args.include?('--help')
36
- puts help_content
37
- exit
38
- end
39
-
40
- class Review
41
- def initialize
42
- @prima = Prima.new
43
- end
44
-
45
- def execute!
46
- unless @prima.is_a_valid_branch?
47
- puts "Il branch #{ @prima.current_branch_name } non può essere in review".red
48
- exit 1
49
- end
50
-
51
- unless @prima.has_property?('pr')
52
- puts 'Il branch attuale non ha la proprietà PR'.red
53
- exit 1
54
- end
55
-
56
- unless @prima.is_already_a_pr?
57
- puts 'Il branch attuale non è una pull request'.red
58
- exit 1
59
- end
60
-
61
- puts "Pull request ##{@prima.get_property('pr')}".cyan
62
- puts "Issue ##{@prima.get_property('issue')}".cyan if @prima.has_property?('issue')
63
-
64
- @prima.put_issue_in_review(@prima.get_property('pr'))
65
- puts "La pull request #{ @prima.get_property('pr') } è ora in review".green
66
-
67
- if @prima.has_property?('issue')
68
- @prima.put_issue_in_review(@prima.get_property('issue'))
69
- puts "La issue #{ @prima.get_property('issue') } è ora in review".green
70
- end
71
-
72
- exit 0
73
- end
74
- end
75
-
76
- Review.new.execute!