qops 1.6.1 → 1.8.1

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
- SHA1:
3
- metadata.gz: ae573e99371d225d3eca19d41a48f13a8a013819
4
- data.tar.gz: 7feba6d8f128cf7e6a62bf80cf5306d4827db491
2
+ SHA256:
3
+ metadata.gz: af7b1d924423be4fadd918150bc5bfc948012cb6db284b7fcb2bc1a9bf153937
4
+ data.tar.gz: 2ef7d27d6daaba3f569847cb2650d8b861d5690e9c79784b3dc8369d0cd12e1a
5
5
  SHA512:
6
- metadata.gz: 102be14735cf3aaf894bcc5b502f4c9bf5d9652651a592428f19978f779f740612bb6b74224273f39618427028a80c6e0f13dd4fc2a5b929d1b0959eec993831
7
- data.tar.gz: dfe5b532a6da97e65b66474267b843c50d4c1fb8d321ec4dc0ae2894b16a51eed086136b559f92958bd1eb1e59146a307022f5f9499a1689c4555d5b2d966dd9
6
+ metadata.gz: 10eb2ea844656184d4e74559237ab2486329a3e01f44dc51a847d0ec02222398addc664956cc2c41725599b78f10a73e565a97e59ce8debaf1075b101d3fc7ee
7
+ data.tar.gz: 6d5465f49155bd01622e52f2ace9a882feab6cee327f5e07aee05a84397cf9b51cf03850d596062ac6775a6b8cb1ccdcd358c35ca1aecc2ea402ecd29f634839
data/README.md CHANGED
@@ -9,13 +9,16 @@
9
9
 
10
10
  ## FAQ:
11
11
 
12
- ### Q: The `qops` gem is currently not public. How do I access it?
12
+ ### Q: Can I Override Built-In Templates
13
13
 
14
- Please add your personal gemfury source to the gem path to install it.
14
+ You can create a overridden_built_in_templates folder within you cookbooks folder.
15
+ /cookbooks/overridden_built_in_templates/unicorn/templates/default/unicorn.conf.erb
15
16
 
16
17
  ### Q: For the `qops qops:instance:run_command` command, it provides two options: one is run commands against all instances of the stack all in once, one is run commands on each instances of the stack one by one randomly. How do I use this?
17
18
 
18
- When running commands one by one, between each execution of the command, there will be a delay. The delay is config by wait_deploy. By default it is 180 seconds when it is not defined. For now, run_command command will only support commends `setup` `configure` `install_dependencies` `update_dependencies`, since commands `update_custom_cookbooks` `deploy` was implemented before.
19
+ When running commands one by one, between each execution of the command, there will be a delay. The delay is config by wait_deploy. By default it is 180 seconds when it is not defined. For now, run_command command will only support commends `setup` `configure` `install_dependencies` `update_dependencies`, `execute_recipes`, since commands `update_custom_cookbooks` `deploy` was implemented before.
20
+
21
+ When run command `execute_recipes`, a comma separated recipes should be supply, for example: cookbookname::recipename_one,cookbookname::recipename_two
19
22
 
20
23
  ### Q: How do I use QOPS to override env variables on my opsworks CHEF 11 stack?
21
24
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thor'
2
4
  require 'thor/group'
3
5
  require 'aws-sdk'
@@ -17,6 +19,7 @@ require_relative 'qops/deployment/helpers'
17
19
  require_relative 'qops/deployment/app'
18
20
  require_relative 'qops/deployment/instances'
19
21
  require_relative 'qops/deployment/stacks'
22
+ require_relative 'qops/cookbook/helpers'
20
23
  require_relative 'qops/cookbook/cookbook'
21
24
 
22
25
  # Migrate this into quandl config project
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Cookbook < Thor
2
- include Qops::Helpers
4
+ include Qops::CookbookHelpers
3
5
 
4
6
  desc 'vendor', 'Generate vendor directory to contain the cookbooks'
5
7
  def vendor
@@ -13,6 +15,7 @@ class Qops::Cookbook < Thor
13
15
  desc 'package', 'Package the cookbooks into a zip file in vendor'
14
16
  def package
