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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b12d52c907a72c8b457e012cd28033a272da5975
4
- data.tar.gz: e46f66e90b6c1709d21a6726d2ea32ece06176c7
3
+ metadata.gz: b1d8c2c25e1bcce734886cfcda729cafd83e81d0
4
+ data.tar.gz: 6ec0cf8e2238eb616a706542cef5e7042246a77a
5
5
  SHA512:
6
- metadata.gz: c3d7ca6bad54f606ecd793a301e54a4967d5099a9fbfbd21bdea96bbbba7b73c4d7c1268a2f8942923575aaba8e5dc8aaa934c74a51f140b1278dddc236d34b5
7
- data.tar.gz: 3ebc133f63dfb06afd11540936bf1a61bfcc0ec0a04494d78d0ba41e429198b1d5bd07e4735de63003c03954b8a9f9669704e163f37f9106011eee58b019ab03
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: 20
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 --e wms_testing`
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
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
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', '~> 1.11'
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
@@ -3,4 +3,4 @@ require 'rubygems'
3
3
  require 'thor'
4
4
  require 'dual_burner'
5
5
 
6
- DualBurner::Runner.start
6
+ DualBurner::Runner.start ? exit(0) : exit(1)
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 ||= get_apps_for_environment
18
+ @apps ||= apps_for_environment
19
19
  end
20
20
 
21
- def get_apps_for_environment
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.exists?(configuration.deploy_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.select { |p| p.exitstatus == 0 }.size == processes.size
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 |stdin, stdout_and_stderr, thread|
82
+ Open3.popen2e(command) do |_stdin, stdout_and_stderr, thread|
71
83
  Thread.new do
72
- until (raw_line = stdout_and_stderr.gets).nil? do
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 "All apps "
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
- puts "Completed all deploys [#{threads.size}]!"
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 "You are about to deploy "
44
+ print 'You are about to deploy '
47
45
  print git_reference.bold
48
- print " to "
46
+ print ' to '
49
47
  print env.bold
50
- print " on the following Apps: "
51
- print apps.map { |a| a.name }.join(', ').bold
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 "These commands will be executed:"
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 "You didn't enter the right challenge. Aborting!".red.bold
66
+ puts 'You didn\'t enter the right challenge. Aborting!'.red.bold
69
67
  exit(1)
70
68
  else
71
- puts "Preparing to deploy...."
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::BaseCommand
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( key:, value:)
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 { |r| r.value })
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 { |r| r.value })
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
@@ -3,7 +3,6 @@ module DualBurner
3
3
  class LastRelease < DualBurner::BaseCommand
4
4
  def verify_apps
5
5
  results = []
6
- commit_hashes = []
7
6
 
8
7
  apps.each do |app|
9
8
  remote = app.remote_url
@@ -8,7 +8,7 @@ module DualBurner
8
8
  # Enable or disable user interaction.
9
9
  attr_accessor :interactive
10
10
 
11
- alias_method :interactive?, :interactive
11
+ alias interactive? interactive
12
12
 
13
13
  def initialize
14
14
  @interactive = true
@@ -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 ? exit(0) : exit(1)
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, required: false, desc: 'The git reference to deploy.'
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']) ? exit(0) : exit(1)
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']) ? exit(0) : exit(1)
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')) ? exit(0) : exit(1)
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')) ? exit(0) : exit(1)
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 ||= File.join(Dir.getwd, 'config', 'dual_burner.yml')
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
@@ -1,3 +1,3 @@
1
1
  module DualBurner
2
- VERSION = "0.1.0"
2
+ VERSION = '0.2.0'.freeze
3
3
  end
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.1.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-02-29 00:00:00.000000000 Z
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: '1.11'
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: '1.11'
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