qops 1.6.1 → 1.8.1
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 +5 -5
- data/README.md +6 -3
- data/lib/qops.rb +3 -0
- data/lib/qops/cookbook/cookbook.rb +15 -15
- data/lib/qops/cookbook/helpers.rb +30 -0
- data/lib/qops/deployment/app.rb +4 -6
- data/lib/qops/deployment/helpers.rb +9 -3
- data/lib/qops/deployment/instances.rb +32 -16
- data/lib/qops/deployment/stacks.rb +2 -0
- data/lib/qops/environment.rb +51 -13
- data/lib/qops/helpers.rb +2 -0
- data/lib/qops/version.rb +1 -1
- metadata +29 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: af7b1d924423be4fadd918150bc5bfc948012cb6db284b7fcb2bc1a9bf153937
|
4
|
+
data.tar.gz: 2ef7d27d6daaba3f569847cb2650d8b861d5690e9c79784b3dc8369d0cd12e1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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:
|
12
|
+
### Q: Can I Override Built-In Templates
|
13
13
|
|
14
|
-
|
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
|
|
data/lib/qops.rb
CHANGED
@@ -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::
|
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
|
data/lib/qops/deployment/app.rb
CHANGED
@@ -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: '
|
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/
|
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
|
-
|
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
|
-
|
199
|
+
puts "Preparing to run command to all servers (#{instances.map(&:hostname).join(', ')})" if option != 'current'
|
200
200
|
|
201
|
-
|
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: {
|
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,
|
data/lib/qops/environment.rb
CHANGED
@@ -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
|
-
|
39
|
-
|
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
|
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
|
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
|
92
|
+
return configuration.layer_id if force_config?
|
73
93
|
name = configuration.layer_name
|
74
|
-
|
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
|
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(
|
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
|
-
|
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
|
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
|
-
|
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
|
|
data/lib/qops/helpers.rb
CHANGED
data/lib/qops/version.rb
CHANGED
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.
|
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:
|
15
|
+
date: 2020-05-29 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
|
-
name:
|
18
|
+
name: activesupport
|
19
19
|
requirement: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
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:
|
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:
|
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:
|
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:
|
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:
|
78
|
+
version: 0.0.2
|
73
79
|
- !ruby/object:Gem::Dependency
|
74
|
-
name:
|
80
|
+
name: rainbow
|
75
81
|
requirement: !ruby/object:Gem::Requirement
|
76
82
|
requirements:
|
77
|
-
- - "
|
83
|
+
- - "~>"
|
78
84
|
- !ruby/object:Gem::Version
|
79
|
-
version:
|
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:
|
92
|
+
version: 2.0.0
|
87
93
|
- !ruby/object:Gem::Dependency
|
88
|
-
name:
|
94
|
+
name: thor
|
89
95
|
requirement: !ruby/object:Gem::Requirement
|
90
96
|
requirements:
|
91
97
|
- - "~>"
|
92
98
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
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:
|
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
|
-
|
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.
|