capistrano-sidekiq 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 32880c1c6b9be519c9495ac2c5d96339b1349c0d
4
- data.tar.gz: e4957a5475c6b66ca3834c7ebfce013d944df4a1
3
+ metadata.gz: 26aff29f42bea923b68df1bb882bd0ae1a4289ee
4
+ data.tar.gz: b512116ee2722510550958339899136abb399958
5
5
  SHA512:
6
- metadata.gz: '0229b5c4bdcc2504750737b61c8cc1960ff5f1e45f1d0ef19e61a38678862530ef0f1ae563bbc16d93e3be1a23ee0e0ae86c8d348de93c37f52d1b4ed6907883'
7
- data.tar.gz: 651c4e097370eb64cf1a5a695982783522a8804a3a1282552e75a56e36b2fc43e89d59493e77b320abf46a4ca28053d67de8bc951b409371faa97d8ed7785bc4
6
+ metadata.gz: 8b8b90a8bfd058f771270b665bf6c76d43a99312f85ce64ffaf8e6ae01ce14e3f6029f1831f99cb9cf6df926df2ce4c9bade86ee6283a06b1093f9e426d0db05
7
+ data.tar.gz: 6ab3ce241dcc7d8c66ee5e017290187b7d8ed6afc8198c416262c5f3d48d17012d3d970db8a5f4a85773566ed009b0924618a3b28031903470bae19759e428f6
@@ -1,11 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.1
4
+ - Add deploy failure handling @phillbaker
5
+ - Support custom monit filename @zocoi
6
+ - Systemd Integration @baierjan
7
+ - Fix regression in sidekiq_roles variable
8
+ - Fixed pidfile accounting per process @jsantos
9
+ - Rubocop corrections for main task @jsantos
10
+
3
11
  ## 1.0.0
4
12
 
5
13
  - Prepend underscore before service name index @Tensho
6
14
  - Convert CHANGELOG to Markdown @Tensho
7
15
  - Drop support for capistrano 2.0 @Tensho
8
16
  - *BREAKING CHANGE* If people used custom monit template, they should adjust it to use pid_files variable instead of processes_pids. @Tensho
17
+ - *BREAKING CHANGE* `:sidekiq_role` has been renamed to its plural form, `:sidekiq_roles`
9
18
 
10
19
  ## 0.20.0
11
20
 
@@ -17,21 +26,21 @@
17
26
  - `sidekiq:stop` task perpertually callable @Tensho
18
27
 
19
28
  ## 0.5.4
20
-
29
+
21
30
  - Add support for custom count of processes per host in monit task @okoriko
22
-
31
+
23
32
  ## 0.5.3
24
-
33
+
25
34
  - Custom count of processes per each host
26
-
35
+
27
36
  ## 0.5.0
28
-
37
+
29
38
  - Multiple processes @mrsimo
30
-
39
+
31
40
  ## 0.3.9
32
-
41
+
33
42
  - Restore daemon flag from Monit template
34
-
43
+
35
44
  ## 0.3.8
36
45
 
37
46
  - Update monit template: use su instead of sudo / permit all Sidekiq options @bensie
@@ -43,59 +52,59 @@
43
52
  - Run Sidekiq as daemon from Monit @dpaluy
44
53
 
45
54
  ## 0.3.5
46
-
55
+
47
56
  - Added `:sidekiq_tag` for capistrano 2 @OscarBarrett
48
-
57
+
49
58
  ## 0.3.4
50
-
59
+
51
60
  - Fix bug in `sidekiq:start` for capistrano 2 task
52
-
61
+
53
62
  ## 0.3.3
54
-
63
+
55
64
  - `sidekiq:restart` after `deploy:restart` added to default hooks
56
-
65
+
57
66
  ## 0.3.2
58
-
67
+
59
68
  - `:sidekiq_queue` accept an array
60
-
69
+
61
70
  ## 0.3.1
62
-
71
+
63
72
  - Fix logs @rottman
64
73
  - Add concurrency option support @ungsophy
65
-
74
+
66
75
  ## 0.3.0
