prima-twig 1.0.45 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/twig-feature +42 -140
- data/bin/twig-update-ami +11 -23
- data/lib/prima_aws_client.rb +0 -17
- data/lib/prima_twig.rb +1 -6
- metadata +2 -14
- data/bin/twig-circle +0 -51
- data/bin/twig-deploy +0 -248
- data/bin/twig-hotfix +0 -105
- data/bin/twig-open-pr +0 -115
- data/bin/twig-pick-issue +0 -108
- data/bin/twig-review +0 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8d26488e09dd811fb37302eb857d843490d31cb6f4a3661eed8bfdaa3971320
|
4
|
+
data.tar.gz: 6b851729f8a6215aaee3d092f8378e60a54b2faa905ffea229ac6fcf28c25227
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e077ed692aa53693dd06b1658c72feab99c24d4ffbe5a8d050041774ce1d2926ff7379779b5c30ef43131a4b2972cce4cbbf2e459d202b2e92c18b46a9524a38
|
7
|
+
data.tar.gz: b9f4db60c9a24d2f578ab5cb928021483187a53e1a98f1bce290a599702a51b722d1b4604cbbc9fe04d2aca8c7fd9ba61257c3f0837b4b90b0d5f8c87a70a80d
|
data/bin/twig-feature
CHANGED
@@ -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
|
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
|
-
|
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
|
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
|
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
|
667
|
-
|
668
|
-
|
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
|
-
|
605
|
+
# chiamare api octokit per recuperare i branch/commit
|
686
606
|
output "Recupero la lista dei branch del progetto #{project_name}..."
|
687
|
-
|
688
|
-
|
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 =
|
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
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
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
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
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
|
|
data/bin/twig-update-ami
CHANGED
@@ -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
|
-
#
|
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
|
-
|
55
|
-
|
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(
|
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
|
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,
|
124
|
-
|
125
|
-
|
126
|
-
|
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
|
data/lib/prima_aws_client.rb
CHANGED
@@ -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
|
data/lib/prima_twig.rb
CHANGED
@@ -8,12 +8,7 @@ require 'aws-sdk-core'
|
|
8
8
|
require 'rubyflare'
|
9
9
|
|
10
10
|
class Prima
|
11
|
-
|
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.
|
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-
|
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
|
data/bin/twig-circle
DELETED
@@ -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!
|
data/bin/twig-deploy
DELETED
@@ -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
|
data/bin/twig-hotfix
DELETED
@@ -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)
|
data/bin/twig-open-pr
DELETED
@@ -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!
|
data/bin/twig-pick-issue
DELETED
@@ -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!
|
data/bin/twig-review
DELETED
@@ -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!
|