15
17
  initialize_run
18
+ move_custom_templates
16
19
  Dir.chdir(config.cookbook_dir) do
17
20
  remove_zip_files
18
21
  system("zip -r #{artifact_name} vendor/*")
@@ -115,20 +118,6 @@ class Qops::Cookbook < Thor
115
118
  config
116
119
  end
117
120
 
118
- def config
119
- return @_config if @_config
120
-
121
- @_config ||= Qops::Environment.new
122
-
123
- %w[cookbook_dir cookbook_s3_bucket cookbook_s3_path cookbook_name cookbook_version].each do |var|
124
- fail ArgumentError.new("Must specify a '#{var}' in the config") if !@_config.respond_to?(var) && !@_config.configuration.respond_to?(var)
125
- end
126
-
127
- fail ArgumentError.new("Cannot find/do not have access to cookbook directory: #{@_config.cookbook_dir}") unless Dir.exist?(@_config.cookbook_dir)
128
-
129
- @_config
130
- end
131
-
132
121
  def s3
133
122
  @s3 ||= Aws::S3::Client.new(**aws_configs)
134
123
  end
@@ -156,6 +145,17 @@ class Qops::Cookbook < Thor
156
145
  File.join(config.cookbook_dir, 'vendor')
157
146
  end
158
147
 
148
+ def move_custom_templates
149
+ Dir.chdir(config.cookbook_dir) do
150
+ custom_template_directory = File.join('vendor', config.cookbook_name, 'overridden_built_in_templates')
151
+ if File.directory?(custom_template_directory)
152
+ say('Moving Custom Templates:', :green)
153
+ system("mv #{custom_template_directory}/* vendor")
154
+ system("rm -rf #{custom_template_directory}")
155
+ end
156
+ end
157
+ end
158
+
159
159
  def remove_zip_files
160
160
  FileUtils.rm Dir.glob("#{config.cookbook_name}*.zip")
161
161
  say("Cleaned up directory '#{config.cookbook_dir}/*.zip'", :green)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Qops::CookbookHelpers
4
+ extend ActiveSupport::Concern
5
+
6
+ include Qops::Helpers
7
+
8
+ included do
9
+ class_option :profile, type: :string, aliases: '-p', desc: 'An AWS profile to use'
10
+ class_option :force_config, type: :boolean, aliases: '-f', desc: 'Force qops to read options from config. by default qops will search aws opsworks stack'
11
+ class_option :verbose, type: :boolean, aliases: '-v', desc: 'Provides additional information when running for debugging purposes.'
12
+ end
13
+
14
+ private
15
+
16
+ def config
17
+ return @_config if @_config
18
+
19
+ @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config], verbose: options[:verbose])
20
+
21
+ %w[cookbook_dir cookbook_s3_bucket cookbook_s3_path cookbook_name cookbook_version].each do |var|
22
+ fail ArgumentError.new("Must specify a '#{var}' in the config") if !@_config.respond_to?(var) && !@_config.configuration.respond_to?(var)
23
+ end
24
+
25
+ fail ArgumentError.new("Cannot find/do not have access to cookbook directory: #{@_config.cookbook_dir}") unless Dir.exist?(@_config.cookbook_dir)
26
+
27
+ @_config
28
+ end
29
+
30
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Deploy < Thor
2
4
  include Qops::DeployHelpers
3
5
 
@@ -8,9 +10,7 @@ class Qops::Deploy < Thor
8
10
  instances = config.deploy_type == 'staging' ? [retrieve_instance].compact : retrieve_instances
9
11
  online_instances = instances.select { |instance| instance.status == 'online' }
10
12
 
11
- if online_instances.empty?
12
- raise 'Could not find any running instance(s) to deploy to. Perhaps you need to run "qops:instance:up" first'
13
- end
13
+ raise 'Could not find any running instance(s) to deploy to. Perhaps you need to run "qops:instance:up" first' if online_instances.empty?
14
14
 
15
15
  if config.deploy_type == 'staging'
16
16
  puts "Preparing to deploy branch #{revision_used} to instance #{online_instances.first.hostname}"
