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