sidekiq 2.17.8 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/3.0-Upgrade.md +63 -0
  3. data/Changes.md +66 -3
  4. data/Contributing.md +1 -3
  5. data/Pro-Changes.md +18 -0
  6. data/README.md +2 -2
  7. data/bin/sidekiqctl +19 -6
  8. data/lib/sidekiq.rb +53 -11
  9. data/lib/sidekiq/actor.rb +1 -0
  10. data/lib/sidekiq/api.rb +145 -58
  11. data/lib/sidekiq/cli.rb +22 -18
  12. data/lib/sidekiq/client.rb +44 -14
  13. data/lib/sidekiq/core_ext.rb +5 -8
  14. data/lib/sidekiq/exception_handler.rb +19 -28
  15. data/lib/sidekiq/fetch.rb +3 -3
  16. data/lib/sidekiq/launcher.rb +30 -3
  17. data/lib/sidekiq/logging.rb +2 -2
  18. data/lib/sidekiq/manager.rb +19 -16
  19. data/lib/sidekiq/middleware/chain.rb +1 -1
  20. data/lib/sidekiq/middleware/i18n.rb +1 -1
  21. data/lib/sidekiq/middleware/server/retry_jobs.rb +23 -7
  22. data/lib/sidekiq/processor.rb +36 -54
  23. data/lib/sidekiq/redis_connection.rb +1 -3
  24. data/lib/sidekiq/util.rb +4 -4
  25. data/lib/sidekiq/version.rb +1 -1
  26. data/lib/sidekiq/web.rb +57 -8
  27. data/lib/sidekiq/web_helpers.rb +6 -15
  28. data/lib/sidekiq/worker.rb +3 -1
  29. data/sidekiq.gemspec +5 -5
  30. data/test/test_api.rb +59 -19
  31. data/test/test_cli.rb +1 -1
  32. data/test/test_client.rb +44 -5
  33. data/test/test_exception_handler.rb +4 -87
  34. data/test/test_middleware.rb +3 -2
  35. data/test/test_redis_connection.rb +0 -6
  36. data/test/test_retry.rb +13 -68
  37. data/test/test_scheduled.rb +1 -1
  38. data/test/test_scheduling.rb +5 -0
  39. data/test/test_sidekiq.rb +18 -0
  40. data/test/test_web.rb +98 -58
  41. data/web/assets/stylesheets/application.css +5 -0
  42. data/web/locales/cs.yml +68 -0
  43. data/web/locales/da.yml +9 -1
  44. data/web/locales/de.yml +15 -7
  45. data/web/locales/el.yml +68 -0
  46. data/web/locales/en.yml +8 -3
  47. data/web/locales/es.yml +9 -1
  48. data/web/locales/fr.yml +34 -26
  49. data/web/locales/it.yml +26 -18
  50. data/web/locales/ja.yml +8 -2
  51. data/web/locales/ko.yml +0 -2
  52. data/web/locales/nl.yml +8 -3
  53. data/web/locales/no.yml +9 -3
  54. data/web/locales/pl.yml +0 -1
  55. data/web/locales/pt-br.yml +11 -4
  56. data/web/locales/pt.yml +8 -1
  57. data/web/locales/ru.yml +29 -22
  58. data/web/locales/sv.yml +68 -0
  59. data/web/locales/zh-tw.yml +68 -0
  60. data/web/views/_job_info.erb +8 -2
  61. data/web/views/_summary.erb +13 -7
  62. data/web/views/busy.erb +55 -0
  63. data/web/views/dead.erb +30 -0
  64. data/web/views/layout.erb +1 -0
  65. data/web/views/morgue.erb +66 -0
  66. metadata +29 -30
  67. data/config.ru +0 -18
  68. data/lib/sidekiq/capistrano.rb +0 -5
  69. data/lib/sidekiq/capistrano2.rb +0 -54
  70. data/lib/sidekiq/tasks/sidekiq.rake +0 -119
  71. data/lib/sidekiq/yaml_patch.rb +0 -21
  72. data/test/test_util.rb +0 -18
  73. data/web/views/_workers.erb +0 -22
  74. data/web/views/workers.erb +0 -16
