foreplay 0.9.9 → 0.9.10
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 +4 -4
- data/lib/foreplay/cli.rb +2 -0
- data/lib/foreplay/engine/logger.rb +45 -0
- data/lib/foreplay/engine/port.rb +2 -2
- data/lib/foreplay/engine/remote/check.rb +5 -5
- data/lib/foreplay/engine/remote/step.rb +9 -4
- data/lib/foreplay/engine/remote.rb +4 -4
- data/lib/foreplay/engine/secrets.rb +4 -0
- data/lib/foreplay/engine/step.rb +29 -10
- data/lib/foreplay/engine/steps.yml +2 -2
- data/lib/foreplay/engine.rb +10 -4
- data/lib/foreplay/foreplay.rb +3 -1
- data/lib/foreplay/launcher.rb +3 -3
- data/lib/foreplay/version.rb +1 -1
- data/lib/foreplay.rb +1 -0
- data/spec/lib/foreplay/deploy_spec.rb +0 -2
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 890c4c0d5051375ad322d3de7434723c50f8c547
|
|
4
|
+
data.tar.gz: 012197386d009fae9f671ec6dcfbc5ab1325f041
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9291d32cb558210be93527cd3c04e442f842ee23e6971b2160bf7a8caab8697d79e6c33472bd4d05684061d42f056e74f228bb720578ae8b4149a51be469635a
|
|
7
|
+
data.tar.gz: b333b86d8fc828e3161913b57f0dd1e6a945c08757d45bff0543cb21e20835e2b7f48f0c6816724ec6c76b2bacbc81082fb3c7f9b3afcc15d35e654f5b7e3aad
|
data/lib/foreplay/cli.rb
CHANGED
|
@@ -8,6 +8,7 @@ class Foreplay::CLI < Thor
|
|
|
8
8
|
method_option :role, aliases: '-r'
|
|
9
9
|
method_option :server, aliases: '-s'
|
|
10
10
|
method_option :config_file, aliases: '-f'
|
|
11
|
+
method_option :verbose, aliases: '-v'
|
|
11
12
|
|
|
12
13
|
def deploy(environment)
|
|
13
14
|
Foreplay::Launcher.start [:deploy, environment, options]
|
|
@@ -18,6 +19,7 @@ class Foreplay::CLI < Thor
|
|
|
18
19
|
method_option :role, aliases: '-r'
|
|
19
20
|
method_option :server, aliases: '-s'
|
|
20
21
|
method_option :config_file, aliases: '-f'
|
|
22
|
+
method_option :verbose, aliases: '-v'
|
|
21
23
|
|
|
22
24
|
def check(environment)
|
|
23
25
|
Foreplay::Launcher.start [:check, environment, options]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class Foreplay::Engine::Logger
|
|
2
|
+
INDENT = 4
|
|
3
|
+
MARGIN = 24
|
|
4
|
+
|
|
5
|
+
attr_reader :message, :options
|
|
6
|
+
|
|
7
|
+
def initialize(m, o = {})
|
|
8
|
+
@message = m
|
|
9
|
+
@options = o
|
|
10
|
+
|
|
11
|
+
output
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def output
|
|
15
|
+
puts formatted_message unless silent?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def formatted_message
|
|
19
|
+
@formatted_message ||= header + message.gsub(/\s+\z/, '').gsub(/(\r\n*)/, "\\1#{margin}")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def header
|
|
23
|
+
@header ||= (margin_format % header_content[0, margin_width - 1]).white
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def header_content
|
|
27
|
+
@header_content ||= (options[:host] || '')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def margin
|
|
31
|
+
@margin ||= margin_format % ''
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def silent?
|
|
35
|
+
@silent ||= (options[:silent] == true) || message.blank?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def margin_width
|
|
39
|
+
@margin_width ||= MARGIN + INDENT * (options[:indent] || 0)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def margin_format
|
|
43
|
+
@margin_format ||= "%-#{margin_width}s"
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/foreplay/engine/port.rb
CHANGED
|
@@ -46,9 +46,9 @@ module Foreplay::Engine::Port
|
|
|
46
46
|
current_port_string = Foreplay::Engine::Remote.new(server, port_steps, instructions).__send__(mode).strip!
|
|
47
47
|
|
|
48
48
|
if current_port_string.blank?
|
|
49
|
-
|
|
49
|
+
log 'No instance is currently deployed', host: host
|
|
50
50
|
else
|
|
51
|
-
|
|
51
|
+
log "Current instance is using port #{current_port_string}", host: host
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
cp = current_port_string.to_i
|
|
@@ -10,7 +10,7 @@ class Foreplay::Engine::Remote::Check
|
|
|
10
10
|
|
|
11
11
|
def perform
|
|
12
12
|
steps.each do |step|
|
|
13
|
-
|
|
13
|
+
log "#{(step['commentary'] || step['command']).yellow}", host: host, silent: step['silent']
|
|
14
14
|
|
|
15
15
|
if step.key? 'key'
|
|
16
16
|
list_file_contents step['key']
|
|
@@ -26,17 +26,17 @@ class Foreplay::Engine::Remote::Check
|
|
|
26
26
|
i = instructions[id]
|
|
27
27
|
|
|
28
28
|
if i.is_a? Hash
|
|
29
|
-
i.each { |k, v|
|
|
29
|
+
i.each { |k, v| log "#{k}: #{v}", host: host, indent: 1 }
|
|
30
30
|
else
|
|
31
|
-
|
|
31
|
+
log i, host: host, indent: 1
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def list_commands(step)
|
|
36
|
-
commands = Foreplay::Engine::Step.new(step, instructions).
|
|
36
|
+
commands = Foreplay::Engine::Step.new(host, step, instructions).commands
|
|
37
37
|
|
|
38
38
|
commands.each do |command|
|
|
39
|
-
|
|
39
|
+
log command, host: host, silent: step['silent']
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
end
|
|
@@ -10,21 +10,26 @@ class Foreplay::Engine::Remote::Step
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def execute
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
s = Foreplay::Engine::Step.new(host, step, instructions)
|
|
14
|
+
s.announce
|
|
15
|
+
output s.commands.map { |command| execute_command(command) }.join
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def execute_command(command)
|
|
18
19
|
o = ''
|
|
19
20
|
process = shell.execute command
|
|
20
|
-
process.on_output { |_, po| o
|
|
21
|
+
process.on_output { |_, po| o += po }
|
|
21
22
|
shell.wait!
|
|
22
23
|
terminate(o) unless step['ignore_error'] == true || process.exit_status == 0
|
|
23
24
|
o
|
|
24
25
|
end
|
|
25
26
|
|
|
27
|
+
def silent
|
|
28
|
+
@silent ||= instructions['verbose'] ? false : step['silent']
|
|
29
|
+
end
|
|
30
|
+
|
|
26
31
|
def output(o)
|
|
27
|
-
|
|
32
|
+
log o, host: host, silent: silent, indent: 1
|
|
28
33
|
o
|
|
29
34
|
end
|
|
30
35
|
end
|
|
@@ -14,12 +14,12 @@ class Foreplay::Engine::Remote
|
|
|
14
14
|
def deploy
|
|
15
15
|
output = ''
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
log "Connecting to #{host} on port #{port}", host: host
|
|
18
18
|
|
|
19
19
|
# SSH connection
|
|
20
20
|
session = start_session(host, user, options)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
log "Successfully connected to #{host} on port #{port}", host: host
|
|
23
23
|
|
|
24
24
|
session.shell do |sh|
|
|
25
25
|
steps.each { |step| output += Foreplay::Engine::Remote::Step.new(host, sh, step, instructions).execute }
|
|
@@ -80,13 +80,13 @@ class Foreplay::Engine::Remote
|
|
|
80
80
|
) if keyfile.blank?
|
|
81
81
|
|
|
82
82
|
# Get the key from the key file
|
|
83
|
-
|
|
83
|
+
log "Using private key from #{keyfile}"
|
|
84
84
|
File.read keyfile
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
def start_session(host, user, options)
|
|
88
88
|
Net::SSH.start(host, user, options)
|
|
89
89
|
rescue SocketError => e
|
|
90
|
-
terminate "
|
|
90
|
+
terminate "There was a problem starting an ssh session on #{host}:\n#{e.message}"
|
|
91
91
|
end
|
|
92
92
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'pp' # debug
|
|
2
|
+
|
|
1
3
|
class Foreplay::Engine::Secrets
|
|
2
4
|
attr_reader :environment, :secret_locations
|
|
3
5
|
|
|
@@ -15,6 +17,7 @@ class Foreplay::Engine::Secrets
|
|
|
15
17
|
secrets.merge! fetch_from(secret_location) || {}
|
|
16
18
|
end
|
|
17
19
|
|
|
20
|
+
pp secrets # debug
|
|
18
21
|
secrets
|
|
19
22
|
end
|
|
20
23
|
|
|
@@ -24,6 +27,7 @@ class Foreplay::Engine::Secrets
|
|
|
24
27
|
headers = secret_location['headers']
|
|
25
28
|
header_string = headers.map { |k, v| " -H \"#{k}: #{v}\"" }.join if headers.is_a? Hash
|
|
26
29
|
command = "curl -k -L#{header_string} #{url}".fake_erb
|
|
30
|
+
puts command.magenta # debug
|
|
27
31
|
secrets_all = YAML.load(`#{command}`)
|
|
28
32
|
secrets = secrets_all[environment]
|
|
29
33
|
|
data/lib/foreplay/engine/step.rb
CHANGED
|
@@ -1,24 +1,32 @@
|
|
|
1
1
|
class Foreplay::Engine::Step
|
|
2
|
-
|
|
2
|
+
include Foreplay
|
|
3
|
+
attr_reader :host, :step, :instructions
|
|
3
4
|
|
|
4
|
-
def initialize(s, i)
|
|
5
|
+
def initialize(h, s, i)
|
|
6
|
+
@host = h
|
|
5
7
|
@step = s
|
|
6
8
|
@instructions = i
|
|
7
9
|
end
|
|
8
10
|
|
|
9
|
-
def
|
|
11
|
+
def commands
|
|
12
|
+
return @commands if @commands
|
|
13
|
+
|
|
10
14
|
# Each step can be (1) a command or (2) a series of values to add to a file
|
|
11
15
|
if step.key?('key')
|
|
12
|
-
instructions.key?(step['key'])
|
|
16
|
+
if instructions.key?(step['key'])
|
|
17
|
+
build_commands
|
|
18
|
+
else
|
|
19
|
+
@commands = []
|
|
20
|
+
end
|
|
13
21
|
else
|
|
14
22
|
# ...or just execute the command specified
|
|
15
|
-
[
|
|
23
|
+
@commands = [command]
|
|
16
24
|
end
|
|
17
|
-
end
|
|
18
25
|
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
@commands
|
|
27
|
+
end
|
|
21
28
|
|
|
29
|
+
def build_commands
|
|
22
30
|
step['silent'] = true
|
|
23
31
|
|
|
24
32
|
if header?
|
|
@@ -33,8 +41,6 @@ class Foreplay::Engine::Step
|
|
|
33
41
|
else
|
|
34
42
|
build_commands_from_string
|
|
35
43
|
end
|
|
36
|
-
|
|
37
|
-
@commands
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
def build_commands_from_hash
|
|
@@ -56,6 +62,10 @@ class Foreplay::Engine::Step
|
|
|
56
62
|
end
|
|
57
63
|
end
|
|
58
64
|
|
|
65
|
+
def command
|
|
66
|
+
@command ||= step['command']
|
|
67
|
+
end
|
|
68
|
+
|
|
59
69
|
def filename
|
|
60
70
|
@filename ||= "#{path}#{prefix}#{key}#{suffix}"
|
|
61
71
|
end
|
|
@@ -95,4 +105,13 @@ class Foreplay::Engine::Step
|
|
|
95
105
|
def header?
|
|
96
106
|
header.present?
|
|
97
107
|
end
|
|
108
|
+
|
|
109
|
+
def silent
|
|
110
|
+
@silent ||= step['silent']
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def announce
|
|
114
|
+
log "#{(step['commentary'] || command).yellow}", host: host, silent: silent
|
|
115
|
+
log command.cyan, host: host, silent: silent if instructions['verbose'] && step['commentary'] && command
|
|
116
|
+
end
|
|
98
117
|
end
|
|
@@ -42,12 +42,12 @@
|
|
|
42
42
|
commentary: 'Building config/resque.yml'
|
|
43
43
|
before: environment
|
|
44
44
|
path: 'config/'
|
|
45
|
-
- command: 'if [ -d ../cache/vendor/bundle/bundle ] ; then rm -rf ../cache/vendor/bundle/bundle ; else echo No evidence of legacy copy bug ; fi'
|
|
46
|
-
commentary: 'Fixing legacy copy bug'
|
|
47
45
|
- command: 'if [ -d ../cache/vendor/bundle ] ; then rsync -aW --no-compress --delete --info=STATS1 ../cache/vendor/bundle/ vendor/bundle ; else echo No bundle to restore ; fi'
|
|
48
46
|
commentary: 'Attempting to restore bundle from cache'
|
|
49
47
|
- command: 'sudo ln -f `which bundle` /usr/bin/bundle || echo Using default version of bundle'
|
|
50
48
|
commentary: 'Setting the current version of bundle to be the default'
|
|
49
|
+
- command: "gem install bundler -v '> 1.8'"
|
|
50
|
+
commentary: 'Updating the bundler version'
|
|
51
51
|
- command: 'bundle install --deployment --clean --jobs 2 --without development test'
|
|
52
52
|
commentary: 'Using bundler to install the required gems in deployment mode'
|
|
53
53
|
- command: 'mkdir -p ../cache/vendor && rsync -aW --no-compress --delete --info=STATS1 vendor/bundle/ ../cache/vendor/bundle'
|
data/lib/foreplay/engine.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'yaml'
|
|
2
2
|
require 'string'
|
|
3
3
|
require 'hash'
|
|
4
|
+
require 'pp' # debug
|
|
4
5
|
|
|
5
6
|
class Foreplay::Engine
|
|
6
7
|
include Foreplay
|
|
@@ -51,9 +52,10 @@ class Foreplay::Engine
|
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
def build_instructions(role, additional_instructions)
|
|
54
|
-
instructions
|
|
55
|
-
instructions['role']
|
|
56
|
-
|
|
55
|
+
instructions = defaults.supermerge(additional_instructions)
|
|
56
|
+
instructions['role'] = role
|
|
57
|
+
instructions['verbose'] = verbose
|
|
58
|
+
required_keys = %w(name environment role servers path repository)
|
|
57
59
|
|
|
58
60
|
required_keys.each do |key|
|
|
59
61
|
next if instructions.key? key
|
|
@@ -87,7 +89,7 @@ class Foreplay::Engine
|
|
|
87
89
|
|
|
88
90
|
@defaults['env'].merge! secrets
|
|
89
91
|
@defaults['application'] = secrets
|
|
90
|
-
|
|
92
|
+
pp @defaults # debug
|
|
91
93
|
@defaults = @defaults.supermerge(roles_all[DEFAULTS_KEY]) if roles_all.key? DEFAULTS_KEY
|
|
92
94
|
@defaults = @defaults.supermerge(roles[DEFAULTS_KEY]) if roles.key? DEFAULTS_KEY
|
|
93
95
|
@defaults
|
|
@@ -98,6 +100,10 @@ class Foreplay::Engine
|
|
|
98
100
|
@secrets ||= Foreplay::Engine::Secrets.new(environment, roles_all['secrets']).fetch || {}
|
|
99
101
|
end
|
|
100
102
|
|
|
103
|
+
def verbose
|
|
104
|
+
@verbose ||= filters.key?('verbose')
|
|
105
|
+
end
|
|
106
|
+
|
|
101
107
|
def roles
|
|
102
108
|
@roles ||= roles_all[environment]
|
|
103
109
|
end
|
data/lib/foreplay/foreplay.rb
CHANGED
data/lib/foreplay/launcher.rb
CHANGED
|
@@ -3,9 +3,9 @@ require 'thor/group'
|
|
|
3
3
|
class Foreplay::Launcher < Thor::Group
|
|
4
4
|
include Thor::Actions
|
|
5
5
|
|
|
6
|
-
argument :mode, type: :string,
|
|
7
|
-
argument :environment, type: :string,
|
|
8
|
-
argument :filters, type: :hash,
|
|
6
|
+
argument :mode, type: :string, required: true
|
|
7
|
+
argument :environment, type: :string, required: true
|
|
8
|
+
argument :filters, type: :hash, required: false
|
|
9
9
|
|
|
10
10
|
def parse
|
|
11
11
|
Foreplay::Engine.new(environment, filters).__send__ mode
|
data/lib/foreplay/version.rb
CHANGED
data/lib/foreplay.rb
CHANGED
|
@@ -5,6 +5,7 @@ require 'foreplay/engine'
|
|
|
5
5
|
require 'foreplay/engine/remote'
|
|
6
6
|
require 'foreplay/engine/remote/check'
|
|
7
7
|
require 'foreplay/engine/remote/step'
|
|
8
|
+
require 'foreplay/engine/logger'
|
|
8
9
|
require 'foreplay/engine/port'
|
|
9
10
|
require 'foreplay/engine/role'
|
|
10
11
|
require 'foreplay/engine/secrets'
|
|
@@ -150,8 +150,6 @@ describe Foreplay::Launcher do
|
|
|
150
150
|
'echo " host: TODO Put here the database host name" >> config/database.yml',
|
|
151
151
|
'echo " username: TODO Put here the database user" >> config/database.yml',
|
|
152
152
|
'echo " password: TODO Put here the database user\'s password" >> config/database.yml',
|
|
153
|
-
'if [ -d ../cache/vendor/bundle/bundle ] ; then rm -rf ../cache/vendor/bundle/bundle'\
|
|
154
|
-
' ; else echo No evidence of legacy copy bug ; fi',
|
|
155
153
|
'if [ -d ../cache/vendor/bundle ] ; then '\
|
|
156
154
|
'rsync -aW --no-compress --delete --info=STATS1 ../cache/vendor/bundle/ vendor/bundle'\
|
|
157
155
|
' ; else echo No bundle to restore ; fi',
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreplay
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Xenapto
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-05-
|
|
11
|
+
date: 2015-05-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: foreman
|
|
@@ -222,6 +222,7 @@ files:
|
|
|
222
222
|
- lib/foreplay.rb
|
|
223
223
|
- lib/foreplay/cli.rb
|
|
224
224
|
- lib/foreplay/engine.rb
|
|
225
|
+
- lib/foreplay/engine/logger.rb
|
|
225
226
|
- lib/foreplay/engine/port.rb
|
|
226
227
|
- lib/foreplay/engine/remote.rb
|
|
227
228
|
- lib/foreplay/engine/remote/check.rb
|