capistrano-sidekiq 0.20.0 → 2.3.0
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 +5 -5
- data/.gitignore +1 -0
- data/.tool-versions +1 -0
- data/CHANGELOG.md +286 -0
- data/Gemfile +4 -0
- data/README.md +46 -49
- data/Rakefile +8 -0
- data/capistrano-sidekiq.gemspec +3 -3
- data/lib/capistrano/sidekiq/helpers.rb +53 -0
- data/lib/capistrano/sidekiq/monit.rb +21 -2
- data/lib/capistrano/sidekiq/systemd.rb +19 -0
- data/lib/capistrano/sidekiq/version.rb +3 -3
- data/lib/capistrano/sidekiq.rb +30 -4
- data/lib/capistrano/tasks/monit.rake +64 -78
- data/lib/capistrano/tasks/sidekiq.rake +2 -250
- data/lib/capistrano/tasks/systemd.rake +296 -0
- data/lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb +8 -10
- data/lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb +68 -0
- metadata +28 -12
- data/CHANGELOG +0 -28
- data/CONTRIBUTORS.md +0 -11
- data/lib/capistrano/tasks/capistrano2.rb +0 -147
@@ -0,0 +1,296 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
git_plugin = self
|
4
|
+
|
5
|
+
namespace :sidekiq do
|
6
|
+
standard_actions = {
|
7
|
+
start: 'Start Sidekiq',
|
8
|
+
stop: 'Stop Sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)',
|
9
|
+
status: 'Get Sidekiq Status'
|
10
|
+
}
|
11
|
+
standard_actions.each do |command, description|
|
12
|
+
desc description
|
13
|
+
task command do
|
14
|
+
on roles fetch(:sidekiq_roles) do |role|
|
15
|
+
git_plugin.switch_user(role) do
|
16
|
+
git_plugin.systemctl_command(command)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Restart Sidekiq (Quiet, Wait till workers finish or 30 seconds, Stop, Start)'
|
23
|
+
task :restart do
|
24
|
+
on roles fetch(:sidekiq_roles) do |role|
|
25
|
+
git_plugin.switch_user(role) do
|
26
|
+
git_plugin.quiet_sidekiq
|
27
|
+
git_plugin.process_block do |process|
|
28
|
+
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
29
|
+
running = nil
|
30
|
+
|
31
|
+
# get running workers
|
32
|
+
while (running.nil? || running > 0) && git_plugin.duration(start_time) < 30 do
|
33
|
+
command_args =
|
34
|
+
if fetch(:sidekiq_service_unit_user) == :system
|
35
|
+
[:sudo, 'systemd-cgls']
|
36
|
+
else
|
37
|
+
['systemd-cgls', '--user']
|
38
|
+
end
|
39
|
+
# need to pipe through tr -cd... to strip out systemd colors or you
|
40
|
+
# get log error messages for non UTF-8 characters.
|
41
|
+
command_args.push(
|
42
|
+
'-u', "#{git_plugin.sidekiq_service_unit_name(process: process)}.service",
|
43
|
+
'|', 'tr -cd \'\11\12\15\40-\176\''
|
44
|
+
)
|
45
|
+
status = capture(*command_args, raise_on_non_zero_exit: false)
|
46
|
+
status_match = status.match(/\[(?<running>\d+) of (?<total>\d+) busy\]/)
|
47
|
+
break unless status_match
|
48
|
+
|
49
|
+
running = status_match[:running]&.to_i
|
50
|
+
|
51
|
+
colors = SSHKit::Color.new($stdout)
|
52
|
+
if running.zero?
|
53
|
+
info colors.colorize("✔ Process ##{process}: No running workers. Shutting down for restart!", :green)
|
54
|
+
else
|
55
|
+
info colors.colorize("⧗ Process ##{process}: Waiting for #{running} workers.", :yellow)
|
56
|
+
sleep(1)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
git_plugin.systemctl_command(:stop, process: process)
|
61
|
+
git_plugin.systemctl_command(:start, process: process)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
desc 'Quiet Sidekiq (stop fetching new tasks from Redis)'
|
68
|
+
task :quiet do
|
69
|
+
on roles fetch(:sidekiq_roles) do |role|
|
70
|
+
git_plugin.switch_user(role) do
|
71
|
+
git_plugin.quiet_sidekiq
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
desc 'Install systemd sidekiq service'
|
77
|
+
task :install do
|
78
|
+
on roles fetch(:sidekiq_roles) do |role|
|
79
|
+
git_plugin.switch_user(role) do
|
80
|
+
git_plugin.create_systemd_template
|
81
|
+
if git_plugin.config_per_process?
|
82
|
+
git_plugin.process_block do |process|
|
83
|
+
git_plugin.create_systemd_config_symlink(process)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
git_plugin.systemctl_command(:enable)
|
87
|
+
|
88
|
+
if fetch(:sidekiq_service_unit_user) != :system && fetch(:sidekiq_enable_lingering)
|
89
|
+
execute :loginctl, 'enable-linger', fetch(:sidekiq_lingering_user)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
desc 'Uninstall systemd sidekiq service'
|
96
|
+
task :uninstall do
|
97
|
+
on roles fetch(:sidekiq_roles) do |role|
|
98
|
+
git_plugin.switch_user(role) do
|
99
|
+
git_plugin.systemctl_command(:stop)
|
100
|
+
git_plugin.systemctl_command(:disable)
|
101
|
+
if git_plugin.config_per_process?
|
102
|
+
git_plugin.process_block do |process|
|
103
|
+
git_plugin.delete_systemd_config_symlink(process)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
execute :sudo, :rm, '-f', File.join(
|
107
|
+
fetch(:service_unit_path, git_plugin.fetch_systemd_unit_path),
|
108
|
+
git_plugin.sidekiq_service_file_name
|
109
|
+
)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
desc 'Generate service_locally'
|
115
|
+
task :generate_service_locally do
|
116
|
+
run_locally do
|
117
|
+
File.write('sidekiq', git_plugin.compiled_template)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def fetch_systemd_unit_path
|
122
|
+
if fetch(:sidekiq_service_unit_user) == :system
|
123
|
+
# if the path is not standard `set :service_unit_path`
|
124
|
+
'/etc/systemd/system/'
|
125
|
+
else
|
126
|
+
home_dir = backend.capture :pwd
|
127
|
+
File.join(home_dir, '.config', 'systemd', 'user')
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def compiled_template
|
132
|
+
local_template_directory = fetch(:sidekiq_service_templates_path)
|
133
|
+
search_paths = [
|
134
|
+
File.join(local_template_directory, "#{fetch(:sidekiq_service_unit_name)}.service.capistrano.erb"),
|
135
|
+
File.join(local_template_directory, 'sidekiq.service.capistrano.erb'),
|
136
|
+
File.expand_path(
|
137
|
+
File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
|
138
|
+
__FILE__
|
139
|
+
)
|
140
|
+
]
|
141
|
+
template_path = search_paths.detect { |path| File.file?(path) }
|
142
|
+
template = File.read(template_path)
|
143
|
+
ERB.new(template).result(binding)
|
144
|
+
end
|
145
|
+
|
146
|
+
def create_systemd_template
|
147
|
+
ctemplate = compiled_template
|
148
|
+
systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
|
149
|
+
backend.execute :mkdir, '-p', systemd_path if fetch(:sidekiq_service_unit_user) == :user
|
150
|
+
|
151
|
+
if sidekiq_processes > 1
|
152
|
+
range = 1..sidekiq_processes
|
153
|
+
else
|
154
|
+
range = 0..0
|
155
|
+
end
|
156
|
+
range.each do |index|
|
157
|
+
temp_file_name = File.join('/tmp', sidekiq_service_file_name(index))
|
158
|
+
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(index))
|
159
|
+
backend.upload!(StringIO.new(ctemplate), temp_file_name)
|
160
|
+
|
161
|
+
if fetch(:sidekiq_service_unit_user) == :system
|
162
|
+
backend.execute :sudo, :mv, temp_file_name, systemd_file_name
|
163
|
+
backend.execute :sudo, :systemctl, 'daemon-reload'
|
164
|
+
else
|
165
|
+
backend.execute :mv, temp_file_name, systemd_file_name
|
166
|
+
backend.execute :systemctl, '--user', 'daemon-reload'
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def create_systemd_config_symlink(process)
|
172
|
+
config = fetch(:sidekiq_config)
|
173
|
+
return unless config
|
174
|
+
|
175
|
+
process_config = config[process - 1]
|
176
|
+
if process_config.nil?
|
177
|
+
backend.error(
|
178
|
+
"No configuration for Process ##{process} found. "\
|
179
|
+
'Please make sure you have 1 item in :sidekiq_config for each process.'
|
180
|
+
)
|
181
|
+
exit 1
|
182
|
+
end
|
183
|
+
|
184
|
+
base_path = fetch(:deploy_to)
|
185
|
+
config_link_base_path = File.join(base_path, 'shared', 'sidekiq_systemd')
|
186
|
+
config_link_path = File.join(
|
187
|
+
config_link_base_path, sidekiq_systemd_config_name(process)
|
188
|
+
)
|
189
|
+
process_config_path = File.join(base_path, 'current', process_config)
|
190
|
+
|
191
|
+
backend.execute :mkdir, '-p', config_link_base_path
|
192
|
+
backend.execute :ln, '-sf', process_config_path, config_link_path
|
193
|
+
end
|
194
|
+
|
195
|
+
def delete_systemd_config_symlink(process)
|
196
|
+
config_link_path = File.join(
|
197
|
+
fetch(:deploy_to), 'shared', 'sidekiq_systemd',
|
198
|
+
sidekiq_systemd_config_name(process)
|
199
|
+
)
|
200
|
+
backend.execute :rm, config_link_path, raise_on_non_zero_exit: false
|
201
|
+
end
|
202
|
+
|
203
|
+
def systemctl_command(*args, process: nil)
|
204
|
+
execute_array =
|
205
|
+
if fetch(:sidekiq_service_unit_user) == :system
|
206
|
+
%i[sudo systemctl]
|
207
|
+
else
|
208
|
+
[:systemctl, '--user']
|
209
|
+
end
|
210
|
+
if process && sidekiq_processes > 1
|
211
|
+
execute_array.push(
|
212
|
+
*args, sidekiq_service_unit_name(process: process)
|
213
|
+
).flatten
|
214
|
+
else
|
215
|
+
execute_array.push(*args, sidekiq_service_unit_name).flatten
|
216
|
+
end
|
217
|
+
backend.execute(*execute_array, raise_on_non_zero_exit: false)
|
218
|
+
end
|
219
|
+
|
220
|
+
def quiet_sidekiq
|
221
|
+
systemctl_command(:kill, '-s', :TSTP)
|
222
|
+
end
|
223
|
+
|
224
|
+
def switch_user(role, &block)
|
225
|
+
su_user = sidekiq_user
|
226
|
+
if su_user != role.user
|
227
|
+
yield
|
228
|
+
else
|
229
|
+
backend.as su_user, &block
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def sidekiq_user
|
234
|
+
fetch(:sidekiq_user, fetch(:run_as))
|
235
|
+
end
|
236
|
+
|
237
|
+
def sidekiq_config
|
238
|
+
config = fetch(:sidekiq_config)
|
239
|
+
return unless config
|
240
|
+
|
241
|
+
if config_per_process?
|
242
|
+
config = File.join(
|
243
|
+
fetch(:deploy_to), 'shared', 'sidekiq_systemd',
|
244
|
+
sidekiq_systemd_config_name
|
245
|
+
)
|
246
|
+
end
|
247
|
+
"--config #{config}"
|
248
|
+
end
|
249
|
+
|
250
|
+
def sidekiq_concurrency
|
251
|
+
"--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
|
252
|
+
end
|
253
|
+
|
254
|
+
def sidekiq_processes
|
255
|
+
fetch(:sidekiq_processes, 1)
|
256
|
+
end
|
257
|
+
|
258
|
+
def sidekiq_queues
|
259
|
+
Array(fetch(:sidekiq_queue)).map do |queue|
|
260
|
+
"--queue #{queue}"
|
261
|
+
end.join(' ')
|
262
|
+
end
|
263
|
+
|
264
|
+
def sidekiq_service_file_name(index = nil)
|
265
|
+
return "#{fetch(:sidekiq_service_unit_name)}.service" if index.to_i.zero?
|
266
|
+
"#{fetch(:sidekiq_service_unit_name)}@#{index}.service"
|
267
|
+
end
|
268
|
+
|
269
|
+
def sidekiq_service_unit_name(process: nil)
|
270
|
+
if process && sidekiq_processes > 1
|
271
|
+
"#{fetch(:sidekiq_service_unit_name)}@#{process}"
|
272
|
+
else
|
273
|
+
fetch(:sidekiq_service_unit_name)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
# process = 1 | sidekiq_systemd_1.yaml
|
278
|
+
# process = nil | sidekiq_systemd_%i.yaml
|
279
|
+
def sidekiq_systemd_config_name(process = nil)
|
280
|
+
"sidekiq_systemd_#{(process&.to_s || '%i')}.yaml"
|
281
|
+
end
|
282
|
+
|
283
|
+
def config_per_process?
|
284
|
+
fetch(:sidekiq_config).is_a?(Array)
|
285
|
+
end
|
286
|
+
|
287
|
+
def process_block
|
288
|
+
(1..sidekiq_processes).each do |process|
|
289
|
+
yield(process)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
def duration(start_time)
|
294
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
|
295
|
+
end
|
296
|
+
end
|
@@ -1,10 +1,8 @@
|
|
1
|
-
# Monit configuration for Sidekiq
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
stop program = "/bin/su - <%= sidekiq_user(
|
8
|
-
group <%= fetch(:sidekiq_monit_group
|
9
|
-
|
10
|
-
<% end %>
|
1
|
+
# Monit configuration for Sidekiq
|
2
|
+
# Service name: <%= sidekiq_service_name %>
|
3
|
+
#
|
4
|
+
check process <%= sidekiq_service_name %>
|
5
|
+
matching 'sidekiq .* <%= fetch(:application) %>'
|
6
|
+
start program = "/bin/su - <%= sidekiq_user(role) %> -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:bundle] %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %> <%= sidekiq_concurrency %> <%= sidekiq_require %> <%= sidekiq_queues %> <%= sidekiq_logfile ? ">> #{sidekiq_logfile} 2>&1" : nil %> &'" with timeout <%= fetch(:sidekiq_timeout).to_i + 10 %> seconds
|
7
|
+
stop program = "/bin/su - <%= sidekiq_user(role) %> -c 'ps ax | grep "<%= "sidekiq .* #{fetch(:application)}" %>" | grep -v grep | awk "{print \$1}" | xargs --no-run-if-empty kill'" with timeout <%= fetch(:sidekiq_timeout).to_i + 10 %> seconds
|
8
|
+
group <%= fetch(:sidekiq_monit_group) || fetch(:application) %>-sidekiq
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Source: https://github.com/mperham/sidekiq/blob/master/examples/systemd/sidekiq.service
|
2
|
+
#
|
3
|
+
# This file tells systemd how to run Sidekiq as a 24/7 long-running daemon.
|
4
|
+
#
|
5
|
+
# Customize this file based on your bundler location, app directory, etc.
|
6
|
+
# Customize and copy this into /usr/lib/systemd/system (CentOS) or /lib/systemd/system (Ubuntu).
|
7
|
+
# Then run:
|
8
|
+
# - systemctl enable <%= sidekiq_service_unit_name %>
|
9
|
+
# - systemctl {start,stop,restart} <%= sidekiq_service_unit_name %>
|
10
|
+
#
|
11
|
+
# This file corresponds to a single Sidekiq process. Add multiple copies
|
12
|
+
# to run multiple processes (sidekiq-1, sidekiq-2, etc).
|
13
|
+
#
|
14
|
+
# Use `journalctl -u <%= sidekiq_service_unit_name %> -rn 100` to view the last 100 lines of log output.
|
15
|
+
#
|
16
|
+
[Unit]
|
17
|
+
Description=sidekiq for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
|
18
|
+
# start us only once the network and logging subsystems are available,
|
19
|
+
# consider adding redis-server.service if Redis is local and systemd-managed.
|
20
|
+
After=syslog.target network.target
|
21
|
+
|
22
|
+
# See these pages for lots of options:
|
23
|
+
#
|
24
|
+
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
|
25
|
+
# https://www.freedesktop.org/software/systemd/man/systemd.exec.html
|
26
|
+
#
|
27
|
+
# THOSE PAGES ARE CRITICAL FOR ANY LINUX DEVOPS WORK; read them multiple
|
28
|
+
# times! systemd is a critical tool for all developers to know and understand.
|
29
|
+
#
|
30
|
+
[Service]
|
31
|
+
#
|
32
|
+
# !!!! !!!! !!!!
|
33
|
+
#
|
34
|
+
# As of v6.0.6, Sidekiq automatically supports systemd's `Type=notify` and watchdog service
|
35
|
+
# monitoring. If you are using an earlier version of Sidekiq, change this to `Type=simple`
|
36
|
+
# and remove the `WatchdogSec` line.
|
37
|
+
#
|
38
|
+
# !!!! !!!! !!!!
|
39
|
+
#
|
40
|
+
Type=notify
|
41
|
+
# If your Sidekiq process locks up, systemd's watchdog will restart it within seconds.
|
42
|
+
WatchdogSec=10
|
43
|
+
|
44
|
+
WorkingDirectory=<%= File.join(fetch(:deploy_to), 'current') %>
|
45
|
+
ExecStart=<%= expanded_bundle_path %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %> <%= sidekiq_concurrency %> <%= sidekiq_queues %>
|
46
|
+
|
47
|
+
# Use `systemctl kill -s TSTP <%= sidekiq_service_unit_name %>` to quiet the Sidekiq process
|
48
|
+
<%="User=#{sidekiq_user}" if sidekiq_user %>
|
49
|
+
UMask=0002
|
50
|
+
|
51
|
+
<%="EnvironmentFile=#{File.join(fetch(:deploy_to), 'current')}/#{fetch(:sidekiq_service_unit_env_file)}" if fetch(:sidekiq_service_unit_env_file) %>
|
52
|
+
|
53
|
+
<% fetch(:sidekiq_service_unit_env_vars, []).each do |environment_variable| %>
|
54
|
+
<%="Environment=#{environment_variable}" %>
|
55
|
+
<% end %>
|
56
|
+
|
57
|
+
# if we crash, restart
|
58
|
+
RestartSec=1
|
59
|
+
Restart=on-failure
|
60
|
+
|
61
|
+
# output goes to /var/log/syslog (Ubuntu) or /var/log/messages (CentOS)
|
62
|
+
<%="StandardOutput=append:#{fetch(:sidekiq_log)}" if fetch(:sidekiq_log) %>
|
63
|
+
<%="StandardError=append:#{fetch(:sidekiq_error_log)}" if fetch(:sidekiq_error_log) %>
|
64
|
+
|
65
|
+
SyslogIdentifier=<%= sidekiq_service_unit_name %>
|
66
|
+
|
67
|
+
[Install]
|
68
|
+
WantedBy=default.target
|
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:
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abdelkader Boudih
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -24,20 +24,34 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.9.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: capistrano-bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: sidekiq
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
47
|
+
version: '6.0'
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
54
|
+
version: '6.0'
|
41
55
|
description: Sidekiq integration for Capistrano
|
42
56
|
email:
|
43
57
|
- terminale@gmail.com
|
@@ -46,8 +60,8 @@ extensions: []
|
|
46
60
|
extra_rdoc_files: []
|
47
61
|
files:
|
48
62
|
- ".gitignore"
|
49
|
-
-
|
50
|
-
-
|
63
|
+
- ".tool-versions"
|
64
|
+
- CHANGELOG.md
|
51
65
|
- Gemfile
|
52
66
|
- LICENSE.txt
|
53
67
|
- README.md
|
@@ -55,18 +69,21 @@ files:
|
|
55
69
|
- capistrano-sidekiq.gemspec
|
56
70
|
- lib/capistrano-sidekiq.rb
|
57
71
|
- lib/capistrano/sidekiq.rb
|
72
|
+
- lib/capistrano/sidekiq/helpers.rb
|
58
73
|
- lib/capistrano/sidekiq/monit.rb
|
74
|
+
- lib/capistrano/sidekiq/systemd.rb
|
59
75
|
- lib/capistrano/sidekiq/version.rb
|
60
|
-
- lib/capistrano/tasks/capistrano2.rb
|
61
76
|
- lib/capistrano/tasks/monit.rake
|
62
77
|
- lib/capistrano/tasks/sidekiq.rake
|
78
|
+
- lib/capistrano/tasks/systemd.rake
|
63
79
|
- lib/generators/capistrano/sidekiq/monit/template_generator.rb
|
64
80
|
- lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb
|
81
|
+
- lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb
|
65
82
|
homepage: https://github.com/seuros/capistrano-sidekiq
|
66
83
|
licenses:
|
67
84
|
- LGPL-3.0
|
68
85
|
metadata: {}
|
69
|
-
post_install_message:
|
86
|
+
post_install_message:
|
70
87
|
rdoc_options: []
|
71
88
|
require_paths:
|
72
89
|
- lib
|
@@ -81,9 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
98
|
- !ruby/object:Gem::Version
|
82
99
|
version: '0'
|
83
100
|
requirements: []
|
84
|
-
|
85
|
-
|
86
|
-
signing_key:
|
101
|
+
rubygems_version: 3.2.22
|
102
|
+
signing_key:
|
87
103
|
specification_version: 4
|
88
104
|
summary: Sidekiq integration for Capistrano
|
89
105
|
test_files: []
|
data/CHANGELOG
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
## Changelog
|
2
|
-
- 0.10.0:
|
3
|
-
* Fix Monit tasks
|
4
|
-
* sidekiq:stop task perpertually callable
|
5
|
-
- 0.5.4: Add support for custom count of processes per host in monit task @okoriko
|
6
|
-
- 0.5.3: Custom count of processes per each host
|
7
|
-
- 0.5.0: Multiple processes @mrsimo
|
8
|
-
- 0.3.9: Restore daemon flag from Monit template
|
9
|
-
- 0.3.8:
|
10
|
-
* Update monit template: use su instead of sudo / permit all Sidekiq options @bensie
|
11
|
-
* Unmonitor monit while deploy @Saicheg
|
12
|
-
- 0.3.7:
|
13
|
-
* fix capistrano2 task @tribble
|
14
|
-
* Run Sidekiq as daemon from Monit @dpaluy
|
15
|
-
- 0.3.5: Added :sidekiq_tag for capistrano2 @OscarBarrett
|
16
|
-
- 0.3.4: fix bug in sidekiq:start for capistrano 2 task
|
17
|
-
- 0.3.3: sidekiq:restart after deploy:restart added to default hooks
|
18
|
-
- 0.3.2: :sidekiq_queue accept an array
|
19
|
-
- 0.3.1: Fix logs @rottman, add concurrency option support @ungsophy
|
20
|
-
- 0.3.0: Fix monit task @andreygerasimchuk
|
21
|
-
- 0.2.9: Check if current directory exist @alexdunae
|
22
|
-
- 0.2.8: Added :sidekiq_queue & :sidekiq_config
|
23
|
-
- 0.2.7: Signal usage @penso
|
24
|
-
- 0.2.6: sidekiq:start check if sidekiq is running
|
25
|
-
- 0.2.5: bug fixes
|
26
|
-
- 0.2.4: Fast deploy with :sidekiq_run_in_background
|
27
|
-
- 0.2.3: Added monit tasks (alpha)
|
28
|
-
- 0.2.0: Added sidekiq:rolling_restart - @jlecour
|
data/CONTRIBUTORS.md
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
## Contributors
|
2
|
-
|
3
|
-
- [Jérémy Lecour] (https://github.com/jlecour)
|
4
|
-
- [Fabien Penso] (https://github.com/penso)
|
5
|
-
- [Alex Dunae] (https://github.com/alexdunae)
|
6
|
-
- [andreygerasimchuk] (https://github.com/andreygerasimchuk)
|
7
|
-
- [Saicheg] (https://github.com/Saicheg)
|
8
|
-
- [Alex Yakubenko] (https://github.com/alexyakubenko)
|
9
|
-
- [Robert Strobl] (https://github.com/rstrobl)
|
10
|
-
- [Eurico Doirado] (https://github.com/okoriko)
|
11
|
-
- [Huang Bin](https://github.com/hbin)
|
@@ -1,147 +0,0 @@
|
|
1
|
-
Capistrano::Configuration.instance.load do
|
2
|
-
|
3
|
-
_cset(:sidekiq_default_hooks) { true }
|
4
|
-
|
5
|
-
_cset(:sidekiq_pid) { File.join(shared_path, 'pids', 'sidekiq.pid') }
|
6
|
-
_cset(:sidekiq_env) { fetch(:rack_env, fetch(:rails_env, 'production')) }
|
7
|
-
_cset(:sidekiq_tag) { nil }
|
8
|
-
_cset(:sidekiq_log) { File.join(shared_path, 'log', 'sidekiq.log') }
|
9
|
-
|
10
|
-
_cset(:sidekiq_config) { "#{current_path}/config/sidekiq.yml" }
|
11
|
-
_cset(:sidekiq_options) { nil }
|
12
|
-
_cset(:sidekiq_queue) { nil }
|
13
|
-
_cset(:sidekiq_concurrency) { nil }
|
14
|
-
|
15
|
-
_cset(:sidekiq_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec sidekiq" }
|
16
|
-
_cset(:sidekiqctl_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec sidekiqctl" }
|
17
|
-
|
18
|
-
_cset(:sidekiq_timeout) { 10 }
|
19
|
-
_cset(:sidekiq_role) { :app }
|
20
|
-
|
21
|
-
_cset(:sidekiq_processes) { 1 }
|
22
|
-
_cset(:sidekiq_options_per_process) { nil }
|
23
|
-
|
24
|
-
_cset(:sidekiq_user) { nil }
|
25
|
-
|
26
|
-
if fetch(:sidekiq_default_hooks)
|
27
|
-
before 'deploy:update_code', 'sidekiq:quiet'
|
28
|
-
after 'deploy:stop', 'sidekiq:stop'
|
29
|
-
after 'deploy:start', 'sidekiq:start'
|
30
|
-
before 'deploy:restart', 'sidekiq:restart'
|
31
|
-
end
|
32
|
-
|
33
|
-
namespace :sidekiq do
|
34
|
-
def for_each_process(sidekiq_role, &block)
|
35
|
-
sidekiq_processes = fetch(:"#{ sidekiq_role }_processes") rescue 1
|
36
|
-
sidekiq_processes.times do |idx|
|
37
|
-
pid_file = fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid")
|
38
|
-
yield(pid_file, idx)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def for_each_role
|
43
|
-
sidekiq_roles = fetch(:sidekiq_role)
|
44
|
-
|
45
|
-
sidekiq_roles = if sidekiq_roles.respond_to?(:to_ary)
|
46
|
-
sidekiq_roles.to_ary
|
47
|
-
else
|
48
|
-
[sidekiq_roles]
|
49
|
-
end
|
50
|
-
|
51
|
-
sidekiq_roles.to_ary.each do |sidekiq_role|
|
52
|
-
puts "executing on ##{ sidekiq_role }" if sidekiq_roles.size > 1
|
53
|
-
yield(sidekiq_role)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def run_as(cmd)
|
58
|
-
opts = {
|
59
|
-
roles: sidekiq_role
|
60
|
-
}
|
61
|
-
su_user = fetch(:sidekiq_user)
|
62
|
-
opts[:shell] = "su - #{su_user}" if su_user
|
63
|
-
run cmd, opts
|
64
|
-
end
|
65
|
-
|
66
|
-
def quiet_process(pid_file, idx, sidekiq_role)
|
67
|
-
run_as "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"
|
68
|
-
end
|
69
|
-
|
70
|
-
def stop_process(pid_file, idx, sidekiq_role)
|
71
|
-
run_as "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"
|
72
|
-
end
|
73
|
-
|
74
|
-
def start_process(pid_file, idx, sidekiq_role)
|
75
|
-
args = []
|
76
|
-
args.push "--index #{idx}"
|
77
|
-
args.push "--pidfile #{pid_file}"
|
78
|
-
args.push "--environment #{fetch(:sidekiq_env)}"
|
79
|
-
args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
|
80
|
-
args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
|
81
|
-
args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
|
82
|
-
args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
|
83
|
-
fetch(:sidekiq_queue).each do |queue|
|
84
|
-
args.push "--queue #{queue}"
|
85
|
-
end if fetch(:sidekiq_queue)
|
86
|
-
|
87
|
-
if process_options = fetch(:sidekiq_options_per_process)
|
88
|
-
args.push process_options[idx]
|
89
|
-
end
|
90
|
-
|
91
|
-
args.push fetch(:sidekiq_options)
|
92
|
-
|
93
|
-
if defined?(JRUBY_VERSION)
|
94
|
-
args.push '>/dev/null 2>&1 &'
|
95
|
-
logger.info 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
|
96
|
-
else
|
97
|
-
args.push '--daemon'
|
98
|
-
end
|
99
|
-
|
100
|
-
run_as "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"
|
101
|
-
end
|
102
|
-
|
103
|
-
desc 'Quiet sidekiq (stop accepting new work)'
|
104
|
-
task :quiet, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
105
|
-
for_each_role do |sidekiq_role|
|
106
|
-
for_each_process(sidekiq_role) do |pid_file, idx|
|
107
|
-
quiet_process(pid_file, idx, sidekiq_role)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
desc 'Stop sidekiq'
|
113
|
-
task :stop, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
114
|
-
for_each_role do |sidekiq_role|
|
115
|
-
for_each_process(sidekiq_role) do |pid_file, idx|
|
116
|
-
stop_process(pid_file, idx, sidekiq_role)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
desc 'Start sidekiq'
|
122
|
-
task :start, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
123
|
-
for_each_role do |sidekiq_role|
|
124
|
-
for_each_process(sidekiq_role) do |pid_file, idx|
|
125
|
-
start_process(pid_file, idx, sidekiq_role)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
desc 'Rolling-restart sidekiq'
|
131
|
-
task :rolling_restart, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
132
|
-
for_each_role do |sidekiq_role|
|
133
|
-
for_each_process(sidekiq_role) do |pid_file, idx|
|
134
|
-
stop_process(pid_file, idx, sidekiq_role)
|
135
|
-
start_process(pid_file, idx, sidekiq_role)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
desc 'Restart sidekiq'
|
141
|
-
task :restart, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
|
142
|
-
stop
|
143
|
-
start
|
144
|
-
end
|
145
|
-
|
146
|
-
end
|
147
|
-
end
|