@@ -0,0 +1,55 @@
1
+ <div class="row header">
2
+ <div class="col-sm-7">
3
+ <h3><%= t('Processes') %></h3>
4
+ </div>
5
+ </div>
6
+
7
+ <table class="processes table table-hover table-bordered table-striped table-white">
8
+ <thead>
9
+ <th><%= t('Name') %></th>
10
+ <th><%= t('Started') %></th>
11
+ <th><%= t('Threads') %></th>
12
+ <th><%= t('Busy') %></th>
13
+ </thead>
14
+ <% Sidekiq::ProcessSet.new.each_with_index do |process, index| %>
15
+ <tr>
16
+ <td><%= process['hostname'] %>:<%= process['pid'] %></td>
17
+ <td><%= relative_time(Time.at(process['started_at'])) %></td>
18
+ <td><%= process['concurrency'] %></td>
19
+ <td><%= process['busy'] %></td>
20
+ </tr>
21
+ <% end %>
22
+ </table>
23
+
24
+ <div class="row header">
25
+ <div class="col-sm-7">
26
+ <h3><%= t('Jobs') %></h3>
27
+ </div>
28
+ </div>
29
+
30
+ <table class="workers table table-hover table-bordered table-striped table-white">
31
+ <thead>
32
+ <th><%= t('Process') %></th>
33
+ <th><%= t('TID') %></th>
34
+ <th><%= t('JID') %></th>
35
+ <th><%= t('Queue') %></th>
36
+ <th><%= t('Class') %></th>
37
+ <th><%= t('Arguments') %></th>
38
+ <th><%= t('Started') %></th>
39
+ </thead>
40
+ <% workers.each_with_index do |(process, thread, msg), index| %>
41
+ <tr>
42
+ <td><%= process %></td>
43
+ <td><%= thread %></td>
44
+ <td><%= msg['payload']['jid'] %></td>
45
+ <td>
46
+ <a href="<%= root_path %>queues/<%= msg['queue'] %>"><%= msg['queue'] %></a>
47
+ </td>
48
+ <td><%= msg['payload']['class'] %></td>
49
+ <td>
50
+ <div class="args"><%= display_args(msg['payload']['args']) %></div>
51
+ </td>
52
+ <td><%= relative_time(Time.at(msg['run_at'])) %></td>
53
+ </tr>
54
+ <% end %>
55
+ </table>
@@ -0,0 +1,30 @@
1
+ <%= erb :_job_info, :locals => {:job => @dead, :type => :dead} %>
2
+
3
+ <h3><%= t('Error') %></h3>
4
+ <table class="error table table-bordered table-striped">
5
+ <tbody>
6
+ <tr>
7
+ <th><%= t('ErrorClass') %></th>
8
+ <td>
9
+ <code><%= @dead['error_class'] %></code>
10
+ </td>
11
+ </tr>
12
+ <tr>
13
+ <th><%= t('ErrorMessage') %></th>
14
+ <td><%= h(@dead['error_message']) %></td>
15
+ </tr>
16
+ <% if !@dead['error_backtrace'].nil? %>
17
+ <tr>
18
+ <th><%= t('ErrorBacktrace') %></th>
19
+ <td>
20
+ <code><%= @dead['error_backtrace'].join("<br/>") %></code>
21
+ </td>
22
+ </tr>
23
+ <% end %>
24
+ </tbody>
25
+ </table>
26
+ <form class="form-horizontal" action="<%= root_path %>morgue/<%= job_params(@dead, @dead.score) %>" method="post">
27
+ <a class="btn btn-default" href="<%= root_path %>morgue"><%= t('GoBack') %></a>
28
+ <input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>" />
29
+ <input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>" />
30
+ </form>
@@ -7,6 +7,7 @@
7
7
  <link href="<%= root_path %>stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />
8
8
  <script type="text/javascript" src="<%= root_path %>javascripts/application.js"></script>
9
9
  <script type="text/javascript" src="<%= root_path %>javascripts/locales/jquery.timeago.<%= locale %>.js"></script>
10
+ <meta name="google" value="notranslate" />
10
11
  </head>
11
12
  <body class="admin">
12
13
  <div class="navbar navbar-default navbar-fixed-top">