67
-
76
+
68
77
  - Fix monit task @andreygerasimchuk
69
-
78
+
70
79
  ## 0.2.9
71
-
80
+
72
81
  - Check if current directory exist @alexdunae
73
-
82
+
74
83
  ## 0.2.8
75
-
84
+
76
85
  - Added `:sidekiq_queue` & `:sidekiq_config`
77
-
86
+
78
87
  ## 0.2.7
79
-
88
+
80
89
  - Signal usage @penso
81
-
90
+
82
91
  ## 0.2.6
83
-
92
+
84
93
  - `sidekiq:start` check if sidekiq is running
85
-
94
+
86
95
  ## 0.2.5
87
-
96
+
88
97
  - Bug fixes
89
-
98
+
90
99
  ## 0.2.4
91
-
100
+
92
101
  - Fast deploy with `:sidekiq_run_in_background`
93
-
102
+
94
103
  ## 0.2.3
95
-
104
+
96
105
  - Added monit tasks (alpha)
97
-
106
+
98
107
  ## 0.2.0
99
-
108
+
100
109
  - Added `sidekiq:rolling_restart` @jlecour
101
-
110
+
data/README.md CHANGED
@@ -59,11 +59,22 @@ Configurable options, shown here with defaults:
59
59
  :sidekiq_user => nil #user to run sidekiq as
60
60
  ```
61
61
 
62
+ ## Known issues with Capistrano 3
63
+
62
64
  There is a known bug that prevents sidekiq from starting when pty is true on Capistrano 3.
63
65
  ```ruby
64
66
  set :pty, false
65
67
  ```
66
68
 
69
+ ## Bundler
70
+
71
+ If you'd like to prepend `bundle exec` to your sidekiq and sidekiqctl calls, modify the SSHKit command maps
72
+ in your deploy.rb file:
73
+ ```ruby
74
+ SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
75
+ SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
76
+ ```
77
+
67
78
  ## Multiple processes
68
79
 
69
80
  You can configure sidekiq to start with multiple processes. Just set the proper amount in `sidekiq_processes`.
@@ -89,6 +100,26 @@ server 'example-small.com', roles: [:sidekiq_small]
89
100
  server 'example-big.com', roles: [:sidekiq_big]
90
101
  ```
91
102
 
103
+ ## Integration with systemd
104
+
105
+ Set init system to systemd in the cap deploy config:
106
+
107
+ ```ruby
108
+ set :init_system, :systemd
109
+ ```
110
+
111
+ Install systemd.service template file and enable the service with:
112
+
113
+ ```
114
+ bundle exec cap sidekiq:install
115
+ ```
116
+
117
+ Default name for the service file is `sidekiq-stage.service`. This can be changed as needed, for example:
118
+
119
+ ```ruby
120
+ set :service_unit_name, "sidekiq-#{fetch(:application)}-#{fetch(:stage)}.service"
121
+ ```
122
+
92
123
  ## Customizing the monit sidekiq templates
93
124
 
94
125
  If you need change some config in redactor, you can
@@ -1,3 +1,3 @@
1
1
  module Capistrano
2
- SidekiqVERSION = '1.0.0'
2
+ SidekiqVERSION = '1.0.1'
3
3
  end
@@ -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_conf_file, "#{sidekiq_service_name}.conf"
4
5
  set :sidekiq_monit_use_sudo, true
5
6
  set :monit_bin, '/usr/bin/monit'
6
7
  set :sidekiq_monit_default_hooks, true
@@ -31,7 +32,7 @@ namespace :sidekiq do
31
32
  @role = role
32
33
  upload_sidekiq_template 'sidekiq_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
33
34
 
34
- mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{sidekiq_service_name}.conf"
35
+ mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{fetch(:sidekiq_monit_conf_file)}"
35
36
  sudo_if_needed mv_command
36
37
 
37
38
  sudo_if_needed "#{fetch(:monit_bin)} reload"
@@ -6,16 +6,20 @@ namespace :load do
6
6
  set :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
7
7
  set :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
8
8
  set :sidekiq_timeout, 10
