capistrano-sneakers 0.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +4 -1
- data/capistrano-sneakers.gemspec +1 -1
- data/lib/capistrano/sneakers/helper_methods.rb +97 -0
- data/lib/capistrano/sneakers/version.rb +1 -1
- data/lib/capistrano/tasks/monit.rake +19 -10
- data/lib/capistrano/tasks/sneakers.rake +22 -110
- data/lib/generators/capistrano/sneakers/monit/templates/sneakers_monit.conf.erb +2 -4
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 978e28a0077d18528ca6c307d75c056f56d3d69c
|
4
|
+
data.tar.gz: ba45e83575f1a3c8de695f88dd5cd76a9939d55b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c5eb0c4d5afa78b5e06064851a7ca6ce9485b13e001ab7d95befb993b1fc8d41ec951294f3acbcc88f3d3b1c8c223d082418d69c0d3791c068b70f5ff07fa6b
|
7
|
+
data.tar.gz: 233f650045ca9cd053d16369004e65d0a08d2e518a13e48cde01e1cd29b4a9e31b57a5fabe432428d0c106922e5ae869bd6690fb74b3c701f5331f85ee14902f
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -37,9 +37,12 @@ Configurable options, shown here with defaults:
|
|
37
37
|
```
|
38
38
|
|
39
39
|
## Contributors
|
40
|
-
|
40
|
+
- [Karl Kloppenborg](https://github.com/inventionlabsSydney)
|
41
41
|
- [Andrew Babichev](https://github.com/Tensho)
|
42
42
|
- [NaixSpirit](https://github.com/NaixSpirit)
|
43
|
+
- [hpetru](https://github.com/hpetru)
|
44
|
+
- [jhollinger](https://github.com/jhollinger)
|
45
|
+
- [redrick](https://github.com/redrick)
|
43
46
|
|
44
47
|
## Contributing
|
45
48
|
|
data/capistrano-sneakers.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.required_ruby_version = '>= 2.0.0'
|
21
21
|
|
22
22
|
spec.add_dependency 'capistrano', '>= 3.9.0'
|
23
|
-
spec.add_dependency 'sneakers'
|
23
|
+
spec.add_dependency 'sneakers', '>= 2.6'
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.7"
|
26
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Capistrano
|
2
|
+
module Sneakers
|
3
|
+
module HelperMethods
|
4
|
+
def sneakers_each_process_with_index(reverse = false, &block)
|
5
|
+
_pid_files = sneakers_pid_files
|
6
|
+
_pid_files.reverse! if reverse
|
7
|
+
_pid_files.each_with_index do |pid_file, idx|
|
8
|
+
within release_path do
|
9
|
+
yield(pid_file, idx)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def sneakers_pid_files
|
15
|
+
sneakers_roles = Array(fetch(:sneakers_roles))
|
16
|
+
sneakers_roles.select! { |role| host.roles.include?(role) }
|
17
|
+
sneakers_roles.flat_map do |role|
|
18
|
+
processes = fetch(:sneakers_processes)
|
19
|
+
if processes == 1
|
20
|
+
fetch(:sneakers_pid)
|
21
|
+
else
|
22
|
+
Array.new(processes) { |idx| fetch(:sneakers_pid).gsub(/\.pid$/, "-#{idx}.pid") }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def sneakers_pid_file_exists?(pid_file)
|
28
|
+
test(*("[ -f #{pid_file} ]").split(' '))
|
29
|
+
end
|
30
|
+
|
31
|
+
def sneakers_process_exists?(pid_file)
|
32
|
+
test(*("kill -0 $( cat #{pid_file} )").split(' '))
|
33
|
+
end
|
34
|
+
|
35
|
+
def quiet_sneakers(pid_file)
|
36
|
+
if fetch(:sneakers_use_signals) || fetch(:sneakers_run_config)
|
37
|
+
execute :kill, "-USR1 `cat #{pid_file}`"
|
38
|
+
else
|
39
|
+
begin
|
40
|
+
execute :bundle, :exec, :sneakersctl, 'quiet', "#{pid_file}"
|
41
|
+
rescue SSHKit::Command::Failed
|
42
|
+
# If gems are not installed eq(first deploy) and sneakers_default_hooks as active
|
43
|
+
warn 'sneakersctl not found (ignore if this is the first deploy)'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def stop_sneakers(pid_file)
|
49
|
+
if fetch(:sneakers_run_config) == true
|
50
|
+
execute :kill, "-SIGTERM `cat #{pid_file}`"
|
51
|
+
else
|
52
|
+
if fetch(:stop_sneakers_in_background, fetch(:sneakers_run_in_background))
|
53
|
+
if fetch(:sneakers_use_signals)
|
54
|
+
background :kill, "-TERM `cat #{pid_file}`"
|
55
|
+
else
|
56
|
+
background :bundle, :exec, :sneakersctl, 'stop', "#{pid_file}", fetch(:sneakers_timeout)
|
57
|
+
end
|
58
|
+
else
|
59
|
+
execute :bundle, :exec, :sneakersctl, 'stop', "#{pid_file}", fetch(:sneakers_timeout)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def start_sneakers(pid_file, idx = 0)
|
65
|
+
if fetch(:sneakers_run_config) == true
|
66
|
+
# Use sneakers configuration prebuilt in
|
67
|
+
raise "[ set :workers, ['worker1', 'workerN'] ] not configured properly, please configure the workers you wish to use" if fetch(:sneakers_workers).nil? or fetch(:sneakers_workers) == false or !fetch(:sneakers_workers).kind_of? Array
|
68
|
+
|
69
|
+
workers = fetch(:sneakers_workers).compact.join(',')
|
70
|
+
|
71
|
+
info "Starting the sneakers processes"
|
72
|
+
|
73
|
+
with rails_env: fetch(:sneakers_env), workers: workers do
|
74
|
+
rake 'sneakers:run'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def sneakers_switch_user(role, &block)
|
80
|
+
user = sneakers_user(role)
|
81
|
+
if user == role.user
|
82
|
+
block.call
|
83
|
+
else
|
84
|
+
as user do
|
85
|
+
block.call
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def sneakers_user(role)
|
91
|
+
properties = role.properties
|
92
|
+
properties.fetch(:sneakers_user) || fetch(:sneakers_user) || properties.fetch(:run_as) || role.user
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
@@ -2,7 +2,7 @@ namespace :load do
|
|
2
2
|
task :defaults do
|
3
3
|
set :monit_bin, '/usr/bin/monit'
|
4
4
|
set :sneakers_monit_default_hooks, true
|
5
|
-
set :sneakers_monit_conf_dir,
|
5
|
+
set :sneakers_monit_conf_dir, '/etc/monit/conf.d'
|
6
6
|
set :sneakers_monit_use_sudo, true
|
7
7
|
set :sneakers_monit_templates_path, 'config/deploy/templates'
|
8
8
|
end
|
@@ -20,7 +20,7 @@ namespace :sneakers do
|
|
20
20
|
namespace :monit do
|
21
21
|
task :add_default_hooks do
|
22
22
|
before 'deploy:updating', 'sneakers:monit:unmonitor'
|
23
|
-
after
|
23
|
+
after 'deploy:published', 'sneakers:monit:monitor'
|
24
24
|
end
|
25
25
|
|
26
26
|
desc 'Config Sneakers monit-service'
|
@@ -29,7 +29,7 @@ namespace :sneakers do
|
|
29
29
|
@role = role
|
30
30
|
upload_sneakers_template 'sneakers_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
|
31
31
|
|
32
|
-
mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sneakers_monit_conf_dir)}/#{
|
32
|
+
mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sneakers_monit_conf_dir)}/#{sneakers_monit_service_name}.conf"
|
33
33
|
sudo_if_needed mv_command
|
34
34
|
|
35
35
|
sudo_if_needed "#{fetch(:monit_bin)} reload"
|
@@ -39,40 +39,49 @@ namespace :sneakers do
|
|
39
39
|
desc 'Monitor Sneakers monit-service'
|
40
40
|
task :monitor do
|
41
41
|
on roles(fetch(:sneakers_roles)) do
|
42
|
-
|
42
|
+
begin
|
43
|
+
sudo_if_needed "#{fetch(:monit_bin)} monitor #{sneakers_monit_service_name}"
|
44
|
+
rescue
|
45
|
+
invoke 'sneakers:monit:config'
|
46
|
+
sudo_if_needed "#{fetch(:monit_bin)} monitor #{sneakers_monit_service_name}"
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
|
46
51
|
desc 'Unmonitor Sneakers monit-service'
|
47
52
|
task :unmonitor do
|
48
53
|
on roles(fetch(:sneakers_roles)) do
|
49
|
-
|
54
|
+
begin
|
55
|
+
sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{sneakers_monit_service_name}"
|
56
|
+
rescue
|
57
|
+
# no worries here
|
58
|
+
end
|
50
59
|
end
|
51
60
|
end
|
52
61
|
|
53
62
|
desc 'Start Sneakers monit-service'
|
54
63
|
task :start do
|
55
64
|
on roles(fetch(:sneakers_roles)) do
|
56
|
-
sudo_if_needed "#{fetch(:monit_bin)} start #{
|
65
|
+
sudo_if_needed "#{fetch(:monit_bin)} start #{sneakers_monit_service_name}"
|
57
66
|
end
|
58
67
|
end
|
59
68
|
|
60
69
|
desc 'Stop Sneakers monit-service'
|
61
70
|
task :stop do
|
62
71
|
on roles(fetch(:sneakers_roles)) do
|
63
|
-
sudo_if_needed "#{fetch(:monit_bin)} stop #{
|
72
|
+
sudo_if_needed "#{fetch(:monit_bin)} stop #{sneakers_monit_service_name}"
|
64
73
|
end
|
65
74
|
end
|
66
75
|
|
67
76
|
desc 'Restart Sneakers monit-service'
|
68
77
|
task :restart do
|
69
78
|
on roles(fetch(:sneakers_roles)) do
|
70
|
-
sudo_if_needed "#{fetch(:monit_bin)} restart #{
|
79
|
+
sudo_if_needed "#{fetch(:monit_bin)} restart #{sneakers_monit_service_name}"
|
71
80
|
end
|
72
81
|
end
|
73
82
|
|
74
|
-
def
|
75
|
-
fetch(:
|
83
|
+
def sneakers_monit_service_name
|
84
|
+
fetch(:sneakers_monit_service_name, "sneakers_#{fetch(:application)}_#{fetch(:sneakers_env)}")
|
76
85
|
end
|
77
86
|
|
78
87
|
def sudo_if_needed(command)
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'capistrano/sneakers/helper_methods'
|
2
|
+
include Capistrano::Sneakers::HelperMethods
|
3
|
+
|
1
4
|
namespace :load do
|
2
5
|
task :defaults do
|
3
6
|
set :sneakers_default_hooks, true
|
@@ -39,10 +42,10 @@ namespace :sneakers do
|
|
39
42
|
desc 'Quiet sneakers (stop processing new tasks)'
|
40
43
|
task :quiet do
|
41
44
|
on roles fetch(:sneakers_roles) do |role|
|
42
|
-
|
45
|
+
sneakers_switch_user(role) do
|
43
46
|
if test("[ -d #{current_path} ]")
|
44
|
-
|
45
|
-
if pid_file_exists?(pid_file) &&
|
47
|
+
sneakers_each_process_with_index(true) do |pid_file, idx|
|
48
|
+
if pid_file_exists?(pid_file) && sneakers_process_exists?(pid_file)
|
46
49
|
quiet_sneakers(pid_file)
|
47
50
|
end
|
48
51
|
end
|
@@ -54,10 +57,10 @@ namespace :sneakers do
|
|
54
57
|
desc 'Stop sneakers'
|
55
58
|
task :stop do
|
56
59
|
on roles fetch(:sneakers_roles) do |role|
|
57
|
-
|
60
|
+
sneakers_switch_user(role) do
|
58
61
|
if test("[ -d #{current_path} ]")
|
59
|
-
|
60
|
-
if
|
62
|
+
sneakers_each_process_with_index(true) do |pid_file, idx|
|
63
|
+
if sneakers_pid_file_exists?(pid_file) && sneakers_process_exists?(pid_file)
|
61
64
|
stop_sneakers(pid_file)
|
62
65
|
end
|
63
66
|
end
|
@@ -69,9 +72,9 @@ namespace :sneakers do
|
|
69
72
|
desc 'Start sneakers'
|
70
73
|
task :start do
|
71
74
|
on roles fetch(:sneakers_roles) do |role|
|
72
|
-
|
73
|
-
|
74
|
-
unless
|
75
|
+
sneakers_switch_user(role) do
|
76
|
+
sneakers_each_process_with_index do |pid_file, idx|
|
77
|
+
unless sneakers_pid_file_exists?(pid_file) && sneakers_process_exists?(pid_file)
|
75
78
|
start_sneakers(pid_file, idx)
|
76
79
|
end
|
77
80
|
end
|
@@ -91,9 +94,9 @@ namespace :sneakers do
|
|
91
94
|
desc 'Rolling-restart sneakers'
|
92
95
|
task :rolling_restart do
|
93
96
|
on roles fetch(:sneakers_roles) do |role|
|
94
|
-
|
95
|
-
|
96
|
-
if
|
97
|
+
sneakers_switch_user(role) do
|
98
|
+
sneakers_each_process_with_index(true) do |pid_file, idx|
|
99
|
+
if sneakers_pid_file_exists?(pid_file) && sneakers_process_exists?(pid_file)
|
97
100
|
stop_sneakers(pid_file)
|
98
101
|
end
|
99
102
|
start_sneakers(pid_file, idx)
|
@@ -105,10 +108,10 @@ namespace :sneakers do
|
|
105
108
|
# Delete any pid file not in use
|
106
109
|
task :cleanup do
|
107
110
|
on roles fetch(:sneakers_roles) do |role|
|
108
|
-
|
109
|
-
|
110
|
-
unless
|
111
|
-
if
|
111
|
+
sneakers_switch_user(role) do
|
112
|
+
sneakers_each_process_with_index do |pid_file, idx|
|
113
|
+
unless sneakers_process_exists?(pid_file)
|
114
|
+
if sneakers_pid_file_exists?(pid_file)
|
112
115
|
execute "rm #{pid_file}"
|
113
116
|
end
|
114
117
|
end
|
@@ -122,104 +125,13 @@ namespace :sneakers do
|
|
122
125
|
task :respawn do
|
123
126
|
invoke 'sneakers:cleanup'
|
124
127
|
on roles fetch(:sneakers_roles) do |role|
|
125
|
-
|
126
|
-
|
127
|
-
unless
|
128
|
+
sneakers_switch_user(role) do
|
129
|
+
sneakers_each_process_with_index do |pid_file, idx|
|
130
|
+
unless sneakers_pid_file_exists?(pid_file)
|
128
131
|
start_sneakers(pid_file, idx)
|
129
132
|
end
|
130
133
|
end
|
131
134
|
end
|
132
135
|
end
|
133
136
|
end
|
134
|
-
|
135
|
-
def each_process_with_index(reverse = false, &block)
|
136
|
-
_pid_files = pid_files
|
137
|
-
_pid_files.reverse! if reverse
|
138
|
-
_pid_files.each_with_index do |pid_file, idx|
|
139
|
-
within release_path do
|
140
|
-
yield(pid_file, idx)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def pid_files
|
146
|
-
sneakers_roles = Array(fetch(:sneakers_roles))
|
147
|
-
sneakers_roles.select! { |role| host.roles.include?(role) }
|
148
|
-
sneakers_roles.flat_map do |role|
|
149
|
-
processes = fetch(:sneakers_processes)
|
150
|
-
if processes == 1
|
151
|
-
fetch(:sneakers_pid)
|
152
|
-
else
|
153
|
-
Array.new(processes) { |idx| fetch(:sneakers_pid).gsub(/\.pid$/, "-#{idx}.pid") }
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def pid_file_exists?(pid_file)
|
159
|
-
test(*("[ -f #{pid_file} ]").split(' '))
|
160
|
-
end
|
161
|
-
|
162
|
-
def process_exists?(pid_file)
|
163
|
-
test(*("kill -0 $( cat #{pid_file} )").split(' '))
|
164
|
-
end
|
165
|
-
|
166
|
-
def quiet_sneakers(pid_file)
|
167
|
-
if fetch(:sneakers_use_signals) || fetch(:sneakers_run_config)
|
168
|
-
execute :kill, "-USR1 `cat #{pid_file}`"
|
169
|
-
else
|
170
|
-
begin
|
171
|
-
execute :bundle, :exec, :sneakersctl, 'quiet', "#{pid_file}"
|
172
|
-
rescue SSHKit::Command::Failed
|
173
|
-
# If gems are not installed eq(first deploy) and sneakers_default_hooks as active
|
174
|
-
warn 'sneakersctl not found (ignore if this is the first deploy)'
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def stop_sneakers(pid_file)
|
180
|
-
if fetch(:sneakers_run_config) == true
|
181
|
-
execute :kill, "-SIGTERM `cat #{pid_file}`"
|
182
|
-
else
|
183
|
-
if fetch(:stop_sneakers_in_background, fetch(:sneakers_run_in_background))
|
184
|
-
if fetch(:sneakers_use_signals)
|
185
|
-
background :kill, "-TERM `cat #{pid_file}`"
|
186
|
-
else
|
187
|
-
background :bundle, :exec, :sneakersctl, 'stop', "#{pid_file}", fetch(:sneakers_timeout)
|
188
|
-
end
|
189
|
-
else
|
190
|
-
execute :bundle, :exec, :sneakersctl, 'stop', "#{pid_file}", fetch(:sneakers_timeout)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
def start_sneakers(pid_file, idx = 0)
|
196
|
-
if fetch(:sneakers_run_config) == true
|
197
|
-
# Use sneakers configuration prebuilt in
|
198
|
-
raise "[ set :workers, ['worker1', 'workerN'] ] not configured properly, please configure the workers you wish to use" if fetch(:sneakers_workers).nil? or fetch(:sneakers_workers) == false or !fetch(:sneakers_workers).kind_of? Array
|
199
|
-
|
200
|
-
workers = fetch(:sneakers_workers).compact.join(',')
|
201
|
-
|
202
|
-
info "Starting the sneakers processes"
|
203
|
-
|
204
|
-
with rails_env: fetch(:sneakers_env), workers: workers do
|
205
|
-
rake 'sneakers:run'
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def switch_user(role, &block)
|
211
|
-
user = sneakers_user(role)
|
212
|
-
if user == role.user
|
213
|
-
block.call
|
214
|
-
else
|
215
|
-
as user do
|
216
|
-
block.call
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
def sneakers_user(role)
|
222
|
-
properties = role.properties
|
223
|
-
properties.fetch(:sneakers_user) || fetch(:sneakers_user) || properties.fetch(:run_as) || role.user
|
224
|
-
end
|
225
137
|
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
# Monit configuration for Sneakers
|
2
|
-
|
3
|
-
#
|
4
|
-
check process <%= sneakers_service_name %>
|
1
|
+
# Monit configuration for Sneakers : <%= fetch(:application) %>
|
2
|
+
check process <%= sneakers_monit_service_name %>
|
5
3
|
with pidfile "<%= fetch(:sneakers_pid) %>"
|
6
4
|
start program = "/usr/bin/sudo -iu <%= sneakers_user(@role) %> /bin/bash -c 'cd <%= current_path %> && RAILS_ENV=<%= fetch(:sneakers_env) %> WORKERS=<%= fetch(:sneakers_workers).join(',') %> <%= SSHKit.config.command_map[:rake] %> sneakers:run'"
|
7
5
|
stop program = "/usr/bin/sudo -iu <%= sneakers_user(@role) %> /bin/bash -c 'kill -SIGTERM `cat <%= fetch(:sneakers_pid) %>`'"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-sneakers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Kloppenborg, Andrew Babichev, NaixSpirit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.6'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- capistrano-sneakers.gemspec
|
85
85
|
- lib/capistrano-sneakers.rb
|
86
86
|
- lib/capistrano/sneakers.rb
|
87
|
+
- lib/capistrano/sneakers/helper_methods.rb
|
87
88
|
- lib/capistrano/sneakers/monit.rb
|
88
89
|
- lib/capistrano/sneakers/version.rb
|
89
90
|
- lib/capistrano/tasks/monit.rake
|