@@ -0,0 +1,66 @@
1
+ <header class="row">
2
+ <div class="col-sm-5">
3
+ <h3><%= t('DeadJobs') %></h3>
4
+ </div>
5
+ <% if @dead.size > 0 && @total_size > @count %>
6
+ <div class="col-sm-4">
7
+ <%= erb :_paging, :locals => { :url => "#{root_path}morgue" } %>
8
+ </div>
9
+ <% end %>
10
+ <%= filtering('dead') %>
11
+ </header>
12
+
13
+ <% if @dead.size > 0 %>
14
+ <form action="<%= root_path %>morgue" method="post">
15
+ <table class="table table-striped table-bordered table-white">
16
+ <thead>
17
+ <tr>
18
+ <th width="20px" class="table-checkbox">
19
+ <label>
20
+ <input type="checkbox" class="check_all" />
21
+ </label>
22
+ </th>
23
+ <th width="25%"><%= t('LastRetry') %></th>
24
+ <th><%= t('Queue') %></th>
25
+ <th><%= t('Worker') %></th>
26
+ <th><%= t('Arguments') %></th>
27
+ <th><%= t('Error') %></th>
28
+ </tr>
29
+ </thead>
30
+ <% @dead.each do |entry| %>
31
+ <tr>
32
+ <td class="table-checkbox">
33
+ <label>
34
+ <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' />
35
+ </label>
36
+ </td>
37
+ <td>
38
+ <a href="<%= root_path %>morgue/<%= job_params(entry.item, entry.score) %>"><%= relative_time(entry.at) %></a>
39
+ </td>
40
+ <td>
41
+ <a href="<%= root_path %>queues/<%= entry.queue %>"><%= entry.queue %></a>
42
+ </td>
43
+ <td><%= entry.klass %></td>
44
+ <td>
45
+ <div class="args"><%= display_args(entry.args) %></div>
46
+ </td>
47
+ <td>
48
+ <div><%= h truncate("#{entry['error_class']}: #{entry['error_message']}", 200) %></div>
49
+ </td>
50
+ </tr>
51
+ <% end %>
52
+ </table>
53
+ <input class="btn btn-primary btn-xs pull-left" type="submit" name="retry" value="<%= t('RetryNow') %>" />
54
+ <input class="btn btn-danger btn-xs pull-left" type="submit" name="delete" value="<%= t('Delete') %>" />
55
+ </form>
56
+
57
+ <form action="<%= root_path %>morgue/all/delete" method="post">
58
+ <input class="btn btn-danger btn-xs pull-right" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSure') %>" />
59
+ </form>
60
+ <form action="<%= root_path %>morgue/all/retry" method="post">
61
+ <input class="btn btn-danger btn-xs pull-right" type="submit" name="retry" value="<%= t('RetryAll') %>" data-confirm="<%= t('AreYouSure') %>" />
62
+ </form>
63
+
64
+ <% else %>
65
+ <div class="alert alert-success"><%= t('NoDeadJobsFound') %></div>
66
+ <% end %>
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.17.8
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-11 00:00:00.000000000 Z
11
+ date: 2014-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.1'
19
+ version: 3.0.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '3.1'
26
+ version: 3.0.6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: redis-namespace
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: 1.3.1
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: '1.3'
40
+ version: 1.3.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: connection_pool
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: 2.0.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '2.0'
54
+ version: 2.0.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: celluloid
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.15.2
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.15.2
69
69
  - !ruby/object:Gem::Dependency
@@ -126,16 +126,16 @@ dependencies:
126
126
  name: rails
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 4.0.5
131
+ version: 4.0.0
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: 4.0.5
138
+ version: 4.0.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: coveralls
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -161,6 +161,7 @@ extra_rdoc_files: []
161
161
  files:
162
162
  - ".gitignore"
163
163
  - ".travis.yml"
164
+ - 3.0-Upgrade.md
164
165
  - COMM-LICENSE
165
166
  - Changes.md
166
167
  - Contributing.md
@@ -171,12 +172,9 @@ files:
171
172
  - Rakefile
172
173
  - bin/sidekiq
173
174
  - bin/sidekiqctl