9
- set :sidekiq_roles, :app
9
+ set :sidekiq_roles, fetch(:sidekiq_role, :app)
10
10
  set :sidekiq_processes, 1
11
11
  set :sidekiq_options_per_process, nil
12
12
  set :sidekiq_user, nil
13
13
  # Rbenv, Chruby, and RVM integration
14
- set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
15
- set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
16
- set :chruby_map_bins, fetch(:chruby_map_bins).to_a.concat(%w{ sidekiq sidekiqctl })
14
+ set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w[sidekiq sidekiqctl])
15
+ set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w[sidekiq sidekiqctl])
16
+ set :chruby_map_bins, fetch(:chruby_map_bins).to_a.concat(%w[sidekiq sidekiqctl])
17
17
  # Bundler integration
18
- set :bundle_bins, fetch(:bundle_bins).to_a.concat(%w(sidekiq sidekiqctl))
18
+ set :bundle_bins, fetch(:bundle_bins).to_a.concat(%w[sidekiq sidekiqctl])
19
+ # Init system integration
20
+ set :init_system, -> { nil }
21
+ # systemd integration
22
+ set :service_unit_name, "sidekiq-#{fetch(:stage)}.service"
19
23
  end
20
24
  end
21
25
 
@@ -26,6 +30,9 @@ namespace :deploy do
26
30
  after :publishing, :restart_sidekiq do
27
31
  invoke 'sidekiq:restart' if fetch(:sidekiq_default_hooks)
28
32
  end
33
+ after :failed, :restart_sidekiq do
34
+ invoke 'sidekiq:restart' if fetch(:sidekiq_default_hooks)
35
+ end
29
36
  end
30
37
 
31
38
  namespace :sidekiq do
@@ -40,10 +47,15 @@ namespace :sidekiq do
40
47
  task :quiet do
41
48
  on roles fetch(:sidekiq_roles) do |role|
42
49
  switch_user(role) do
43
- if test("[ -d #{release_path} ]")
44
- each_process_with_index(reverse: true) do |pid_file, idx|
45
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
46
- quiet_sidekiq(pid_file)
50
+ case fetch(:init_system)
51
+ when :systemd
52
+ execute :systemctl, "--user", "reload", fetch(:service_unit_name), raise_on_non_zero_exit: false
53
+ else
54
+ if test("[ -d #{release_path} ]")
55
+ each_process_with_index(reverse: true) do |pid_file, _idx|
56
+ if pid_file_exists?(pid_file) && process_exists?(pid_file)
57
+ quiet_sidekiq(pid_file)
58
+ end
47
59
  end
48
60
  end
49
61
  end
@@ -55,10 +67,15 @@ namespace :sidekiq do
55
67
  task :stop do
56
68
  on roles fetch(:sidekiq_roles) do |role|
57
69
  switch_user(role) do
58
- if test("[ -d #{release_path} ]")
59
- each_process_with_index(reverse: true) do |pid_file, idx|
60
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
61
- stop_sidekiq(pid_file)
70
+ case fetch(:init_system)
71
+ when :systemd
72
+ execute :systemctl, "--user", "stop", fetch(:service_unit_name)
73
+ else
74
+ if test("[ -d #{release_path} ]")
75
+ each_process_with_index(reverse: true) do |pid_file, _idx|
76
+ if pid_file_exists?(pid_file) && process_exists?(pid_file)
77
+ stop_sidekiq(pid_file)
78
+ end
62
79
  end
63
80
  end
64
81
  end
@@ -70,9 +87,14 @@ namespace :sidekiq do
70
87
  task :start do
71
88
  on roles fetch(:sidekiq_roles) do |role|
72
89
  switch_user(role) do
73
- each_process_with_index do |pid_file, idx|
74
- unless pid_file_exists?(pid_file) && process_exists?(pid_file)
75
- start_sidekiq(pid_file, idx)
90
+ case fetch(:init_system)
91
+ when :systemd
92
+ execute :systemctl, '--user', 'start', fetch(:service_unit_name)
93
+ else
94
+ each_process_with_index do |pid_file, idx|
95
+ unless pid_file_exists?(pid_file) && process_exists?(pid_file)
96
+ start_sidekiq(pid_file, idx)
97
+ end
76
98
  end