@@ -32,9 +32,7 @@ class Qops::Deploy < Thor
32
32
  base_deployment_params[:app_id] = config.application_id
33
33
  end
34
34
 
35
- if config.deploy_type != 'production'
36
- base_deployment_params[:custom_json] = custom_json.to_json
37
- end
35
+ base_deployment_params[:custom_json] = custom_json.to_json if config.deploy_type != 'production'
38
36
 
39
37
  manifest = {
40
38
  environment: config.deploy_type
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qops::DeployHelpers
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -8,7 +10,11 @@ module Qops::DeployHelpers
8
10
  class_option :branch, type: :string, aliases: '-b', desc: 'The branch to use when deploying to staging type environments'
9
11
  class_option :hostname, type: :string, aliases: '-h', desc: 'Fully override the hostname that qops would normally give the instance'
10
12
  class_option :profile, type: :string, aliases: '-p', desc: 'An AWS profile to use'
11
- class_option :force_config, type: :boolean, aliases: '-f', desc: 'force qops to read options from config. by default qops will search aws opsworks stack'
13
+ class_option :force_config, type: :boolean, aliases: '-f', desc: 'Force qops to read options from config. by default qops will search aws opsworks stack'
14
+ class_option :verbose, type: :boolean, aliases: '-v', desc: 'Provides additional information when running for debugging purposes.'
15
+ class_option :command_for_run_command, type: :string, aliases: '-c', desc: 'The command to use when run_command'
16
+ class_option :recipes, type: :string, aliases: '-r', desc: 'The recipes to use when run_command execute_recipes'
17
+ class_option :options_for_run_command, type: :string, aliases: '-o', desc: 'options for run_command such as current, all_in_once or one_by_one'
12
18
  end
13
19
 
14
20
  private
@@ -16,7 +22,7 @@ module Qops::DeployHelpers
16
22
  def config
17
23
  return @_config if @_config
18
24
  Qops::Environment.notifiers
19
- @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config])
25
+ @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config], verbose: options[:verbose])
20
26
 
21
27
  fail "Invalid configure deploy_type detected: #{@_config.deploy_type}" unless %w[staging production].include?(@_config.deploy_type)
22
28
 
@@ -108,7 +114,7 @@ module Qops::DeployHelpers
108
114
  return 'master' unless config.deploy_type == 'staging'
109
115
  if options[:branch].present?
110
116
  options[:branch]
111
- elsif `git --version` # rubocop:disable Lint/LiteralInCondition
117
+ elsif `git --version` # rubocop:disable Lint/LiteralAsCondition
112
118
  `git symbolic-ref --short HEAD`.strip
113
119
  else
114
120
  'master'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
2
4
  include Qops::DeployHelpers
3
5
 
@@ -55,9 +57,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
55
57
 
56
58
  # Start the instance if necessary
57
59
  print 'Booting instance ...'
58
- unless %w[online booting].include?(instance.status)
59
- config.opsworks.start_instance(instance_id: instance_id)
60
- end
60
+ config.opsworks.start_instance(instance_id: instance_id) unless %w[online booting].include?(instance.status)
61
61
 