174
- - config.ru
175
175
  - lib/sidekiq.rb
176
176
  - lib/sidekiq/actor.rb
177
177
  - lib/sidekiq/api.rb
178
- - lib/sidekiq/capistrano.rb
179
- - lib/sidekiq/capistrano2.rb
180
178
  - lib/sidekiq/cli.rb
181
179
  - lib/sidekiq/client.rb
182
180
  - lib/sidekiq/core_ext.rb
@@ -199,7 +197,6 @@ files:
199
197
  - lib/sidekiq/rails.rb
200
198
  - lib/sidekiq/redis_connection.rb
201
199
  - lib/sidekiq/scheduled.rb
202
- - lib/sidekiq/tasks/sidekiq.rake
203
200
  - lib/sidekiq/testing.rb
204
201
  - lib/sidekiq/testing/inline.rb
205
202
  - lib/sidekiq/util.rb
@@ -207,7 +204,6 @@ files:
207
204
  - lib/sidekiq/web.rb
208
205
  - lib/sidekiq/web_helpers.rb
209
206
  - lib/sidekiq/worker.rb
210
- - lib/sidekiq/yaml_patch.rb
211
207
  - sidekiq.gemspec
212
208
  - test/config.yml
213
209
  - test/env_based_config.yml
@@ -231,7 +227,6 @@ files:
231
227
  - test/test_testing.rb
232
228
  - test/test_testing_fake.rb
233
229
  - test/test_testing_inline.rb
234
- - test/test_util.rb
235
230
  - test/test_web.rb
236
231
  - web/assets/images/bootstrap/glyphicons-halflings-white.png
237
232
  - web/assets/images/bootstrap/glyphicons-halflings.png
@@ -288,8 +283,10 @@ files:
288
283
  - web/assets/javascripts/locales/jquery.timeago.zh-TW.js
289
284
  - web/assets/stylesheets/application.css
290
285
  - web/assets/stylesheets/bootstrap.css
286
+ - web/locales/cs.yml
291
287
  - web/locales/da.yml
292
288
  - web/locales/de.yml
289
+ - web/locales/el.yml
293
290
  - web/locales/en.yml
294
291
  - web/locales/es.yml
295
292
  - web/locales/fr.yml
@@ -302,22 +299,25 @@ files:
302
299
  - web/locales/pt-br.yml
303
300
  - web/locales/pt.yml
304
301
  - web/locales/ru.yml
302
+ - web/locales/sv.yml
303
+ - web/locales/zh-tw.yml
305
304
  - web/views/_job_info.erb
306
305
  - web/views/_nav.erb
307
306
  - web/views/_paging.erb
308
307
  - web/views/_poll.erb
309
308
  - web/views/_status.erb
310
309
  - web/views/_summary.erb
311
- - web/views/_workers.erb
310
+ - web/views/busy.erb
312
311
  - web/views/dashboard.erb
312
+ - web/views/dead.erb
313
313
  - web/views/layout.erb
314
+ - web/views/morgue.erb
314
315
  - web/views/queue.erb
315
316
  - web/views/queues.erb
316
317
  - web/views/retries.erb
317
318
  - web/views/retry.erb
318
319
  - web/views/scheduled.erb
319
320
  - web/views/scheduled_job_info.erb
320
- - web/views/workers.erb
321
321
  homepage: http://sidekiq.org
322
322
  licenses:
323
323
  - LGPL-3.0
@@ -338,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
338
  version: '0'
339
339
  requirements: []
340
340
  rubyforge_project:
341
- rubygems_version: 2.4.1
341
+ rubygems_version: 2.2.2
342
342
  signing_key:
343
343
  specification_version: 4
344
344
  summary: Simple, efficient background processing for Ruby
@@ -365,5 +365,4 @@ test_files:
365
365
  - test/test_testing.rb
366
366
  - test/test_testing_fake.rb
367
367
  - test/test_testing_inline.rb
368
- - test/test_util.rb
369
368
  - test/test_web.rb
