harrison 0.3.0 → 0.4.0.b1
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 +7 -0
- data/harrison.gemspec +6 -5
- data/lib/harrison.rb +5 -0
- data/lib/harrison/base.rb +4 -6
- data/lib/harrison/config.rb +10 -3
- data/lib/harrison/deploy.rb +19 -1
- data/lib/harrison/deploy/phase.rb +19 -1
- data/lib/harrison/version.rb +1 -1
- data/spec/unit/harrison/deploy_spec.rb +5 -5
- data/spec/unit/harrison/package_spec.rb +5 -3
- metadata +50 -59
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5a7a1e571b53bc0460cdfafd012a454a12a7abd7
|
4
|
+
data.tar.gz: 5b3899d0745b0a0cf49a7cb8babc02b88288cc4a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 62ab8175825b9102916f4a59cfc46ee8c22faf787ed66e753b1e8df31261b8c98e0267058ddab68ea6010fee6c333546e345f340733ff6ee9d51b94cf9dbbd9a
|
7
|
+
data.tar.gz: fee23a513d98d677e458448e2491e26086cd0199667fce84ca6240f1461f7110349ee0758badb7de9b83eb78bd061cd6b5b73e016aab664313431346da0c349b
|
data/harrison.gemspec
CHANGED
@@ -19,15 +19,16 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.required_ruby_version = '>= 1.9.3'
|
21
21
|
|
22
|
-
spec.add_runtime_dependency "trollop"
|
23
|
-
spec.add_runtime_dependency "net-ssh"
|
24
|
-
spec.add_runtime_dependency "net-scp"
|
22
|
+
spec.add_runtime_dependency "trollop", "~> 2.1.2"
|
23
|
+
spec.add_runtime_dependency "net-ssh", "~> 2.9.1"
|
24
|
+
spec.add_runtime_dependency "net-scp", "~> 1.2.1"
|
25
|
+
spec.add_runtime_dependency "highline", "~> 1.7.8"
|
25
26
|
|
26
27
|
spec.add_development_dependency "bundler", "~> 1.6"
|
27
28
|
spec.add_development_dependency "rake"
|
28
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
30
|
spec.add_development_dependency "simplecov"
|
30
|
-
spec.add_development_dependency "debugger" if RUBY_VERSION < "2.0.0"
|
31
|
-
spec.add_development_dependency "byebug" if RUBY_VERSION >= "2.0.0"
|
31
|
+
spec.add_development_dependency "pry-debugger" if RUBY_VERSION < "2.0.0"
|
32
|
+
spec.add_development_dependency "pry-byebug" if RUBY_VERSION >= "2.0.0"
|
32
33
|
spec.add_development_dependency "sourcify"
|
33
34
|
end
|
data/lib/harrison.rb
CHANGED
data/lib/harrison/base.rb
CHANGED
@@ -23,12 +23,10 @@ module Harrison
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
Harrison.config.send(
|
30
|
-
else
|
31
|
-
super
|
26
|
+
# Add config getter methods from Harrison.config to this class.
|
27
|
+
Harrison::Config.config_keys.each do |key|
|
28
|
+
define_method(key) do
|
29
|
+
Harrison.config.send(key)
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
data/lib/harrison/config.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
module Harrison
|
2
2
|
class Config
|
3
|
-
attr_accessor :project
|
4
|
-
attr_accessor :git_src
|
5
|
-
|
6
3
|
def initialize(opts={})
|
4
|
+
self.class.config_keys.each do |key|
|
5
|
+
self.class.send(:attr_accessor, key)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.config_keys
|
10
|
+
[
|
11
|
+
:project,
|
12
|
+
:git_src,
|
13
|
+
]
|
7
14
|
end
|
8
15
|
end
|
9
16
|
end
|
data/lib/harrison/deploy.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'highline'
|
2
|
+
|
1
3
|
module Harrison
|
2
4
|
class Deploy < Base
|
3
5
|
attr_accessor :artifact
|
@@ -17,12 +19,14 @@ module Harrison
|
|
17
19
|
self.class.option_helper(:base_dir)
|
18
20
|
self.class.option_helper(:deploy_via)
|
19
21
|
self.class.option_helper(:keep)
|
22
|
+
self.class.option_helper(:confirm)
|
20
23
|
|
21
24
|
# Command line opts for this action. Will be merged with common opts.
|
22
25
|
arg_opts = [
|
23
26
|
[ :hosts, "List of remote hosts to deploy to. Can also be specified in Harrisonfile.", :type => :strings ],
|
24
27
|
[ :env, "Environment to deploy to. This can be examined in your Harrisonfile to calculate target hosts.", :type => :string ],
|
25
28
|
[ :keep, "Number of recent deploys to keep after a successful deploy. (Including the most recent deploy.) Defaults to keeping all deploys forever.", :type => :integer ],
|
29
|
+
[ :confirm, "Whether to interactively confirm the list of target hosts for deployment.", :type => :flag, :default => true ],
|
26
30
|
]
|
27
31
|
|
28
32
|
super(arg_opts, opts)
|
@@ -59,7 +63,8 @@ module Harrison
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def update_current_symlink
|
62
|
-
|
66
|
+
# Conditional assignment here makes this idempotent.
|
67
|
+
@_old_current ||= self.remote_exec("if [ -L #{current_symlink} ]; then readlink -vn #{current_symlink}; fi")
|
63
68
|
@_old_current = nil if @_old_current.empty?
|
64
69
|
|
65
70
|
# Symlink current to new deploy.
|
@@ -77,11 +82,24 @@ module Harrison
|
|
77
82
|
# Override Harrisonfile hosts if it was passed on argv.
|
78
83
|
self.hosts = @_argv_hosts if @_argv_hosts
|
79
84
|
|
85
|
+
if self.hosts.respond_to?(:call)
|
86
|
+
resolved_hosts = self.hosts.call(self)
|
87
|
+
self.hosts = resolved_hosts
|
88
|
+
end
|
89
|
+
|
80
90
|
# Require at least one host.
|
81
91
|
if !self.hosts || self.hosts.empty?
|
82
92
|
abort("ERROR: You must specify one or more hosts to deploy/rollback on, either in your Harrisonfile or via --hosts.")
|
83
93
|
end
|
84
94
|
|
95
|
+
if self.confirm
|
96
|
+
self.hosts.each { |h| puts " - #{h}" }
|
97
|
+
|
98
|
+
exit unless HighLine.new.agree("\nProceed with above-listed hosts?")
|
99
|
+
|
100
|
+
puts ""
|
101
|
+
end
|
102
|
+
|
85
103
|
# Default to just built in deployment phases.
|
86
104
|
self.phases ||= [ :upload, :extract, :link, :cleanup ]
|
87
105
|
|
@@ -7,6 +7,10 @@ module Harrison
|
|
7
7
|
|
8
8
|
@conditions = Array.new
|
9
9
|
|
10
|
+
@limit = nil
|
11
|
+
@_run_count = 0
|
12
|
+
@_fail_count = 0
|
13
|
+
|
10
14
|
yield self if block_given?
|
11
15
|
end
|
12
16
|
|
@@ -14,7 +18,12 @@ module Harrison
|
|
14
18
|
@conditions << block
|
15
19
|
end
|
16
20
|
|
17
|
-
#
|
21
|
+
# Limit the number of times this phase is invoked per deployment.
|
22
|
+
def set_limit(n)
|
23
|
+
@limit = n
|
24
|
+
end
|
25
|
+
|
26
|
+
# Check if all conditions eval to true for this context.
|
18
27
|
def matches_context?(context)
|
19
28
|
@conditions.all? { |cblock| cblock.call(context) }
|
20
29
|
end
|
@@ -29,21 +38,30 @@ module Harrison
|
|
29
38
|
|
30
39
|
# These should only be invoked by the deploy action.
|
31
40
|
def _run(context)
|
41
|
+
# Ensure limit has not been met.
|
42
|
+
return unless @limit.nil? || @_run_count < @limit
|
43
|
+
|
44
|
+
# Ensure all conditions eval to true for this context.
|
32
45
|
return unless matches_context?(context)
|
33
46
|
|
34
47
|
if @run_block
|
35
48
|
puts "[#{context.host}] Executing \"#{self.name}\"..."
|
36
49
|
@run_block.call(context)
|
50
|
+
@_run_count += 1
|
37
51
|
end
|
38
52
|
end
|
39
53
|
|
40
54
|
def _fail(context)
|
55
|
+
# Ensure limit has not been met.
|
56
|
+
return unless @limit.nil? || @_fail_count < @limit
|
57
|
+
|
41
58
|
# Ensure all conditions eval to true for this context.
|
42
59
|
return unless matches_context?(context)
|
43
60
|
|
44
61
|
if @fail_block
|
45
62
|
puts "[#{context.host}] Reverting \"#{self.name}\"..."
|
46
63
|
@fail_block.call(context)
|
64
|
+
@_fail_count += 1
|
47
65
|
end
|
48
66
|
|
49
67
|
end
|
data/lib/harrison/version.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Harrison::Deploy do
|
4
|
+
before(:all) do
|
5
|
+
Harrison.class_variable_set(:@@config, Harrison::Config.new)
|
6
|
+
Harrison.config.project = 'test_project'
|
7
|
+
end
|
8
|
+
|
4
9
|
let(:instance) do
|
5
10
|
Harrison::Deploy.new.tap do |d|
|
6
11
|
d.hosts = [ 'hf_host' ]
|
@@ -71,7 +76,6 @@ describe Harrison::Deploy do
|
|
71
76
|
describe '#remote_exec' do
|
72
77
|
before(:each) do
|
73
78
|
instance.base_dir = '/opt'
|
74
|
-
instance.project = 'test_project'
|
75
79
|
|
76
80
|
@mock_ssh = double(:ssh)
|
77
81
|
expect(instance).to receive(:ssh).and_return(@mock_ssh)
|
@@ -157,7 +161,6 @@ describe Harrison::Deploy do
|
|
157
161
|
describe '#run' do
|
158
162
|
before(:each) do
|
159
163
|
instance.artifact = 'test_artifact.tar.gz'
|
160
|
-
instance.project = 'test_project'
|
161
164
|
|
162
165
|
@mock_ssh = double(:ssh, host: 'test_host1', exec: '', upload: true, download: true)
|
163
166
|
allow(instance).to receive(:ssh).and_return(@mock_ssh)
|
@@ -254,8 +257,6 @@ describe Harrison::Deploy do
|
|
254
257
|
before(:each) do
|
255
258
|
instance.rollback = true
|
256
259
|
|
257
|
-
instance.project = 'test_project'
|
258
|
-
|
259
260
|
@mock_ssh = double(:ssh, host: 'test_host1', exec: '', upload: true, download: true)
|
260
261
|
allow(instance).to receive(:ssh).and_return(@mock_ssh)
|
261
262
|
end
|
@@ -389,7 +390,6 @@ describe Harrison::Deploy do
|
|
389
390
|
describe '#remote_project_dir' do
|
390
391
|
it 'should combine base_dir and project name' do
|
391
392
|
instance.base_dir = '/test_base_dir'
|
392
|
-
instance.project = 'test_project'
|
393
393
|
|
394
394
|
expect(instance.send(:remote_project_dir)).to include('/test_base_dir', 'test_project')
|
395
395
|
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Harrison::Package do
|
4
|
+
before(:all) do
|
5
|
+
Harrison.class_variable_set(:@@config, Harrison::Config.new)
|
6
|
+
Harrison.config.project = 'test_project'
|
7
|
+
end
|
8
|
+
|
4
9
|
let(:instance) do
|
5
10
|
Harrison::Package.new.tap do |p|
|
6
|
-
p.project = 'test_project'
|
7
11
|
p.host = 'hf_host'
|
8
12
|
p.commit = 'HEAD'
|
9
13
|
end
|
@@ -43,7 +47,6 @@ describe Harrison::Package do
|
|
43
47
|
|
44
48
|
it 'should prepend remote build dir onto passed command' do
|
45
49
|
instance.remote_dir = '~/.harrison'
|
46
|
-
instance.project = 'test_project'
|
47
50
|
|
48
51
|
expect(@mock_ssh).to receive(:exec).with("cd ~/.harrison/test_project/package && test_command").and_return('')
|
49
52
|
|
@@ -89,7 +92,6 @@ describe Harrison::Package do
|
|
89
92
|
describe '#remote_project_dir' do
|
90
93
|
it 'should combine remote dir and project name' do
|
91
94
|
instance.remote_dir = '~/.harrison'
|
92
|
-
instance.project = 'test_project'
|
93
95
|
|
94
96
|
expect(instance.send(:remote_project_dir)).to include('~/.harrison', 'test_project')
|
95
97
|
end
|
metadata
CHANGED
@@ -1,158 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harrison
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.0.b1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jesse Scott
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-07-12 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: trollop
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 2.1.2
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: 2.1.2
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: net-ssh
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: 2.9.1
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: 2.9.1
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: net-scp
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
47
|
+
version: 1.2.1
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
54
|
+
version: 1.2.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: highline
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.7.8
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.7.8
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: bundler
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- - ~>
|
73
|
+
- - "~>"
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: '1.6'
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- - ~>
|
80
|
+
- - "~>"
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '1.6'
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: rake
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - ">="
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: rspec
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
|
-
- - ~>
|
101
|
+
- - "~>"
|
100
102
|
- !ruby/object:Gem::Version
|
101
103
|
version: '3.0'
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
|
-
- - ~>
|
108
|
+
- - "~>"
|
108
109
|
- !ruby/object:Gem::Version
|
109
110
|
version: '3.0'
|
110
111
|
- !ruby/object:Gem::Dependency
|
111
112
|
name: simplecov
|
112
113
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
121
|
requirements:
|
123
|
-
- -
|
122
|
+
- - ">="
|
124
123
|
- !ruby/object:Gem::Version
|
125
124
|
version: '0'
|
126
125
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
126
|
+
name: pry-byebug
|
128
127
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
128
|
requirements:
|
131
|
-
- -
|
129
|
+
- - ">="
|
132
130
|
- !ruby/object:Gem::Version
|
133
131
|
version: '0'
|
134
132
|
type: :development
|
135
133
|
prerelease: false
|
136
134
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
135
|
requirements:
|
139
|
-
- -
|
136
|
+
- - ">="
|
140
137
|
- !ruby/object:Gem::Version
|
141
138
|
version: '0'
|
142
139
|
- !ruby/object:Gem::Dependency
|
143
140
|
name: sourcify
|
144
141
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
142
|
requirements:
|
147
|
-
- -
|
143
|
+
- - ">="
|
148
144
|
- !ruby/object:Gem::Version
|
149
145
|
version: '0'
|
150
146
|
type: :development
|
151
147
|
prerelease: false
|
152
148
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
149
|
requirements:
|
155
|
-
- -
|
150
|
+
- - ">="
|
156
151
|
- !ruby/object:Gem::Version
|
157
152
|
version: '0'
|
158
153
|
description:
|
@@ -163,9 +158,9 @@ executables:
|
|
163
158
|
extensions: []
|
164
159
|
extra_rdoc_files: []
|
165
160
|
files:
|
166
|
-
- .gitignore
|
167
|
-
- .rspec
|
168
|
-
- .travis.yml
|
161
|
+
- ".gitignore"
|
162
|
+
- ".rspec"
|
163
|
+
- ".travis.yml"
|
169
164
|
- CHANGELOG
|
170
165
|
- Gemfile
|
171
166
|
- IDEAS
|
@@ -195,30 +190,26 @@ files:
|
|
195
190
|
homepage: https://github.com/puppetlabs/harrison
|
196
191
|
licenses:
|
197
192
|
- Apache 2.0
|
193
|
+
metadata: {}
|
198
194
|
post_install_message:
|
199
195
|
rdoc_options: []
|
200
196
|
require_paths:
|
201
197
|
- lib
|
202
198
|
required_ruby_version: !ruby/object:Gem::Requirement
|
203
|
-
none: false
|
204
199
|
requirements:
|
205
|
-
- -
|
200
|
+
- - ">="
|
206
201
|
- !ruby/object:Gem::Version
|
207
202
|
version: 1.9.3
|
208
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
204
|
requirements:
|
211
|
-
- -
|
205
|
+
- - ">"
|
212
206
|
- !ruby/object:Gem::Version
|
213
|
-
version:
|
214
|
-
segments:
|
215
|
-
- 0
|
216
|
-
hash: 2429299049933717858
|
207
|
+
version: 1.3.1
|
217
208
|
requirements: []
|
218
209
|
rubyforge_project:
|
219
|
-
rubygems_version:
|
210
|
+
rubygems_version: 2.4.5.1
|
220
211
|
signing_key:
|
221
|
-
specification_version:
|
212
|
+
specification_version: 4
|
222
213
|
summary: Simple artifact-based deployment for web applications.
|
223
214
|
test_files:
|
224
215
|
- spec/fixtures/Harrisonfile
|