capistrano-sidekiq 1.0.0 → 1.0.1

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 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