77
99
  end
78
100
  end
@@ -89,7 +111,7 @@ namespace :sidekiq do
89
111
  task :rolling_restart do
90
112
  on roles fetch(:sidekiq_roles) do |role|
91
113
  switch_user(role) do
92
- each_process_with_index(true) do |pid_file, idx|
114
+ each_process_with_index(reverse: true) do |pid_file, idx|
93
115
  if pid_file_exists?(pid_file) && process_exists?(pid_file)
94
116
  stop_sidekiq(pid_file)
95
117
  end
@@ -103,11 +125,10 @@ namespace :sidekiq do
103
125
  task :cleanup do
104
126
  on roles fetch(:sidekiq_roles) do |role|
105
127
  switch_user(role) do
106
- each_process_with_index do |pid_file, idx|
128
+ each_process_with_index do |pid_file, _idx|
107
129
  unless process_exists?(pid_file)
108
- if pid_file_exists?(pid_file)
109
- execute "rm #{pid_file}"
110
- end
130
+ next unless pid_file_exists?(pid_file)
131
+ execute "rm #{pid_file}"
111
132
  end
112
133
  end
113
134
  end
@@ -121,26 +142,71 @@ namespace :sidekiq do
121
142
  on roles fetch(:sidekiq_roles) do |role|
122
143
  switch_user(role) do
123
144
  each_process_with_index do |pid_file, idx|
124
- unless pid_file_exists?(pid_file)
125
- start_sidekiq(pid_file, idx)
126
- end
145
+ start_sidekiq(pid_file, idx) unless pid_file_exists?(pid_file)
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ task :install do
152
+ on roles fetch(:sidekiq_roles) do |role|
153
+ switch_user(role) do
154
+ case fetch(:init_system)
155
+ when :systemd
156
+ create_systemd_template
157
+ execute :systemctl, "--user", "enable", fetch(:service_unit_name)
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ task :uninstall do
164
+ on roles fetch(:sidekiq_roles) do |role|
165
+ switch_user(role) do
166
+ case fetch(:init_system)
167
+ when :systemd
168
+ execute :systemctl, "--user", "disable", fetch(:service_unit_name)
169
+ execute :rm, File.join(fetch(:service_unit_path, fetch_systemd_unit_path),fetch(:service_unit_name))
127
170
  end
128
171
  end
129
172
  end
130
173
  end
131
174
 
132
175
  def each_process_with_index(reverse: false)
133
- _pid_files = pid_files
134
- _pid_files.reverse! if reverse
135
- _pid_files.each_with_index do |pid_file, idx|
176
+ pid_file_list = pid_files
177
+ pid_file_list.reverse! if reverse
178
+ pid_file_list.each_with_index do |pid_file, idx|
136
179
  within release_path do
137
180
  yield(pid_file, idx)
138
181
  end
139
182
  end
140
183
  end
141
184
 
185
+ def fetch_systemd_unit_path
186
+ home_dir = capture :pwd
187
+ File.join(home_dir, ".config", "systemd", "user")
188
+ end
189
+
190
+ def create_systemd_template
191
+ search_paths = [
192
+ File.expand_path(
193
+ File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
194
+ __FILE__
195
+ ),
196
+ ]
197
+ template_path = search_paths.detect {|path| File.file?(path)}
198
+ template = File.read(template_path)
199
+ systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
200
+ execute :mkdir, "-p", systemd_path
201
+ upload!(
202
+ StringIO.new(ERB.new(template).result(binding)),
203
+ "#{systemd_path}/#{fetch :service_unit_name}"
204
+ )
205
+ execute :systemctl, "--user", "daemon-reload"
206
+ end
207
+
142
208
  def pid_files
143
- sidekiq_roles = Array(fetch(:sidekiq_roles))
209
+ sidekiq_roles = Array(fetch(:sidekiq_roles)).dup
144
210
  sidekiq_roles.select! { |role| host.roles.include?(role) }
