dual_burner 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/README.md +7 -1
- data/Rakefile +3 -3
- data/dual_burner.gemspec +1 -1
- data/exe/dual_burner +1 -1
- data/lib/dual_burner.rb +2 -0
- data/lib/dual_burner/base_command.rb +23 -11
- data/lib/dual_burner/base_heroku_command.rb +15 -0
- data/lib/dual_burner/commands/deployer.rb +8 -10
- data/lib/dual_burner/commands/heroku_config.rb +4 -14
- data/lib/dual_burner/commands/heroku_join.rb +13 -0
- data/lib/dual_burner/commands/last_release.rb +0 -1
- data/lib/dual_burner/configuration.rb +1 -1
- data/lib/dual_burner/runner.rb +21 -9
- data/lib/dual_burner/version.rb +1 -1
- metadata +14 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1d8c2c25e1bcce734886cfcda729cafd83e81d0
|
4
|
+
data.tar.gz: 6ec0cf8e2238eb616a706542cef5e7042246a77a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbe353d8e66511ae3e5556b2fa362f662f0bc4c7a7a6f96a6ea559048670fcfb03c2ebf41c82b78f2eb5a95c9711bef36d3486ac34da4b67b59194bb3c8993d0
|
7
|
+
data.tar.gz: db3c3384cd97b8204674d0f3372962737237cb74ef19ab08c4187e550154dbd7b21d74783ad84bf1334d4197acc64f2547253304f65121d6729d9b791f2aed73
|
data/.rubocop.yml
CHANGED
@@ -13,7 +13,7 @@ Metrics/LineLength:
|
|
13
13
|
Max: 120
|
14
14
|
|
15
15
|
Metrics/MethodLength:
|
16
|
-
Max:
|
16
|
+
Max: 40
|
17
17
|
|
18
18
|
Metrics/ParameterLists:
|
19
19
|
Max: 6
|
@@ -21,5 +21,8 @@ Metrics/ParameterLists:
|
|
21
21
|
Style/Documentation:
|
22
22
|
Enabled: false
|
23
23
|
|
24
|
+
Style/FrozenStringLiteralComment:
|
25
|
+
Enabled: false
|
26
|
+
|
24
27
|
Style/SignalException:
|
25
28
|
Enabled: false
|
data/README.md
CHANGED
@@ -89,7 +89,13 @@ You can pass in file locations of your deploy configuration if it is not under `
|
|
89
89
|
|
90
90
|
You can verify that all versions are consistent with the following command.
|
91
91
|
|
92
|
-
`dual_burner last_release
|
92
|
+
`dual_burner last_release -e wms_testing`
|
93
|
+
|
94
|
+
## Joining Heroku Apps
|
95
|
+
|
96
|
+
You can join all Heroku apps in a cluster.
|
97
|
+
|
98
|
+
`dual_burner join -e wms_testing`
|
93
99
|
|
94
100
|
## Heroku Config Management
|
95
101
|
|
data/Rakefile
CHANGED
data/dual_burner.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency 'colorize', '~> 0.7'
|
23
23
|
spec.add_dependency 'thor', '~> 0.19'
|
24
24
|
|
25
|
-
spec.add_development_dependency 'bundler', '
|
25
|
+
spec.add_development_dependency 'bundler', '>= 1.9.5', '< 2.0'
|
26
26
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
28
28
|
spec.add_development_dependency 'pry'
|
data/exe/dual_burner
CHANGED
data/lib/dual_burner.rb
CHANGED
@@ -5,7 +5,9 @@ require 'dual_burner/configuration'
|
|
5
5
|
require 'dual_burner/configuration_error'
|
6
6
|
require 'dual_burner/environment_not_found_error'
|
7
7
|
require 'dual_burner/base_command'
|
8
|
+
require 'dual_burner/base_heroku_command'
|
8
9
|
require 'dual_burner/commands/deployer'
|
9
10
|
require 'dual_burner/commands/heroku_config'
|
11
|
+
require 'dual_burner/commands/heroku_join'
|
10
12
|
require 'dual_burner/commands/last_release'
|
11
13
|
require 'dual_burner/runner'
|
@@ -15,12 +15,12 @@ module DualBurner
|
|
15
15
|
protected
|
16
16
|
|
17
17
|
def apps
|
18
|
-
@apps ||=
|
18
|
+
@apps ||= apps_for_environment
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def apps_for_environment
|
22
22
|
raise ArgumentError, 'ENV IS NOT PRESENT!' if env.nil?
|
23
|
-
raise DualBurner::ConfigurationError, 'CONFIG IS NOT PRESENT!' unless File.
|
23
|
+
raise DualBurner::ConfigurationError, 'CONFIG IS NOT PRESENT!' unless File.exist?(configuration.deploy_file)
|
24
24
|
config = YAML.load(File.read(configuration.deploy_file))[env]
|
25
25
|
raise DualBurner::EnvironmentNotFoundError, "ENV #{env} NOT FOUND!" if config.nil?
|
26
26
|
config.map { |c| app_instance(c) }
|
@@ -49,10 +49,22 @@ module DualBurner
|
|
49
49
|
)
|
50
50
|
end
|
51
51
|
|
52
|
+
def verify_results_exit_0(results, context:)
|
53
|
+
if !all_processes_exit_0?(results.map(&:value))
|
54
|
+
puts "The following #{context} failed:".red.blink
|
55
|
+
results.select { |r| r.value.exitstatus != 0 }.each do |r|
|
56
|
+
puts "#{r.app.name} failed with #{r.value.exitstatus}.".red
|
57
|
+
end
|
58
|
+
false
|
59
|
+
else
|
60
|
+
true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
52
64
|
##
|
53
65
|
# Determine of all processes return exit 0 status.
|
54
66
|
def all_processes_exit_0?(processes)
|
55
|
-
if processes.
|
67
|
+
if processes.count { |p| p.exitstatus == 0 } == processes.size
|
56
68
|
true
|
57
69
|
else
|
58
70
|
false
|
@@ -67,9 +79,9 @@ module DualBurner
|
|
67
79
|
puts "#{app.name} #{Time.now} - executing command [#{command}]".send(app.color)
|
68
80
|
|
69
81
|
result = result_instance
|
70
|
-
Open3.popen2e(command) do |
|
82
|
+
Open3.popen2e(command) do |_stdin, stdout_and_stderr, thread|
|
71
83
|
Thread.new do
|
72
|
-
|
84
|
+
while (raw_line = stdout_and_stderr.gets)
|
73
85
|
# There is a newline automatically appended from the stream.
|
74
86
|
print "#{app.name} #{Time.now} - #{raw_line}".send(app.color) if print_lines
|
75
87
|
result.lines << raw_line
|
@@ -96,24 +108,24 @@ module DualBurner
|
|
96
108
|
# We have different commit hashes, env variables, whatever, we need to warn.
|
97
109
|
if values.uniq.size > 1
|
98
110
|
puts "Inconsistent #{context} found!".red.blink
|
99
|
-
puts
|
111
|
+
puts ''
|
100
112
|
|
101
113
|
results.each_with_index do |result, i|
|
102
114
|
print result.app.name.send(result.app.color)
|
103
115
|
print " is at #{context} "
|
104
116
|
print values[i].bold
|
105
|
-
puts
|
117
|
+
puts ''
|
106
118
|
end
|
107
119
|
|
108
120
|
false
|
109
121
|
# Everything is fine!
|
110
122
|
elsif values.uniq.size == 1
|
111
|
-
puts
|
112
|
-
print
|
123
|
+
puts ''
|
124
|
+
print 'All apps '
|
113
125
|
print results.map { |r| r.app.name }.join(', ').bold
|
114
126
|
print " are on #{context} "
|
115
127
|
print values.first.green
|
116
|
-
puts
|
128
|
+
puts ''
|
117
129
|
|
118
130
|
true
|
119
131
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DualBurner
|
2
|
+
class BaseHerokuCommand < BaseCommand
|
3
|
+
protected
|
4
|
+
|
5
|
+
def execute_command_with_apps
|
6
|
+
results = []
|
7
|
+
apps.each do |app|
|
8
|
+
raise DualBurner::ConfigurationError, 'HEROKU APP NAME NOT CONFIGURED' if app.heroku_app_name.nil?
|
9
|
+
command = yield(app)
|
10
|
+
results << execute_command(command, app: app)
|
11
|
+
end
|
12
|
+
results
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -26,9 +26,7 @@ module DualBurner
|
|
26
26
|
# Wait for all commands to complete.
|
27
27
|
threads.map(&:join)
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
all_processes_exit_0?(results.map { |r| r.value })
|
29
|
+
verify_results_exit_0(results, context: 'deploys')
|
32
30
|
end
|
33
31
|
|
34
32
|
def build_deploy_command(app:, git_reference:)
|
@@ -43,17 +41,17 @@ module DualBurner
|
|
43
41
|
# Show the user what Heroku apps are involved.
|
44
42
|
puts "\n"
|
45
43
|
|
46
|
-
print
|
44
|
+
print 'You are about to deploy '
|
47
45
|
print git_reference.bold
|
48
|
-
print
|
46
|
+
print ' to '
|
49
47
|
print env.bold
|
50
|
-
print
|
51
|
-
print apps.map
|
48
|
+
print ' on the following Apps: '
|
49
|
+
print apps.map(&:name).join(', ').bold
|
52
50
|
|
53
51
|
puts "\n" * 2
|
54
52
|
|
55
53
|
# Show the user what we are about to do on their machine.
|
56
|
-
puts
|
54
|
+
puts 'These commands will be executed:'
|
57
55
|
apps.each do |app|
|
58
56
|
puts build_deploy_command(app: app, git_reference: git_reference).send(app.color).bold
|
59
57
|
end
|
@@ -65,10 +63,10 @@ module DualBurner
|
|
65
63
|
puts "If this is ok, please type in the following: #{challenge}"
|
66
64
|
response = STDIN.gets.chomp
|
67
65
|
if challenge != response
|
68
|
-
puts
|
66
|
+
puts 'You didn\'t enter the right challenge. Aborting!'.red.bold
|
69
67
|
exit(1)
|
70
68
|
else
|
71
|
-
puts
|
69
|
+
puts 'Preparing to deploy....'
|
72
70
|
end
|
73
71
|
end
|
74
72
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module DualBurner
|
2
2
|
module Commands
|
3
|
-
class HerokuConfig < DualBurner::
|
3
|
+
class HerokuConfig < DualBurner::BaseHerokuCommand
|
4
4
|
def get(key:)
|
5
5
|
results = execute_command_with_apps do |app|
|
6
6
|
"heroku config:get #{key} -a #{app.heroku_app_name}"
|
@@ -11,28 +11,18 @@ module DualBurner
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def set(
|
14
|
+
def set(key:, value:)
|
15
15
|
results = execute_command_with_apps do |app|
|
16
16
|
"heroku config:set #{key}=#{value} -a #{app.heroku_app_name}"
|
17
17
|
end
|
18
|
-
all_processes_exit_0?(results.map
|
18
|
+
all_processes_exit_0?(results.map(&:value))
|
19
19
|
end
|
20
20
|
|
21
21
|
def unset(key:)
|
22
22
|
results = execute_command_with_apps do |app|
|
23
23
|
"heroku config:unset #{key} -a #{app.heroku_app_name}"
|
24
24
|
end
|
25
|
-
all_processes_exit_0?(results.map
|
26
|
-
end
|
27
|
-
|
28
|
-
def execute_command_with_apps
|
29
|
-
results = []
|
30
|
-
apps.each do |app|
|
31
|
-
raise DualBurner::ConfigurationError, 'HEROKU APP NAME NOT CONFIGURED' if app.heroku_app_name.nil?
|
32
|
-
command = yield(app)
|
33
|
-
results << execute_command(command, app: app)
|
34
|
-
end
|
35
|
-
results
|
25
|
+
all_processes_exit_0?(results.map(&:value))
|
36
26
|
end
|
37
27
|
end
|
38
28
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module DualBurner
|
2
|
+
module Commands
|
3
|
+
class HerokuJoin < DualBurner::BaseHerokuCommand
|
4
|
+
def join
|
5
|
+
results = execute_command_with_apps do |app|
|
6
|
+
"heroku join -a #{app.heroku_app_name}"
|
7
|
+
end
|
8
|
+
|
9
|
+
verify_results_exit_0(results, context: 'Heroku app join')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/dual_burner/runner.rb
CHANGED
@@ -2,9 +2,9 @@ require 'dual_burner'
|
|
2
2
|
|
3
3
|
module DualBurner
|
4
4
|
class Runner < Thor
|
5
|
-
|
6
|
-
ENV_DESC = 'The cluster environment.'.freeze unless defined?(ENV_DESC)
|
7
5
|
CONFIG_DESC = 'Your configuration file if not .config/dual_burner.yml'.freeze unless defined?(CONFIG_DESC)
|
6
|
+
ENV_DESC = 'The cluster environment.'.freeze unless defined?(ENV_DESC)
|
7
|
+
GIT_DESC = 'The git reference to deploy.'.freeze unless defined?(GIT_DESC)
|
8
8
|
HEROKU_KEY_DESC = 'The key to set on the Heroku app.'.freeze unless defined?(HEROKU_KEY_DESC)
|
9
9
|
|
10
10
|
desc 'last_release', 'Finds the HEAD git revision for all applications in cluster <ENV>.'
|
@@ -14,18 +14,21 @@ module DualBurner
|
|
14
14
|
::DualBurner::Commands::LastRelease.new(
|
15
15
|
env: options.fetch('env'),
|
16
16
|
configuration: get_configuration_instance(deploy_file: options['config'])
|
17
|
-
).verify_apps
|
17
|
+
).verify_apps
|
18
18
|
end
|
19
19
|
|
20
20
|
desc 'deploy', 'Deploy <REF> to all applications in cluster <ENV>.'
|
21
21
|
method_option :env, aliases: '-e', type: :string, required: true, desc: ENV_DESC
|
22
22
|
method_option :config, aliases: '-c', type: :string, optional: true, desc: CONFIG_DESC
|
23
|
-
method_option :git_reference, aliases: '-g', default: 'master', type: :string,
|
23
|
+
method_option :git_reference, aliases: '-g', default: 'master', type: :string, optional: true, desc: GIT_DESC
|
24
|
+
method_option :join, aliases: '-j', default: true, optional: true, desc: 'Join all applications before deploy.'
|
24
25
|
def deploy
|
26
|
+
invoke(:join, [], env: options['env']) if options['join'] == true
|
27
|
+
|
25
28
|
::DualBurner::Commands::Deployer.new(
|
26
29
|
env: options.fetch('env'),
|
27
30
|
configuration: get_configuration_instance(deploy_file: options['config'])
|
28
|
-
).deploy(git_reference: options['git_reference'])
|
31
|
+
).deploy(git_reference: options['git_reference'])
|
29
32
|
end
|
30
33
|
|
31
34
|
desc 'config_set', 'Set <KEY> to <VALUE> for all Heroku appslocations in cluster <ENV>.'
|
@@ -37,7 +40,7 @@ module DualBurner
|
|
37
40
|
::DualBurner::Commands::HerokuConfig.new(
|
38
41
|
env: options.fetch('env'),
|
39
42
|
configuration: get_configuration_instance(deploy_file: options['config'])
|
40
|
-
).set(key: options.fetch('key'), value: options['value'])
|
43
|
+
).set(key: options.fetch('key'), value: options['value'])
|
41
44
|
end
|
42
45
|
|
43
46
|
desc 'config_get', 'Get <KEY> for all Heroku appslocations in cluster <ENV>.'
|
@@ -48,7 +51,7 @@ module DualBurner
|
|
48
51
|
::DualBurner::Commands::HerokuConfig.new(
|
49
52
|
env: options.fetch('env'),
|
50
53
|
configuration: get_configuration_instance(deploy_file: options['config'])
|
51
|
-
).get(key: options.fetch('key'))
|
54
|
+
).get(key: options.fetch('key'))
|
52
55
|
end
|
53
56
|
|
54
57
|
desc 'config_unset', 'Unset <KEY> for all Heroku appslocations in cluster <ENV>.'
|
@@ -59,13 +62,22 @@ module DualBurner
|
|
59
62
|
::DualBurner::Commands::HerokuConfig.new(
|
60
63
|
env: options.fetch('env'),
|
61
64
|
configuration: get_configuration_instance(deploy_file: options['config'])
|
62
|
-
).unset(key: options.fetch('key'))
|
65
|
+
).unset(key: options.fetch('key'))
|
66
|
+
end
|
67
|
+
|
68
|
+
desc 'join', 'Join all Heroku appslocations in cluster <ENV>.'
|
69
|
+
method_option :env, aliases: '-e', type: :string, required: true, desc: ENV_DESC
|
70
|
+
def join
|
71
|
+
::DualBurner::Commands::HerokuJoin.new(
|
72
|
+
env: options.fetch('env'),
|
73
|
+
configuration: get_configuration_instance(deploy_file: options['config'])
|
74
|
+
).join
|
63
75
|
end
|
64
76
|
|
65
77
|
protected
|
66
78
|
|
67
79
|
def get_configuration_instance(deploy_file: nil)
|
68
|
-
deploy_file ||=
|
80
|
+
deploy_file ||= File.join(Dir.getwd, 'config', 'dual_burner.yml')
|
69
81
|
|
70
82
|
c = DualBurner::Configuration.new
|
71
83
|
c.deploy_file = deploy_file
|
data/lib/dual_burner/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dual_burner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blue Apron Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -42,16 +42,22 @@ dependencies:
|
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.9.5
|
48
|
+
- - "<"
|
46
49
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
50
|
+
version: '2.0'
|
48
51
|
type: :development
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
|
-
- - "
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 1.9.5
|
58
|
+
- - "<"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
60
|
+
version: '2.0'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: rake
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,8 +150,10 @@ files:
|
|
144
150
|
- exe/dual_burner
|
145
151
|
- lib/dual_burner.rb
|
146
152
|
- lib/dual_burner/base_command.rb
|
153
|
+
- lib/dual_burner/base_heroku_command.rb
|
147
154
|
- lib/dual_burner/commands/deployer.rb
|
148
155
|
- lib/dual_burner/commands/heroku_config.rb
|
156
|
+
- lib/dual_burner/commands/heroku_join.rb
|
149
157
|
- lib/dual_burner/commands/last_release.rb
|
150
158
|
- lib/dual_burner/configuration.rb
|
151
159
|
- lib/dual_burner/configuration_error.rb
|