foreplay 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/foreplay.gemspec +3 -3
- data/lib/foreplay/cli.rb +2 -0
- data/lib/foreplay/engine/remote.rb +21 -6
- data/lib/foreplay/engine/role.rb +3 -4
- data/lib/foreplay/engine/secrets.rb +32 -0
- data/lib/foreplay/engine/server.rb +21 -22
- data/lib/foreplay/engine/steps.yml +13 -6
- data/lib/foreplay/engine.rb +29 -18
- data/lib/foreplay/foreplay.rb +0 -3
- data/lib/foreplay/version.rb +1 -1
- data/lib/foreplay.rb +1 -0
- data/spec/lib/foreplay/engine_spec.rb +5 -5
- metadata +30 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 792102ce293a729754f551ac87b6289ff1c7c81c
|
4
|
+
data.tar.gz: 7d74c817f3aa6b8209b73a0d10cd7202a24a37dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63dea290c9868a255eaefa222a159d8f9bc38bd8e9df82e7834cf33fc50b77f770b894d14b8070398aa186053ae383b73c45238ee04432f408fd3a35cc394185
|
7
|
+
data.tar.gz: 40eddda360ffb3caeb8338e96209213f5276893113968ce9b8488434cda06fbd5905178473f70ca0cceafab0b2f2e1d7be6d53493dcb3e71df5de75f11707cc5
|
data/foreplay.gemspec
CHANGED
@@ -17,9 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features|coverage)\/})
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_runtime_dependency '
|
21
|
-
spec.add_runtime_dependency '
|
22
|
-
spec.add_runtime_dependency '
|
20
|
+
spec.add_runtime_dependency 'foreman', '>= 0.76', '< 1.0'
|
21
|
+
spec.add_runtime_dependency 'ssh-shell', '>= 0.4', '< 1.0'
|
22
|
+
spec.add_runtime_dependency 'activesupport', '>= 3.2', '< 5.0'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.9'
|
25
25
|
spec.add_development_dependency 'rake', '~> 10.4'
|
data/lib/foreplay/cli.rb
CHANGED
@@ -7,6 +7,7 @@ class Foreplay::CLI < Thor
|
|
7
7
|
|
8
8
|
method_option :role, aliases: '-r'
|
9
9
|
method_option :server, aliases: '-s'
|
10
|
+
method_option :config_file, aliases: '-f'
|
10
11
|
|
11
12
|
def deploy(environment)
|
12
13
|
Foreplay::Launcher.start [:deploy, environment, options]
|
@@ -16,6 +17,7 @@ class Foreplay::CLI < Thor
|
|
16
17
|
|
17
18
|
method_option :role, aliases: '-r'
|
18
19
|
method_option :server, aliases: '-s'
|
20
|
+
method_option :config_file, aliases: '-f'
|
19
21
|
|
20
22
|
def check(environment)
|
21
23
|
Foreplay::Launcher.start [:check, environment, options]
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'net/ssh'
|
2
|
+
require 'pp' # debug
|
2
3
|
|
3
4
|
class Foreplay::Engine::Remote
|
4
5
|
include Foreplay
|
@@ -56,15 +57,29 @@ class Foreplay::Engine::Remote
|
|
56
57
|
def check
|
57
58
|
steps.each do |step|
|
58
59
|
puts "#{host}#{INDENT}#{(step['commentary'] || step['command']).yellow}" unless step['silent'] == true
|
59
|
-
|
60
|
-
|
60
|
+
|
61
|
+
if step.key? 'key'
|
62
|
+
i = instructions[step['key']]
|
63
|
+
|
64
|
+
if i.is_a? Hash
|
65
|
+
i.each { |k, v| puts "#{host}#{INDENT * 2}#{k}: #{v}" }
|
66
|
+
else
|
67
|
+
puts "#{host}#{INDENT * 2}#{i}"
|
68
|
+
end
|
69
|
+
else
|
70
|
+
commands = Foreplay::Engine::Step.new(step, instructions).build
|
71
|
+
|
72
|
+
commands.each do |command|
|
73
|
+
puts "#{host}#{INDENT * 2}#{command}" unless step['silent']
|
74
|
+
end
|
75
|
+
end
|
61
76
|
end
|
62
77
|
|
63
78
|
''
|
64
79
|
end
|
65
80
|
|
66
81
|
def user
|
67
|
-
@user = instructions[
|
82
|
+
@user = instructions['user']
|
68
83
|
end
|
69
84
|
|
70
85
|
def host
|
@@ -82,9 +97,9 @@ class Foreplay::Engine::Remote
|
|
82
97
|
def options
|
83
98
|
return @options if @options
|
84
99
|
|
85
|
-
password = instructions[
|
86
|
-
keyfile = instructions[
|
87
|
-
private_key = instructions[
|
100
|
+
password = instructions['password']
|
101
|
+
keyfile = instructions['keyfile']
|
102
|
+
private_key = instructions['private_key']
|
88
103
|
|
89
104
|
keyfile.sub! '~', ENV['HOME'] || '/' unless keyfile.blank? # Remote shell won't expand this for us
|
90
105
|
|
data/lib/foreplay/engine/role.rb
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
class Foreplay::Engine::Role
|
2
2
|
attr_reader :environment, :mode, :instructions, :servers
|
3
|
-
|
4
3
|
def initialize(e, m, i)
|
5
4
|
@environment = e
|
6
5
|
@mode = m
|
7
6
|
@instructions = i
|
8
|
-
@servers = @instructions[
|
7
|
+
@servers = @instructions['servers']
|
9
8
|
|
10
9
|
preposition = mode == :deploy ? 'to' : 'for'
|
11
10
|
|
12
11
|
return if @servers.length == 1
|
13
12
|
|
14
|
-
puts "#{mode.capitalize}ing #{instructions[
|
15
|
-
"for the #{instructions[
|
13
|
+
puts "#{mode.capitalize}ing #{instructions['name'].yellow} #{preposition} #{@servers.join(', ').yellow} "\
|
14
|
+
"for the #{instructions['role'].dup.yellow} role in the #{environment.dup.yellow} environment..."
|
16
15
|
end
|
17
16
|
|
18
17
|
def threads
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Foreplay::Engine::Secrets
|
2
|
+
attr_reader :environment, :secret_locations
|
3
|
+
|
4
|
+
def initialize(e, sl)
|
5
|
+
@environment = e
|
6
|
+
@secret_locations = sl
|
7
|
+
end
|
8
|
+
|
9
|
+
def fetch
|
10
|
+
return unless secret_locations
|
11
|
+
|
12
|
+
secrets = {}
|
13
|
+
|
14
|
+
secret_locations.each do |secret_location|
|
15
|
+
secrets.merge! fetch_from(secret_location)
|
16
|
+
end
|
17
|
+
|
18
|
+
secrets
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch_from(secret_location)
|
22
|
+
return unless secret_location['url']
|
23
|
+
|
24
|
+
headers = secret_location['headers'].map { |k, v| " -H \"#{k}: #{v}\"" }.join
|
25
|
+
command = "curl -k -L#{headers} #{secret_location['url']}"
|
26
|
+
|
27
|
+
secrets_all = YAML.load(`#{command}`)
|
28
|
+
secrets_all[environment]
|
29
|
+
rescue Psych::SyntaxError
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_support/inflector'
|
2
|
-
|
3
1
|
class Foreplay::Engine::Server
|
4
2
|
include Foreplay
|
5
3
|
attr_reader :environment, :mode, :instructions, :server
|
@@ -18,35 +16,36 @@ class Foreplay::Engine::Server
|
|
18
16
|
message += "for the #{role.dup.yellow} role in the #{environment.dup.yellow} environment"
|
19
17
|
puts message
|
20
18
|
|
21
|
-
|
22
|
-
instructions[
|
23
|
-
instructions[
|
24
|
-
instructions[
|
19
|
+
# Contents of .foreman file
|
20
|
+
instructions['foreman']['app'] = current_service
|
21
|
+
instructions['foreman']['port'] = current_port
|
22
|
+
instructions['foreman']['user'] = user
|
23
|
+
instructions['foreman']['log'] = "$HOME/#{path}/#{current_port}/log"
|
25
24
|
|
26
25
|
# Contents of .env file
|
27
|
-
instructions[
|
28
|
-
instructions[
|
29
|
-
instructions[
|
26
|
+
instructions['env']['HOME'] = '$HOME'
|
27
|
+
instructions['env']['SHELL'] = '$SHELL'
|
28
|
+
instructions['env']['PATH'] = '$PATH:`which bundle`'
|
30
29
|
|
31
30
|
Foreplay::Engine::Remote.new(server, steps, instructions).__send__ mode
|
32
31
|
end
|
33
32
|
|
34
33
|
def role
|
35
|
-
@role ||= instructions[
|
34
|
+
@role ||= instructions['role']
|
36
35
|
end
|
37
36
|
|
38
37
|
def user
|
39
|
-
@user ||= instructions[
|
38
|
+
@user ||= instructions['user']
|
40
39
|
end
|
41
40
|
|
42
41
|
def name
|
43
|
-
@name ||= instructions[
|
42
|
+
@name ||= instructions['name']
|
44
43
|
end
|
45
44
|
|
46
45
|
def path
|
47
46
|
return @path if @path
|
48
47
|
|
49
|
-
@path = instructions[
|
48
|
+
@path = instructions['path']
|
50
49
|
@path.gsub! '%u', user
|
51
50
|
@path.gsub! '%a', name
|
52
51
|
@path
|
@@ -69,19 +68,19 @@ class Foreplay::Engine::Server
|
|
69
68
|
end
|
70
69
|
|
71
70
|
def current_port
|
72
|
-
@current_port ||= port_details[
|
71
|
+
@current_port ||= port_details['current_port']
|
73
72
|
end
|
74
73
|
|
75
74
|
def current_service
|
76
|
-
@current_service ||= port_details[
|
75
|
+
@current_service ||= port_details['current_service']
|
77
76
|
end
|
78
77
|
|
79
78
|
def former_port
|
80
|
-
@former_port ||= port_details[
|
79
|
+
@former_port ||= port_details['former_port']
|
81
80
|
end
|
82
81
|
|
83
82
|
def former_service
|
84
|
-
@former_service ||= port_details[
|
83
|
+
@former_service ||= port_details['former_service']
|
85
84
|
end
|
86
85
|
|
87
86
|
def current_port_file
|
@@ -109,15 +108,15 @@ class Foreplay::Engine::Server
|
|
109
108
|
end
|
110
109
|
|
111
110
|
cp = current_port_string.to_i
|
112
|
-
port = instructions[
|
111
|
+
port = instructions['port']
|
113
112
|
ports = [port + 1000, port]
|
114
113
|
cp, fp = cp == port ? ports : ports.reverse
|
115
114
|
|
116
115
|
@port_details = {
|
117
|
-
current_port
|
118
|
-
current_service
|
119
|
-
former_port
|
120
|
-
former_service
|
116
|
+
'current_port' => cp,
|
117
|
+
'current_service' => "#{name}-#{cp}",
|
118
|
+
'former_port' => fp,
|
119
|
+
'former_service' => "#{name}-#{fp}"
|
121
120
|
}
|
122
121
|
end
|
123
122
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
---
|
2
2
|
- command: "echo Foreplay version <%= VERSION %>"
|
3
3
|
commentary: "Foreplay running from <%= `hostname -f` %><%= `which foreman` %>"
|
4
|
-
- command: "mkdir -p <%= path %> && cd <%= path %> && rm -rf <%= current_port %> && git clone -b <%= instructions[
|
5
|
-
commentary: "Cloning <%= instructions[
|
4
|
+
- command: "mkdir -p <%= path %> && cd <%= path %> && rm -rf <%= current_port %> && git clone -b <%= instructions['branch'] || 'master' %> <%= instructions['repository'] %> <%= current_port %>"
|
5
|
+
commentary: "Cloning <%= instructions['branch'] || 'master' %> branch of repository <%= instructions['repository'] %>"
|
6
6
|
- command: "rvm rvmrc trust <%= current_port %>"
|
7
7
|
commentary: 'Trusting the .rvmrc file for the new instance'
|
8
8
|
- command: "rvm rvmrc warning ignore <%= current_port %>"
|
@@ -14,22 +14,29 @@
|
|
14
14
|
commentary: 'If you have a .rvmrc file there may be a delay now while we install a new ruby'
|
15
15
|
- command: 'if [ -f .ruby-version ] ; then rvm install `cat .ruby-version` ; else echo "No .ruby-version file found" ; fi'
|
16
16
|
commentary: 'If you have a .ruby-version file there may be a delay now while we install a new ruby'
|
17
|
-
- key:
|
17
|
+
- key: 'env'
|
18
18
|
delimiter: '='
|
19
19
|
prefix: '.'
|
20
20
|
commentary: 'Building .env'
|
21
|
-
- key:
|
21
|
+
- key: 'foreman'
|
22
22
|
delimiter: ': '
|
23
23
|
prefix: '.'
|
24
24
|
commentary: 'Building .foreman'
|
25
|
-
- key:
|
25
|
+
- key: 'database'
|
26
26
|
delimiter: ': '
|
27
27
|
suffix: '.yml'
|
28
28
|
commentary: 'Building config/database.yml'
|
29
29
|
before: ' '
|
30
30
|
header: "<%= environment %>:"
|
31
31
|
path: 'config/'
|
32
|
-
- key:
|
32
|
+
- key: 'application'
|
33
|
+
delimiter: ': '
|
34
|
+
suffix: '.yml'
|
35
|
+
commentary: 'Building config/application.yml'
|
36
|
+
before: ' '
|
37
|
+
header: "<%= environment %>:"
|
38
|
+
path: 'config/'
|
39
|
+
- key: 'resque'
|
33
40
|
delimiter: ': '
|
34
41
|
suffix: '.yml'
|
35
42
|
commentary: 'Building config/resque.yml'
|
data/lib/foreplay/engine.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'string'
|
3
|
+
require 'active_support/core_ext/object'
|
3
4
|
|
4
5
|
class Foreplay::Engine
|
5
6
|
include Foreplay
|
6
|
-
attr_reader :
|
7
|
+
attr_reader :mode, :environment, :filters
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
DEFAULT_CONFIG_FILE = "#{Dir.getwd}/config/foreplay.yml"
|
10
|
+
DEFAULTS_KEY = 'defaults'
|
10
11
|
|
11
12
|
def initialize(e, f)
|
12
13
|
@environment = e
|
@@ -56,7 +57,7 @@ class Foreplay::Engine
|
|
56
57
|
fail 'supermerge only works if you pass two hashes. '\
|
57
58
|
"You passed a #{hash.class} and a #{other_hash.class}." unless hash.is_a?(Hash) && other_hash.is_a?(Hash)
|
58
59
|
|
59
|
-
new_hash = hash.deep_dup
|
60
|
+
new_hash = hash.deep_dup
|
60
61
|
|
61
62
|
other_hash.each_pair do |k, v|
|
62
63
|
tv = new_hash[k]
|
@@ -76,21 +77,21 @@ class Foreplay::Engine
|
|
76
77
|
private
|
77
78
|
|
78
79
|
def explanatory_text(hsh, key)
|
79
|
-
hsh.key?(key) ? "#{hsh[key].dup.yellow} #{key}" : "all #{key
|
80
|
+
hsh.key?(key) ? "#{hsh[key].dup.yellow} #{key}" : "all #{key}s"
|
80
81
|
end
|
81
82
|
|
82
83
|
def build_instructions(role, additional_instructions)
|
83
|
-
instructions
|
84
|
-
instructions[
|
85
|
-
required_keys
|
84
|
+
instructions = supermerge(defaults, additional_instructions)
|
85
|
+
instructions['role'] = role
|
86
|
+
required_keys = %w(name environment role servers path repository)
|
86
87
|
|
87
88
|
required_keys.each do |key|
|
88
89
|
next if instructions.key? key
|
89
|
-
terminate("Required key #{key} not found in instructions for #{environment} environment.\nCheck #{
|
90
|
+
terminate("Required key #{key} not found in instructions for #{environment} environment.\nCheck #{config_file}")
|
90
91
|
end
|
91
92
|
|
92
93
|
# Apply server filter
|
93
|
-
instructions[
|
94
|
+
instructions['servers'] &= server_filter if server_filter
|
94
95
|
instructions
|
95
96
|
end
|
96
97
|
|
@@ -98,20 +99,30 @@ class Foreplay::Engine
|
|
98
99
|
@server_filter ||= filters['server'].split(',') if filters.key?('server')
|
99
100
|
end
|
100
101
|
|
102
|
+
def config_file
|
103
|
+
@config_file ||= (filters['config_file'] || DEFAULT_CONFIG_FILE)
|
104
|
+
end
|
105
|
+
|
101
106
|
def defaults
|
102
107
|
return @defaults if @defaults
|
103
108
|
|
104
109
|
# Establish defaults
|
105
110
|
# First the default defaults
|
106
111
|
@defaults = {
|
107
|
-
name
|
108
|
-
environment
|
109
|
-
env
|
110
|
-
port
|
112
|
+
'name' => File.basename(Dir.getwd),
|
113
|
+
'environment' => environment,
|
114
|
+
'env' => { 'RAILS_ENV' => environment },
|
115
|
+
'port' => 50_000
|
111
116
|
}
|
112
117
|
|
118
|
+
# Add secret environment variables
|
119
|
+
secrets = Foreplay::Engine::Secrets.new(environment, roles_all['secrets']).fetch || {}
|
120
|
+
@defaults['env'] = @defaults['env'].merge secrets
|
121
|
+
@defaults['application'] = secrets
|
122
|
+
|
113
123
|
@defaults = supermerge(@defaults, roles_all[DEFAULTS_KEY]) if roles_all.key? DEFAULTS_KEY
|
114
124
|
@defaults = supermerge(@defaults, roles[DEFAULTS_KEY]) if roles.key? DEFAULTS_KEY
|
125
|
+
@defaults
|
115
126
|
end
|
116
127
|
|
117
128
|
def roles
|
@@ -121,18 +132,18 @@ class Foreplay::Engine
|
|
121
132
|
def roles_all
|
122
133
|
return @roles_all if @roles_all
|
123
134
|
|
124
|
-
@roles_all = YAML.load(File.read(
|
135
|
+
@roles_all = YAML.load(File.read(config_file))
|
125
136
|
|
126
137
|
# This environment
|
127
138
|
unless @roles_all.key? environment
|
128
|
-
terminate("No deployment configuration defined for #{environment} environment.\nCheck #{
|
139
|
+
terminate("No deployment configuration defined for #{environment} environment.\nCheck #{config_file}")
|
129
140
|
end
|
130
141
|
|
131
142
|
@roles_all
|
132
143
|
rescue Errno::ENOENT
|
133
|
-
terminate "Can't find configuration file #{
|
144
|
+
terminate "Can't find configuration file #{config_file}.\nPlease run foreplay setup or create the file manually."
|
134
145
|
rescue Psych::SyntaxError
|
135
|
-
terminate "I don't understand the configuration file #{
|
146
|
+
terminate "I don't understand the configuration file #{config_file}.\n"\
|
136
147
|
'Please run foreplay setup or edit the file manually.'
|
137
148
|
end
|
138
149
|
end
|
data/lib/foreplay/foreplay.rb
CHANGED
data/lib/foreplay/version.rb
CHANGED
data/lib/foreplay.rb
CHANGED
@@ -10,23 +10,23 @@ describe Foreplay::Engine do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should merge two simple hashes' do
|
13
|
-
expect(engine.supermerge({ a: 'x' }, b: 'y')).to eq(
|
13
|
+
expect(engine.supermerge({ a: 'x' }, b: 'y')).to eq(a: 'x', b: 'y')
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'should merge two hashes both with arrays at the same key' do
|
17
|
-
expect(engine.supermerge({ a: ['x'] }, a: ['y'])).to eq(
|
17
|
+
expect(engine.supermerge({ a: ['x'] }, a: ['y'])).to eq(a: %w(x y))
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should merge an array and a value at the same key' do
|
21
|
-
expect(engine.supermerge({ a: 'x' }, a: ['y'])).to eq(
|
21
|
+
expect(engine.supermerge({ a: 'x' }, a: ['y'])).to eq(a: %w(x y))
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'should replace a value at the same key' do
|
25
|
-
expect(engine.supermerge({ a: 'x' }, a: 'y')).to eq(
|
25
|
+
expect(engine.supermerge({ a: 'x' }, a: 'y')).to eq(a: 'y')
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'should merge two subhashes at the same key' do
|
29
|
-
expect(engine.supermerge({ a: { b: 'x' } }, a: { c: 'y' })).to eq(
|
29
|
+
expect(engine.supermerge({ a: { b: 'x' } }, a: { c: 'y' })).to eq(a: { b: 'x', c: 'y' })
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
metadata
CHANGED
@@ -1,57 +1,75 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreplay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xenapto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: foreman
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0.76'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
29
|
+
version: '0.76'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
34
|
+
name: ssh-shell
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
39
|
+
version: '0.4'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.0'
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
47
|
- - ">="
|
39
48
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
49
|
+
version: '0.4'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '1.0'
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
54
|
+
name: activesupport
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
57
|
- - ">="
|
46
58
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
59
|
+
version: '3.2'
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '5.0'
|
48
63
|
type: :runtime
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
67
|
- - ">="
|
53
68
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
69
|
+
version: '3.2'
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '5.0'
|
55
73
|
- !ruby/object:Gem::Dependency
|
56
74
|
name: bundler
|
57
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,6 +224,7 @@ files:
|
|
206
224
|
- lib/foreplay/engine.rb
|
207
225
|
- lib/foreplay/engine/remote.rb
|
208
226
|
- lib/foreplay/engine/role.rb
|
227
|
+
- lib/foreplay/engine/secrets.rb
|
209
228
|
- lib/foreplay/engine/server.rb
|
210
229
|
- lib/foreplay/engine/step.rb
|
211
230
|
- lib/foreplay/engine/steps.yml
|