dual_burner 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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