data/config.ru DELETED
@@ -1,18 +0,0 @@
1
- require 'sidekiq'
2
-
3
- Sidekiq.configure_client do |config|
4
- config.redis = { :size => 1 }
5
- end
6
-
7
- #Sidekiq.redis {|conn| conn.flushdb }
8
- #10.times do |idx|
9
- #Sidekiq::Client.push('class' => 'HardWorker', 'args' => ['foo', 0.1, idx])
10
- #end
11
-
12
- #Sidekiq.redis { |conn| conn.zadd('retry', Time.now.utc.to_f + 3000, MultiJson.encode({
13
- #'class' => 'HardWorker', 'args' => ['foo', 0.1, Time.now.to_f],
14
- #'queue' => 'default', 'error_message' => 'No such method', 'error_class' => 'NoMethodError',
15
- #'failed_at' => Time.now.to_i, 'retry_count' => 0 })) }
16
-
17
- require 'sidekiq/web'
18
- run Sidekiq::Web
@@ -1,5 +0,0 @@
1
- if defined?(Capistrano::VERSION) && Gem::Version.new(Capistrano::VERSION).release >= Gem::Version.new('3.0.0')
2
- load File.expand_path("../tasks/sidekiq.rake", __FILE__)
3
- else
4
- require_relative 'capistrano2'
5
- end
@@ -1,54 +0,0 @@
1
- Capistrano::Configuration.instance.load do
2
-
3
- _cset(:sidekiq_default_hooks) { true }
4
- _cset(:sidekiq_cmd) { "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" }
5
- _cset(:sidekiqctl_cmd) { "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" }
6
- _cset(:sidekiq_timeout) { 10 }
7
- _cset(:sidekiq_role) { :app }
8
- _cset(:sidekiq_pid) { "#{current_path}/tmp/pids/sidekiq.pid" }
9
- _cset(:sidekiq_processes) { 1 }
10
-
11
- if fetch(:sidekiq_default_hooks)
12
- before "deploy:update_code", "sidekiq:quiet"
13
- after "deploy:stop", "sidekiq:stop"
14
- after "deploy:start", "sidekiq:start"
15
- before "deploy:restart", "sidekiq:restart"
16
- end
17
-
18
- namespace :sidekiq do
19
- def for_each_process(&block)
20
- fetch(:sidekiq_processes).times do |idx|
21
- yield((idx == 0 ? "#{fetch(:sidekiq_pid)}" : "#{fetch(:sidekiq_pid)}-#{idx}"), idx)
22
- end
23
- end
24
-
25
- desc "Quiet sidekiq (stop accepting new work)"
26
- task :quiet, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
27
- for_each_process do |pid_file, idx|
28
- 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"
29
- end
30
- end
31
-
32
- desc "Stop sidekiq"
33
- task :stop, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
34
- for_each_process do |pid_file, idx|
35
- 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"
36
- end
37
- end
38
-
39
- desc "Start sidekiq"
40
- task :start, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
41
- rails_env = fetch(:rails_env, "production")
42
- for_each_process do |pid_file, idx|
43
- run "cd #{current_path} ; nohup #{fetch(:sidekiq_cmd)} -e #{rails_env} -i #{idx} -P #{pid_file} >> #{current_path}/log/sidekiq.log 2>&1 &", :pty => false
44
- end
45
- end
46
-
47
- desc "Restart sidekiq"
48
- task :restart, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
49
- stop
50
- start
51
- end
52
-
53
- end
54
- end
@@ -1,119 +0,0 @@
1
- namespace :load do
2
- task :defaults do
3
-
4
- set :sidekiq_default_hooks, ->{ true }
5
-
6
- # If you need a special boot commands
7
- #
8
- # set :sidekiq_cmd, ->{ "bundle exec sidekiq" }
9
- # set :sidekiqctl_cmd, ->{ "bundle exec sidekiqctl" }
10
- set :sidekiq_cmd, ->{ }
11
- set :sidekiqctl_cmd, ->{ }
12
-
13
- # If this changes, you'll need to manually
14
- # stop the existing sidekiq process.
15
- set :sidekiq_pid, ->{ "tmp/sidekiq.pid" }
16
-
17
- # "-d -i INT -P PATH" are added automatically.
18
- set :sidekiq_options, ->{ "-e #{fetch(:rails_env, 'production')} -L #{current_path}/log/sidekiq.log" }
19
-
20
- set :sidekiq_timeout, ->{ 10 }
21
- set :sidekiq_role, ->{ :app }
22
- set :sidekiq_processes, ->{ 1 }
23
- end
24
- end
25
-
26
- namespace :deploy do
27
- before :starting, :check_sidekiq_hooks do
28
- invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
29
- end
30
- end
31
-
32
- namespace :sidekiq do
33
- def for_each_process(&block)
34
- fetch(:sidekiq_processes).times do |idx|
35
- yield((idx == 0 ? "#{fetch(:sidekiq_pid)}" : "#{fetch(:sidekiq_pid)}-#{idx}"), idx)
36
- end
37
- end
38
-
39
- def pid_full_path(pid_path)
40
- if pid_path.start_with?("/")
41
- pid_path
42
- else
43
- "#{current_path}/#{pid_path}"
44
- end
45
- end
46
-
47
- task :add_default_hooks do
48
- after 'deploy:starting', 'sidekiq:quiet'
49
- after 'deploy:updated', 'sidekiq:stop'
50
- after 'deploy:reverted', 'sidekiq:stop'
51
- after 'deploy:published', 'sidekiq:start'
52
- end
53
-
54
- desc "Quiet sidekiq (stop accepting new work)"
55
- task :quiet do
56
- on roles fetch(:sidekiq_role) do
57
- for_each_process do |pid_file, idx|
58
- if test "[ -f #{pid_full_path(pid_file)} ]"
59
- within current_path do
60
- if fetch(:sidekiqctl_cmd)
61
- execute fetch(:sidekiqctl_cmd), 'quiet', "#{pid_full_path(pid_file)}"
62
- else
63
- execute :bundle, :exec, :sidekiqctl, 'quiet', "#{pid_full_path(pid_file)}"
64
- end
65
- end
66
- end
67
- end
68
- end
69
- end
70
-
71
- desc "Stop sidekiq"
72
- task :stop do
73
- on roles fetch(:sidekiq_role) do
74
- for_each_process do |pid_file, idx|
75
- if test "[ -f #{pid_full_path(pid_file)} ]"
76
- within current_path do
77
- if fetch(:sidekiqctl_cmd)
78
- execute fetch(:sidekiqctl_cmd), 'stop', "#{pid_full_path(pid_file)}", fetch(:sidekiq_timeout)
79
- else
80
- execute :bundle, :exec, :sidekiqctl, 'stop', "#{pid_full_path(pid_file)}", fetch(:sidekiq_timeout)
81
- end
82
- end
83
- end
84
- end
85
- end
86
- end
87
-
88
- desc "Start sidekiq"
89
- task :start do
90
- on roles fetch(:sidekiq_role) do
91
- rails_env = fetch(:rails_env, "production")
92
- within current_path do
93
- for_each_process do |pid_file, idx|
94
- if !defined? JRUBY_VERSION
95
- if fetch(:sidekiq_cmd)
96
- execute fetch(:sidekiq_cmd), "-d -i #{idx} -P #{pid_full_path(pid_file)} #{fetch(:sidekiq_options)}"
97
- else
98
- execute :bundle, :exec, :sidekiq, "-d -i #{idx} -P #{pid_full_path(pid_file)} #{fetch(:sidekiq_options)}"
99
- end
100
- else
101
- execute "echo 'Since JRuby doesn't support Process.daemon, Sidekiq will be running without the -d flag."
102
- if fetch(:sidekiq_cmd)
103
- execute fetch(:sidekiq_cmd), "-i #{idx} -P #{pid_full_path(pid_file)} #{fetch(:sidekiq_options)} >/dev/null 2>&1 &"
104
- else
105
- execute :bundle, :exec, :sidekiq, "-i #{idx} -P #{pid_full_path(pid_file)} #{fetch(:sidekiq_options)} >/dev/null 2>&1 &"
106
- end
107
- end
108
- end
109
- end
110
- end
111
- end
112
-
113
- desc "Restart sidekiq"
114
- task :restart do
115
- invoke 'sidekiq:stop'
116
- invoke 'sidekiq:start'
117
- end
118
-
119
- end