capistrano-sidekiq 0.5.2 → 0.5.3
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/README.md +23 -0
- data/lib/capistrano/sidekiq/version.rb +1 -1
- data/lib/capistrano/tasks/capistrano2.rb +43 -18
- data/lib/capistrano/tasks/monit.cap +18 -15
- data/lib/capistrano/tasks/sidekiq.cap +33 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b43a2e9a957a57fca9cddeb61fe2dab7f38d5d7f
|
4
|
+
data.tar.gz: bd9d98c7eef3166efa9c1043a06cd138029c3b9a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75ded52a6a43fbb98913af4efeaaf5f21ab52e3d6648f48600fda9bf875aa7ba803fc2312e502d3732aa1e5bff82a2210ec778d264603592e657e76860c86623
|
7
|
+
data.tar.gz: 1fdc6a4f79c26271f8a54d2b251b7da90215c97027e97a3ede44ca354c4263624cebca7873bf9cbbe09e85d8300e08d3ba6a79460257249f0599abac38a0e196
|
data/README.md
CHANGED
@@ -47,6 +47,7 @@ Configurable options, shown here with defaults:
|
|
47
47
|
:sidekiq_options_per_process => nil
|
48
48
|
:sidekiq_concurrency => nil
|
49
49
|
:sidekiq_monit_templates_path => 'config/deploy/templates'
|
50
|
+
:sidekiq_monit_use_sudo => true
|
50
51
|
:sidekiq_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" # Only for capistrano2.5
|
51
52
|
:sidekiqctl_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" # Only for capistrano2.5
|
52
53
|
```
|
@@ -69,6 +70,18 @@ and `low`:
|
|
69
70
|
set :sidekiq_options_per_process, ["--queue high", "--queue default --queue low"]
|
70
71
|
```
|
71
72
|
|
73
|
+
## Different number of processes per host
|
74
|
+
|
75
|
+
You can configure how many processes you want to run on each host next way:
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
set :sidekiq_role, [:sidekiq_small, :sidekiq_big]
|
79
|
+
set :sidekiq_small_processes, 1
|
80
|
+
set :sidekiq_big_processes, 4
|
81
|
+
server 'example-small.com', roles: [:sidekiq_small]
|
82
|
+
server 'example-big.com', roles: [:sidekiq_big]
|
83
|
+
```
|
84
|
+
|
72
85
|
## Customizing the monit sidekiq templates
|
73
86
|
|
74
87
|
If you need change some config in redactor, you can
|
@@ -78,7 +91,14 @@ If you need change some config in redactor, you can
|
|
78
91
|
|
79
92
|
```
|
80
93
|
|
94
|
+
If your deploy user has no need in `sudo` for using monit, you can disable it as follows:
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
set :sidekiq_monit_use_sudo, false
|
98
|
+
```
|
99
|
+
|
81
100
|
## Changelog
|
101
|
+
- 0.5.3: Custom count of processes per each host
|
82
102
|
- 0.5.0: Multiple processes @mrsimo
|
83
103
|
- 0.3.9: Restore daemon flag from Monit template
|
84
104
|
- 0.3.8:
|
@@ -108,6 +128,9 @@ If you need change some config in redactor, you can
|
|
108
128
|
- [Fabien Penso] (https://github.com/penso)
|
109
129
|
- [Alex Dunae] (https://github.com/alexdunae)
|
110
130
|
- [andreygerasimchuk] (https://github.com/andreygerasimchuk)
|
131
|
+
- [Saicheg] (https://github.com/Saicheg)
|
132
|
+
- [Alex Yakubenko] (https://github.com/alexyakubenko)
|
133
|
+
- [Robert Strobl] (https://github.com/rstrobl)
|
111
134
|
|
112
135
|
## Contributing
|
113
136
|
|
@@ -17,6 +17,7 @@ Capistrano::Configuration.instance.load do
|
|
17
17
|
|
18
18
|
_cset(:sidekiq_timeout) { 10 }
|
19
19
|
_cset(:sidekiq_role) { :app }
|
20
|
+
|
20
21
|
_cset(:sidekiq_processes) { 1 }
|
21
22
|
_cset(:sidekiq_options_per_process) { nil }
|
22
23
|
|
@@ -28,9 +29,10 @@ Capistrano::Configuration.instance.load do
|
|
28
29
|
end
|
29
30
|
|
30
31
|
namespace :sidekiq do
|
31
|
-
def for_each_process(&block)
|
32
|
-
fetch(:
|
33
|
-
|
32
|
+
def for_each_process(sidekiq_role, &block)
|
33
|
+
sidekiq_processes = fetch(:"#{ sidekiq_role }_processes") rescue 1
|
34
|
+
sidekiq_processes.times do |idx|
|
35
|
+
if idx.zero? && sidekiq_processes <= 1
|
34
36
|
pid_file = fetch(:sidekiq_pid)
|
35
37
|
else
|
36
38
|
pid_file = fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid")
|
@@ -39,15 +41,30 @@ Capistrano::Configuration.instance.load do
|
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
|
-
def
|
43
|
-
|
44
|
+
def for_each_role
|
45
|
+
sidekiq_roles = fetch(:sidekiq_role)
|
46
|
+
|
47
|
+
sidekiq_roles = if sidekiq_roles.respond_to?(:to_ary)
|
48
|
+
sidekiq_roles.to_ary
|
49
|
+
else
|
50
|
+
[sidekiq_roles]
|
51
|
+
end
|
52
|
+
|
53
|
+
sidekiq_roles.to_ary.each do |sidekiq_role|
|
54
|
+
puts "executing on ##{ sidekiq_role }" if sidekiq_roles.size > 1
|
55
|
+
yield(sidekiq_role)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def quiet_process(pid_file, idx, sidekiq_role)
|
60
|
+
run "if [ -d #{current_path} ] && [ -f #{pid_file} ] && kill -0 `cat #{pid_file}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} quiet #{pid_file} ; else echo 'Sidekiq is not running'; fi", roles: sidekiq_role
|
44
61
|
end
|
45
62
|
|
46
|
-
def stop_process(pid_file, idx)
|
47
|
-
run "if [ -d #{current_path} ] && [ -f #{pid_file} ] && kill -0 `cat #{pid_file}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} stop #{pid_file} #{fetch :sidekiq_timeout} ; else echo 'Sidekiq is not running'
|
63
|
+
def stop_process(pid_file, idx, sidekiq_role)
|
64
|
+
run "if [ -d #{current_path} ] && [ -f #{pid_file} ] && kill -0 `cat #{pid_file}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} stop #{pid_file} #{fetch :sidekiq_timeout} ; else echo 'Sidekiq is not running'; fi", roles: sidekiq_role
|
48
65
|
end
|
49
66
|
|
50
|
-
def start_process(pid_file, idx)
|
67
|
+
def start_process(pid_file, idx, sidekiq_role)
|
51
68
|
args = []
|
52
69
|
args.push "--index #{idx}"
|
53
70
|
args.push "--pidfile #{pid_file}"
|
@@ -73,35 +90,43 @@ Capistrano::Configuration.instance.load do
|
|
73
90
|
args.push '--daemon'
|
74
91
|
end
|
75
92
|
|
76
|
-
run "if [ -d #{current_path} ] && [ ! -f #{pid_file} ] || ! kill -0 `cat #{pid_file}` > /dev/null 2>&1; then cd #{current_path} ; #{fetch(:sidekiq_cmd)} #{args.compact.join(' ')} ; else echo 'Sidekiq is already running'; fi", pty: false
|
93
|
+
run "if [ -d #{current_path} ] && [ ! -f #{pid_file} ] || ! kill -0 `cat #{pid_file}` > /dev/null 2>&1; then cd #{current_path} ; #{fetch(:sidekiq_cmd)} #{args.compact.join(' ')} ; else echo 'Sidekiq is already running'; fi", pty: false, roles: sidekiq_role
|
77
94
|
end
|
78
95
|
|
79
96
|
desc 'Quiet sidekiq (stop accepting new work)'
|
80
97
|
task :quiet, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
81
|
-
|
82
|
-
|
98
|
+
for_each_role do |sidekiq_role|
|
99
|
+
for_each_process(sidekiq_role) do |pid_file, idx|
|
100
|
+
quiet_process(pid_file, idx, sidekiq_role)
|
101
|
+
end
|
83
102
|
end
|
84
103
|
end
|
85
104
|
|
86
105
|
desc 'Stop sidekiq'
|
87
106
|
task :stop, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
88
|
-
|
89
|
-
|
107
|
+
for_each_role do |sidekiq_role|
|
108
|
+
for_each_process(sidekiq_role) do |pid_file, idx|
|
109
|
+
stop_process(pid_file, idx, sidekiq_role)
|
110
|
+
end
|
90
111
|
end
|
91
112
|
end
|
92
113
|
|
93
114
|
desc 'Start sidekiq'
|
94
115
|
task :start, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
95
|
-
|
96
|
-
|
116
|
+
for_each_role do |sidekiq_role|
|
117
|
+
for_each_process(sidekiq_role) do |pid_file, idx|
|
118
|
+
start_process(pid_file, idx, sidekiq_role)
|
119
|
+
end
|
97
120
|
end
|
98
121
|
end
|
99
122
|
|
100
123
|
desc 'Rolling-restart sidekiq'
|
101
124
|
task :rolling_restart, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
102
|
-
|
103
|
-
|
104
|
-
|
125
|
+
for_each_role do |sidekiq_role|
|
126
|
+
for_each_process(sidekiq_role) do |pid_file, idx|
|
127
|
+
stop_process(pid_file, idx, sidekiq_role)
|
128
|
+
start_process(pid_file, idx, sidekiq_role)
|
129
|
+
end
|
105
130
|
end
|
106
131
|
end
|
107
132
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
namespace :load do
|
2
2
|
task :defaults do
|
3
3
|
set :sidekiq_monit_conf_dir, -> { '/etc/monit/conf.d' }
|
4
|
+
set :sidekiq_monit_use_sudo, -> { true }
|
4
5
|
set :monit_bin, -> { '/usr/bin/monit' }
|
5
6
|
set :sidekiq_monit_default_hooks, -> { true }
|
6
7
|
end
|
@@ -26,18 +27,12 @@ namespace :sidekiq do
|
|
26
27
|
task :config do
|
27
28
|
on roles(fetch(:sidekiq_role)) do |role|
|
28
29
|
@role = role
|
29
|
-
|
30
|
+
upload_sidekiq_template 'sidekiq_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
|
30
31
|
|
31
32
|
mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{sidekiq_service_name}.conf"
|
33
|
+
sudo_if_needed mv_command
|
32
34
|
|
33
|
-
#
|
34
|
-
begin
|
35
|
-
execute mv_command
|
36
|
-
rescue
|
37
|
-
sudo mv_command
|
38
|
-
end
|
39
|
-
|
40
|
-
sudo "#{fetch(:monit_bin)} reload"
|
35
|
+
sudo_if_needed "#{fetch(:monit_bin)} reload"
|
41
36
|
end
|
42
37
|
end
|
43
38
|
|
@@ -46,10 +41,10 @@ namespace :sidekiq do
|
|
46
41
|
on roles(fetch(:sidekiq_role)) do
|
47
42
|
fetch(:sidekiq_processes).times do |idx|
|
48
43
|
begin
|
49
|
-
|
44
|
+
sudo_if_needed "#{fetch(:monit_bin)} monitor #{sidekiq_service_name(idx)}"
|
50
45
|
rescue
|
51
46
|
invoke 'sidekiq:monit:config'
|
52
|
-
|
47
|
+
sudo_if_needed "#{fetch(:monit_bin)} monitor #{sidekiq_service_name(idx)}"
|
53
48
|
end
|
54
49
|
end
|
55
50
|
end
|
@@ -60,7 +55,7 @@ namespace :sidekiq do
|
|
60
55
|
on roles(fetch(:sidekiq_role)) do
|
61
56
|
fetch(:sidekiq_processes).times do |idx|
|
62
57
|
begin
|
63
|
-
|
58
|
+
sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{sidekiq_service_name(idx)}"
|
64
59
|
rescue
|
65
60
|
# no worries here
|
66
61
|
end
|
@@ -72,7 +67,7 @@ namespace :sidekiq do
|
|
72
67
|
task :start do
|
73
68
|
on roles(fetch(:sidekiq_role)) do
|
74
69
|
fetch(:sidekiq_processes).times do |idx|
|
75
|
-
|
70
|
+
sudo_if_needed "#{fetch(:monit_bin)} start #{sidekiq_service_name(idx)}"
|
76
71
|
end
|
77
72
|
end
|
78
73
|
end
|
@@ -81,7 +76,7 @@ namespace :sidekiq do
|
|
81
76
|
task :stop do
|
82
77
|
on roles(fetch(:sidekiq_role)) do
|
83
78
|
fetch(:sidekiq_processes).times do |idx|
|
84
|
-
|
79
|
+
sudo_if_needed "#{fetch(:monit_bin)} stop #{sidekiq_service_name(idx)}"
|
85
80
|
end
|
86
81
|
end
|
87
82
|
end
|
@@ -90,7 +85,7 @@ namespace :sidekiq do
|
|
90
85
|
task :restart do
|
91
86
|
on roles(fetch(:sidekiq_role)) do
|
92
87
|
fetch(:sidekiq_processes).times do |idx|
|
93
|
-
|
88
|
+
sudo_if_needed"#{fetch(:monit_bin)} restart #{sidekiq_service_name(idx)}"
|
94
89
|
end
|
95
90
|
end
|
96
91
|
end
|
@@ -123,5 +118,13 @@ namespace :sidekiq do
|
|
123
118
|
end
|
124
119
|
end
|
125
120
|
|
121
|
+
def sudo_if_needed(command)
|
122
|
+
send(use_sudo? ? :sudo : :execute, command)
|
123
|
+
end
|
124
|
+
|
125
|
+
def use_sudo?
|
126
|
+
fetch(:sidekiq_monit_use_sudo)
|
127
|
+
end
|
128
|
+
|
126
129
|
end
|
127
130
|
end
|
@@ -17,7 +17,6 @@ namespace :load do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
20
|
namespace :deploy do
|
22
21
|
before :starting, :check_sidekiq_hooks do
|
23
22
|
invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
|
@@ -40,12 +39,17 @@ namespace :sidekiq do
|
|
40
39
|
|
41
40
|
def processes_pids
|
42
41
|
pids = []
|
43
|
-
fetch(:
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
sidekiq_roles = Array(fetch(:sidekiq_role))
|
43
|
+
sidekiq_roles.each do |role|
|
44
|
+
next unless host.roles.include?(role)
|
45
|
+
processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
|
46
|
+
processes.times do |idx|
|
47
|
+
pids.push (idx.zero? && processes <= 1) ?
|
48
|
+
fetch(:sidekiq_pid) :
|
49
|
+
fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid")
|
50
|
+
end
|
48
51
|
end
|
52
|
+
|
49
53
|
pids
|
50
54
|
end
|
51
55
|
|
@@ -199,25 +203,29 @@ namespace :sidekiq do
|
|
199
203
|
end
|
200
204
|
end
|
201
205
|
|
202
|
-
def
|
203
|
-
|
204
|
-
|
205
|
-
File.join('lib', 'capistrano', 'templates', "#{from}-#{role.hostname}-#{fetch(:stage)}.conf.rb"),
|
206
|
-
File.join('lib', 'capistrano', 'templates', "#{from}-#{role.hostname}-#{fetch(:stage)}.conf.rb"),
|
207
|
-
File.join('lib', 'capistrano', 'templates', "#{from}-#{role.hostname}.conf.rb"),
|
208
|
-
File.join('lib', 'capistrano', 'templates', "#{from}-#{fetch(:stage)}.conf.rb"),
|
209
|
-
File.join('lib', 'capistrano', 'templates', "#{from}.conf.rb.erb"),
|
210
|
-
File.join('lib', 'capistrano', 'templates', "#{from}.conf.rb"),
|
211
|
-
File.join('lib', 'capistrano', 'templates', "#{from}.conf.erb"),
|
212
|
-
File.expand_path("../../../generators/capistrano/sidekiq/monit/templates/#{from}.conf.rb.erb", __FILE__),
|
213
|
-
File.expand_path("../../../generators/capistrano/sidekiq/monit/templates/#{from}.conf.erb", __FILE__)
|
214
|
-
].each do |path|
|
215
|
-
if File.file?(path)
|
216
|
-
erb = File.read(path)
|
217
|
-
upload! StringIO.new(ERB.new(erb).result(binding)), to
|
218
|
-
break
|
219
|
-
end
|
220
|
-
end
|
206
|
+
def upload_sidekiq_template(from, to, role)
|
207
|
+
template = sidekiq_template(from, role)
|
208
|
+
upload!(StringIO.new(ERB.new(template).result(binding)), to)
|
221
209
|
end
|
222
210
|
|
211
|
+
def sidekiq_template(name, role)
|
212
|
+
local_template_directory = fetch(:sidekiq_monit_templates_path)
|
213
|
+
|
214
|
+
search_paths = [
|
215
|
+
"#{name}-#{role.hostname}-#{fetch(:stage)}.erb",
|
216
|
+
"#{name}-#{role.hostname}.erb",
|
217
|
+
"#{name}-#{fetch(:stage)}.erb",
|
218
|
+
"#{name}.erb"
|
219
|
+
].map { |filename| File.join(local_template_directory, filename) }
|
220
|
+
|
221
|
+
global_search_path = File.expand_path(
|
222
|
+
File.join(*%w[.. .. .. generators capistrano sidekiq monit templates], "#{name}.conf.erb"),
|
223
|
+
__FILE__
|
224
|
+
)
|
225
|
+
|
226
|
+
search_paths << global_search_path
|
227
|
+
|
228
|
+
template_path = search_paths.detect { |path| File.file?(path) }
|
229
|
+
File.read(template_path)
|
230
|
+
end
|
223
231
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-sidekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abdelkader Boudih
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|