145
211
  sidekiq_roles.flat_map do |role|
146
212
  processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
@@ -158,7 +224,7 @@ namespace :sidekiq do
158
224
 
159
225
  def quiet_sidekiq(pid_file)
160
226
  begin
161
- execute :sidekiqctl, 'quiet', "#{pid_file}"
227
+ execute :sidekiqctl, 'quiet', pid_file.to_s
162
228
  rescue SSHKit::Command::Failed
163
229
  # If gems are not installed (first deploy) and sidekiq_default_hooks is active
164
230
  warn 'sidekiqctl not found (ignore if this is the first deploy)'
@@ -166,7 +232,7 @@ namespace :sidekiq do
166
232
  end
167
233
 
168
234
  def stop_sidekiq(pid_file)
169
- execute :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
235
+ execute :sidekiqctl, 'stop', pid_file.to_s, fetch(:sidekiq_timeout)
170
236
  end
171
237
 
172
238
  def start_sidekiq(pid_file, idx = 0)
@@ -182,7 +248,7 @@ namespace :sidekiq do
182
248
  end
183
249
  args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
184
250
  args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
185
- if process_options = fetch(:sidekiq_options_per_process)
251
+ if (process_options = fetch(:sidekiq_options_per_process))
186
252
  args.push process_options[idx]
187
253
  end
188
254
  # use sidekiq_options for special options
@@ -198,13 +264,13 @@ namespace :sidekiq do
198
264
  execute :sidekiq, args.compact.join(' ')
199
265
  end
200
266
 
201
- def switch_user(role, &block)
267
+ def switch_user(role)
202
268
  su_user = sidekiq_user(role)
203
269
  if su_user == role.user
204
- block.call
270
+ yield
205
271
  else
206
272
  as su_user do
207
- block.call
273
+ yield
208
274
  end
209
275
  end
210
276
  end
@@ -212,8 +278,8 @@ namespace :sidekiq do
212
278
  def sidekiq_user(role)
213
279
  properties = role.properties
214
280
  properties.fetch(:sidekiq_user) || # local property for sidekiq only
215
- fetch(:sidekiq_user) ||
216
- properties.fetch(:run_as) || # global property across multiple capistrano gems
217
- role.user
281
+ fetch(:sidekiq_user) ||
282
+ properties.fetch(:run_as) || # global property across multiple capistrano gems
283
+ role.user
218
284
  end
219
285
  end
@@ -0,0 +1,19 @@
1
+ [Unit]
2
+ Description=sidekiq for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
3
+ After=syslog.target network.target
4
+
5
+ [Service]
6
+ Type=simple
7
+ Environment=RAILS_ENV=<%= fetch(:rails_env) %>
8
+ WorkingDirectory=<%= fetch(:deploy_to) %>/current
9
+ ExecStart=<%= fetch(:bundler_path, '/usr/local/bin/bundler') %> exec sidekiq -e <%= fetch(:rails_env) %>
10
+ ExecReload=/bin/kill -TSTP $MAINPID
11
+ ExecStop=/bin/kill -TERM $MAINPID
12
+
13
+ RestartSec=1
14
+ Restart=on-failure
15
+
16
+ SyslogIdentifier=sidekiq
17
+
18
+ [Install]
19
+ 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: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-24 00:00:00.000000000 Z
11
+ date: 2018-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -61,6 +61,7 @@ files:
61
61
  - lib/capistrano/tasks/sidekiq.rake
62
62
  - lib/generators/capistrano/sidekiq/monit/template_generator.rb
63
63
  - lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb
64
+ - lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb
64
65
  homepage: https://github.com/seuros/capistrano-sidekiq
65
66
  licenses:
66
67
  - LGPL-3.0
@@ -81,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
82
  version: '0'
82
83
  requirements: []
83
84
  rubyforge_project:
84
- rubygems_version: 2.6.11
85
+ rubygems_version: 2.6.14
85
86
  signing_key:
86
87
  specification_version: 4
87
88
  summary: Sidekiq integration for Capistrano