62
62
  manifest = {
63
63
  environment: config.deploy_type,
@@ -144,9 +144,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
144
144
  def clean
145
145
  initialize_run
146
146
 
147
- if config.deploy_type == 'production'
148
- fail "Cannot clean instances in a #{config.deploy_type} environment"
149
- end
147
+ fail "Cannot clean instances in a #{config.deploy_type} environment" if config.deploy_type == 'production'
150
148
 
151
149
  terminated_instances = []
152
150
 
@@ -194,20 +192,42 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
194
192
  initialize_run
195
193
  instances = retrieve_instances
196
194
 
197
- puts "Preparing to run command to all servers (#{instances.map(&:hostname).join(', ')})"
195
+ command = options[:command_for_run_command] || ask('Which command you want to execute?', limited_to: %w[setup configure install_dependencies update_dependencies execute_recipes])
196
+
197
+ option = options[:options_for_run_command] || ask('Which command you want to execute?', limited_to: %w[current all_in_once one_by_one])
198
198
 
199
- command = ask('Which command you want to execute?', limited_to: %w[setup configure install_dependencies update_dependencies])
199
+ puts "Preparing to run command to all servers (#{instances.map(&:hostname).join(', ')})" if option != 'current'
200
200
 
201
- option = ask('Which command you want to execute?', limited_to: %w[all_in_once one_by_one])
201
+ recipes = options[:recipes] || ask('Recipes list?') if command == 'execute_recipes'
202
202
 
203
203
  base_deployment_params = {
204
204
  stack_id: config.stack_id,
205
- command: { name: command.to_s }
205
+ command: {
206
+ name: command.to_s
207
+ }
206
208
  }
207
209
 
210
+ base_deployment_params[:command][:args] = { recipes: recipes.split(',') } if recipes
211
+
212
+ puts "#{base_deployment_params}"
213
+
208
214
  manifest = { environment: config.deploy_type }
209
215
 
210
216
  case option
217
+ when 'current'
218
+
219
+ instance = retrieve_instance if config.deploy_type == 'staging'
220
+
221
+ if instance.nil?
222
+ puts 'No instance available to execute_recipes'
223
+ exit(0)
224
+ else
225
+ instance_id = instance.instance_id
226
+ end
227
+
228
+ print "Run command #{command} on instance #{instance_id}"
229
+ deployment_params = base_deployment_params.deep_dup
230
+ run_opsworks_command(base_deployment_params, [instance_id])
211
231
  when 'all_in_once'
212
232
  print "Run command #{command} on all instances at once ..."
213
233
  deployment_params = base_deployment_params.deep_dup
@@ -297,9 +317,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
297
317
 
298
318
  def terminate_instance(instance_id)
299
319
  # Remove schedule if time based instance
300
- if config.autoscale_type == 'timer'
301
- config.opsworks.set_time_based_auto_scaling(instance_id: instance_id, auto_scaling_schedule: {})
302
- end
320
+ config.opsworks.set_time_based_auto_scaling(instance_id: instance_id, auto_scaling_schedule: {}) if config.autoscale_type == 'timer'
303
321
 
304
322
  # Get the instance from the id
305
323
  instance = retrieve_instance(instance_id)
@@ -314,9 +332,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
314
332
 
315
333
  # Attempt to shutdown the instance
316
334
  print "Attempting instance #{instance_id} - #{instance.hostname} shutdown ..."
317
- unless instance.status == 'stopped'
318
- config.opsworks.stop_instance(instance_id: instance_id)
319
- end
335
+ config.opsworks.stop_instance(instance_id: instance_id) unless instance.status == 'stopped'
320
336
 
321
337
  manifest = {
322
338
  environment: config.deploy_type,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Stack < Thor
2
4
  include Qops::DeployHelpers
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'quandl/config'
2
4
 
3
5
  module Qops
@@ -26,17 +28,35 @@ module Qops
26
28
  puts Rainbow(message).bg(:black).red
27
29
  when :warning
28
30
  puts Rainbow(message).bg(:black).yellow
31
+ when :good
32
+ puts Rainbow(message).bg(:black).green
29
33
  else
30
34
  puts message
31
35
  end
32
36
  end
33
37
 
34
- def initialize(profile: nil, force_config: false)
38
+ def initialize(profile: nil, force_config: false, verbose: false)
35
39
  @_aws_config = { region: configuration.region }
36
40
  @_aws_config[:profile] = profile unless profile.nil?
41
+
37
42
  @_force_config = force_config
38
- profile.nil? ? opsworks.config.credentials.credentials : @_aws_config[:profile] = profile
39
- puts Rainbow("using aws profile #{profile}").bg(:black).green unless profile.nil?
43
+ @_verbose = verbose
44
+
45
+ if profile.nil?
46
+ opsworks.config.credentials.credentials
47
+ else
48
+ parsed_creds = Aws.shared_config.instance_variable_get('@parsed_credentials')[profile]
49
+ role_credentials = Aws::AssumeRoleCredentials.new(
50
+ role_arn: parsed_creds['role_arn'],
51
+ role_session_name: profile
52
+ )
53
+ @_aws_config[:credentials] = role_credentials
54
+
55
+ puts Rainbow("Using AWS profile #{profile}").bg(:black).green
56
+ end
57
+
58
+ Aws.config.update(@_aws_config)
59
+
40
60
  puts Rainbow('Forcing Qops to read the opsworks parameter strictly from yaml') if force_config
41
61
  %w[deploy_type region app_name].each do |v|
42
62
  fail "Please configure #{v} before continuing." unless option?(v)
@@ -55,12 +75,12 @@ module Qops
55
75
  end
56
76
 
57
77
  def stack_id(options = {})
58
- return configuration.stack_id if @_force_config
78
+ return configuration.stack_id if force_config?
59
79
  stack(options).stack_id
60
80
  end
61
81
 
62
82
  def subnet(options = {})
63
- return configuration.subnet if @_force_config
83
+ return configuration.subnet if force_config?
64
84
  stack(options).default_subnet_id
65
85
  end
66
86
 
@@ -69,9 +89,9 @@ module Qops
69
89
  end
70
90
 
71
91
  def layer_id(_options = {})
72
- return configuration.layer_id if @_force_config
92
+ return configuration.layer_id if force_config?
73
93
  name = configuration.layer_name
74
- puts "searching for #{name}"
94
+ verbose_output("Searching for layer : #{name}")
75
95
  layer = layers.find { |l| l.name.match(/#{name}/i) }
76
96
  layer.layer_id
77
97
  end
@@ -85,7 +105,7 @@ module Qops
85
105
  end
86
106
 
87
107
  def application_id(options = {})
88
- return configuration.application_id if @_force_config
108
+ return configuration.application_id if force_config?
89
109
  apps(options).first.app_id
90
110
  end
91
111
 
@@ -136,13 +156,25 @@ module Qops
136
156
  end
137
157
 
138
158
  def elb
139
- @_elb_client ||= Aws::ElasticLoadBalancing::Client.new(region: 'us-east-1', profile: @_aws_config[:profile])
159
+ @_elb_client ||= Aws::ElasticLoadBalancing::Client.new(**@_aws_config)
140
160
  end
141
161
 
142
162
  def cookbook_json
143
163
  configuration.cookbook_json || 'custom.json'
144
164
  end
145
165
 
166
+ def verbose?
167
+ @_verbose
168
+ end
169
+
170
+ def verbose_output(text)
171
+ self.class.print_with_colour(text, :warning) if verbose?
172
+ end
173
+
174
+ def force_config?
175
+ @_force_config
176
+ end
177
+
146
178
  def option?(key)
147
179
  respond_to?(key.to_sym) || configuration.instance_variable_get(:@table).keys.include?(key.to_sym)
148
180
  end
@@ -172,18 +204,24 @@ module Qops
172
204
  :stack_id
173
205
  else
174
206
  id = identity_from_config
175
- msg = Rainbow("Using opsworks.yml config #{id}: #{configuration.send(id)}")
176
- puts(msg.bg(:black).green)
207
+ self.class.print_with_colour("Using opsworks.yml config #{id}: #{configuration.send(id)}", :good)
177
208
  id
178
209
  end
179
210
  end
180
211
 
181
212
  def search_stack(key, value)
182
- stack = opsworks.describe_stacks.stacks.find { |s| s.send(key) == value }
213
+ verbose_output("Searching for stack : #{value}")
214
+
215
+ stack = opsworks.describe_stacks.stacks.find do |s|
216
+ verbose_output("Found stack: #{s.send(key)}")
217
+ s.send(key) == value
218
+ end
219
+
183
220
  unless stack
184
- puts Rainbow("Could not find stack with #{key} = #{value}").bg(:black).red
221
+ self.class.print_with_colour("Could not find stack with #{key} = #{value}", :error)
185
222
  exit(-1)
186
223
  end
224
+
187
225
  stack
188
226
  end
189
227
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qops::Helpers
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qops
4
- VERSION = '1.6.1'.freeze
4
+ VERSION = '1.8.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Basset
@@ -12,22 +12,28 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-10-20 00:00:00.000000000 Z
15
+ date: 2020-05-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
- name: qthor
18
+ name: activesupport
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.19.1.4
23
+ version: 4.2.1
24
+ - - "<"
25
+ - !ruby/object:Gem::Version
26
+ version: '7.0'
24
27
  type: :runtime
25
28
  prerelease: false
26
29
  version_requirements: !ruby/object:Gem::Requirement
27
30
  requirements:
28
31
  - - ">="
29
32
  - !ruby/object:Gem::Version
30
- version: 0.19.1.4
33
+ version: 4.2.1
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7.0'
31
37
  - !ruby/object:Gem::Dependency
32
38
  name: aws-sdk
33
39
  requirement: !ruby/object:Gem::Requirement
@@ -46,58 +52,58 @@ dependencies:
46
52
  name: quandl-config
47
53
  requirement: !ruby/object:Gem::Requirement
48
54
  requirements:
49
- - - ">="
55
+ - - "~>"
50
56
  - !ruby/object:Gem::Version
51
- version: 0.1.0
57
+ version: 1.0.0
52
58
  type: :runtime
53
59
  prerelease: false
54
60
  version_requirements: !ruby/object:Gem::Requirement
55
61
  requirements:
56
- - - ">="
62
+ - - "~>"
57
63
  - !ruby/object:Gem::Version
58
- version: 0.1.0
64
+ version: 1.0.0
59
65
  - !ruby/object:Gem::Dependency
60
66
  name: quandl-slack
61
67
  requirement: !ruby/object:Gem::Requirement
62
68
  requirements:
63
- - - ">="
69
+ - - "~>"
64
70
  - !ruby/object:Gem::Version
65
- version: '0'
71
+ version: 0.0.2
66
72
  type: :runtime
67
73
  prerelease: false
68
74
  version_requirements: !ruby/object:Gem::Requirement
69
75
  requirements:
70
- - - ">="
76
+ - - "~>"
71
77
  - !ruby/object:Gem::Version
72
- version: '0'
78
+ version: 0.0.2
73
79
  - !ruby/object:Gem::Dependency
74
- name: activesupport
80
+ name: rainbow
75
81
  requirement: !ruby/object:Gem::Requirement
76
82
  requirements:
77
- - - ">="
83
+ - - "~>"
78
84
  - !ruby/object:Gem::Version
79
- version: 4.2.1
85
+ version: 2.0.0
80
86
  type: :runtime
81
87
  prerelease: false
82
88
  version_requirements: !ruby/object:Gem::Requirement
83
89
  requirements:
84
- - - ">="
90
+ - - "~>"
85
91
  - !ruby/object:Gem::Version
86
- version: 4.2.1
92
+ version: 2.0.0
87
93
  - !ruby/object:Gem::Dependency
88
- name: rainbow
94
+ name: thor
89
95
  requirement: !ruby/object:Gem::Requirement
90
96
  requirements:
91
97
  - - "~>"
92
98
  - !ruby/object:Gem::Version
93
- version: 2.0.0
99
+ version: 0.20.0
94
100
  type: :runtime
95
101
  prerelease: false
96
102
  version_requirements: !ruby/object:Gem::Requirement
97
103
  requirements:
98
104
  - - "~>"
99
105
  - !ruby/object:Gem::Version
100
- version: 2.0.0
106
+ version: 0.20.0
101
107
  description: Help to automate opsworks project deployments with single commands.
102
108
  email:
103
109
  - support@quandl.com
@@ -110,6 +116,7 @@ files:
110
116
  - bin/qops
111
117
  - lib/qops.rb
112
118
  - lib/qops/cookbook/cookbook.rb
119
+ - lib/qops/cookbook/helpers.rb
113
120
  - lib/qops/deployment/app.rb
114
121
  - lib/qops/deployment/helpers.rb
115
122
  - lib/qops/deployment/instances.rb
@@ -136,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
143
  - !ruby/object:Gem::Version
137
144
  version: '0'
138
145
  requirements: []
139
- rubyforge_project:
140
- rubygems_version: 2.6.12
146
+ rubygems_version: 3.0.8
141
147
  signing_key:
142
148
  specification_version: 4
143
149
  summary: Helper commands for deployment of opsworks projects.