capistrano-sidekiq 1.0.2 → 2.0.0.beta4

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
- SHA1:
3
- metadata.gz: de33c4866848767330e460a97d79f5f1d893a097
4
- data.tar.gz: 66c5d04a7c20407109c58d94f9ec753aae609f2a
2
+ SHA256:
3
+ metadata.gz: 5c60b9de8a0a367ebba98dad3f99cbf3cbee2cc975a42cbe56ff35a0785ee964
4
+ data.tar.gz: e8e4dfed5f061db2fa453215df32293469f9bffa6bc9ff0fa1917cef45b31765
5
5
  SHA512:
6
- metadata.gz: b6e2fb6a18bdeefcc701b4117f98a526f8b2480e2aa9c06aa2aa9fc8dcf593a427724a2daefe65e2eb880c2d6e15b321f9bc05cd7de5bdbda406274959499ba4
7
- data.tar.gz: 8e03edcb511a08082e157e07622ecbb49068d205a8715b6debb019df8f757bf8ea771fc511cf239daab109a40028888bda2d09cf08eb64d90d73494edaa4977a
6
+ metadata.gz: 50b2da50e06404fcd6298d1be4a0f1df560e519c990ed9a92ae5feff1a90addfc359b91e0f17fa9d5032621d8648f91bd2c4b6a36ebac86cdfd014ee2bf67094
7
+ data.tar.gz: 4892c095fa04edddea3474e974a95dcb219490b26950a82793035471b84e362527cd45988cf945279c4118ef768c56fb471d94ec7f729e80129f4a5342e9f716
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  .idea
19
+ *.iml
@@ -0,0 +1 @@
1
+ ruby 2.6.5
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.3
4
+ - Add upstart support
5
+ - Fix monit service name
6
+
3
7
  ## 1.0.2
4
8
  - Fix deployment flow hooks
5
9
 
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/capistrano-sidekiq.svg)](http://badge.fury.io/rb/capistrano-sidekiq)
2
- [![Dependency Status](https://gemnasium.com/seuros/capistrano-sidekiq.svg)](https://gemnasium.com/seuros/capistrano-sidekiq)
3
2
 
4
3
  # Capistrano::Sidekiq
5
4
 
@@ -7,12 +6,6 @@ Sidekiq integration for Capistrano
7
6
 
8
7
  ## Installation
9
8
 
10
- Add this line to your application's Gemfile:
11
-
12
- gem 'capistrano-sidekiq', github: 'seuros/capistrano-sidekiq'
13
-
14
- or:
15
-
16
9
  gem 'capistrano-sidekiq', group: :development
17
10
 
18
11
  And then execute:
@@ -22,29 +15,34 @@ And then execute:
22
15
 
23
16
  ## Usage
24
17
  ```ruby
25
- # Capfile
26
- require 'capistrano/sidekiq'
27
- require 'capistrano/sidekiq/monit' #to require monit tasks # Only for capistrano3
18
+ # Capfile
19
+
20
+ require 'capistrano/sidekiq'
21
+ install_plugin Capistrano::Sidekiq # Default sidekiq tasks
22
+ # Then select your service manager
23
+ install_plugin Capistrano::Sidekiq::Systemd
24
+ # or
25
+ install_plugin Capistrano::Sidekiq::Upstart # tests needed
26
+ # or
27
+ install_plugin Capistrano::Sidekiq::Monit # tests needed
28
28
  ```
29
29
 
30
30
 
31
31
  Configurable options, shown here with defaults:
32
32
 
33
33
  ```ruby
34
+ :sidekiq_roles => :app
34
35
  :sidekiq_default_hooks => true
35
36
  :sidekiq_pid => File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') # ensure this path exists in production before deploying.
36
37
  :sidekiq_env => fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
37
38
  :sidekiq_log => File.join(shared_path, 'log', 'sidekiq.log')
38
- :sidekiq_options => nil
39
- :sidekiq_require => nil
40
- :sidekiq_tag => nil
41
- :sidekiq_config => nil # if you have a config/sidekiq.yml, do not forget to set this.
42
- :sidekiq_queue => nil
43
- :sidekiq_timeout => 10
44
- :sidekiq_roles => :app
45
- :sidekiq_processes => 1
46
- :sidekiq_options_per_process => nil
47
- :sidekiq_concurrency => nil
39
+
40
+ # sidekiq systemd options
41
+ :sidekiq_service_unit_name => 'sidekiq'
42
+ :sidekiq_service_unit_user => :user # :system
43
+ :sidekiq_enable_lingering => true
44
+ :sidekiq_lingering_user => nil
45
+
48
46
  # sidekiq monit
49
47
  :sidekiq_monit_templates_path => 'config/deploy/templates'
50
48
  :sidekiq_monit_conf_dir => '/etc/monit/conf.d'
@@ -52,10 +50,8 @@ Configurable options, shown here with defaults:
52
50
  :monit_bin => '/usr/bin/monit'
53
51
  :sidekiq_monit_default_hooks => true
54
52
  :sidekiq_monit_group => nil
55
- :sidekiq_service_name => "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}" + (index ? "_#{index}" : '')
53
+ :sidekiq_service_name => "sidekiq_#{fetch(:application)}"
56
54
 
57
- :sidekiq_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" # Only for capistrano2.5
58
- :sidekiqctl_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" # Only for capistrano2.5
59
55
  :sidekiq_user => nil #user to run sidekiq as
60
56
  ```
61
57
 
@@ -75,50 +71,6 @@ SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
75
71
  SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
76
72
  ```
77
73
 
78
- ## Multiple processes
79
-
80
- You can configure sidekiq to start with multiple processes. Just set the proper amount in `sidekiq_processes`.
81
-
82
- You can also customize the configuration for every process. If you want to do that, just set
83
- `sidekiq_options_per_process` with an array of the configuration options that you want in string format.
84
- This example should boot the first process with the queue `high` and the second one with the queues `default`
85
- and `low`:
86
-
87
- ```ruby
88
- set :sidekiq_options_per_process, ["--queue high", "--queue default --queue low"]
89
- ```
90
-
91
- ## Different number of processes per role
92
-
93
- You can configure how many processes you want to run on each host next way:
94
-
95
- ```ruby
96
- set :sidekiq_roles, [:sidekiq_small, :sidekiq_big]
97
- set :sidekiq_small_processes, 1
98
- set :sidekiq_big_processes, 4
99
- server 'example-small.com', roles: [:sidekiq_small]
100
- server 'example-big.com', roles: [:sidekiq_big]
101
- ```
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
74
 
123
75
  ## Customizing the monit sidekiq templates
124
76
 
@@ -18,5 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ['lib']
19
19
 
20
20
  spec.add_dependency 'capistrano', '>= 3.9.0'
21
- spec.add_dependency 'sidekiq', '>= 3.4'
21
+ spec.add_dependency 'capistrano-bundler'
22
+ spec.add_dependency 'sidekiq', '>= 6.0'
22
23
  end
@@ -1 +1,30 @@
1
- load File.expand_path('../tasks/sidekiq.rake', __FILE__)
1
+ require 'capistrano/bundler'
2
+ require "capistrano/plugin"
3
+
4
+ module Capistrano
5
+ class Sidekiq < Capistrano::Plugin
6
+ def define_tasks
7
+ eval_rakefile File.expand_path('../tasks/sidekiq.rake', __FILE__)
8
+ end
9
+
10
+ def set_defaults
11
+ set_if_empty :sidekiq_default_hooks, true
12
+
13
+ set_if_empty :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:rake_env, fetch(:stage)))) }
14
+ set_if_empty :sidekiq_roles, fetch(:sidekiq_role, :app)
15
+ set_if_empty :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
16
+ set_if_empty :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq.error.log') }
17
+ # Rbenv, Chruby, and RVM integration
18
+ append :rbenv_map_bins, 'sidekiq', 'sidekiqctl'
19
+ append :rvm_map_bins, 'sidekiq', 'sidekiqctl'
20
+ append :chruby_map_bins, 'sidekiq', 'sidekiqctl'
21
+ # Bundler integration
22
+ append :bundle_bins, 'sidekiq', 'sidekiqctl'
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+ require_relative 'sidekiq/systemd'
29
+ require_relative 'sidekiq/upstart'
30
+ require_relative 'sidekiq/monit'
@@ -1 +1,17 @@
1
- load File.expand_path('../../tasks/monit.rake', __FILE__)
1
+ module Capistrano
2
+ class Sidekiq::Monit < Capistrano::Plugin
3
+ def set_defaults
4
+ set_if_empty :monit_bin, '/usr/bin/monit'
5
+ set_if_empty :sidekiq_monit_conf_dir, '/etc/monit/conf.d'
6
+ set_if_empty :sidekiq_monit_conf_file, -> { "#{sidekiq_service_name}.conf" }
7
+ set_if_empty :sidekiq_monit_use_sudo, true
8
+ set_if_empty :sidekiq_monit_default_hooks, true
9
+ set_if_empty :sidekiq_monit_templates_path, 'config/deploy/templates'
10
+ set_if_empty :sidekiq_monit_group, nil
11
+ end
12
+
13
+ def define_tasks
14
+ eval_rakefile File.expand_path('../../tasks/monit.rake', __FILE__)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ module Capistrano
2
+ class Sidekiq::Systemd < Capistrano::Plugin
3
+ def set_defaults
4
+ set_if_empty :sidekiq_service_unit_name, 'sidekiq'
5
+ set_if_empty :sidekiq_service_unit_user, :user # :system
6
+ set_if_empty :sidekiq_enable_lingering, true
7
+ set_if_empty :sidekiq_lingering_user, nil
8
+ end
9
+
10
+ def define_tasks
11
+ eval_rakefile File.expand_path('../../tasks/systemd.rake', __FILE__)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Capistrano
2
+ class Sidekiq::Upstart < Capistrano::Plugin
3
+ def set_defaults
4
+ set_if_empty :sidekiq_service_unit_name, 'sidekiq'
5
+ end
6
+
7
+ def define_tasks
8
+ eval_rakefile File.expand_path('../../tasks/upstart.rake', __FILE__)
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Capistrano
2
- SidekiqVERSION = '1.0.2'
2
+ SidekiqVERSION = '2.0.0.beta4'
3
3
  end
@@ -1,7 +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
+ set :sidekiq_monit_conf_file, -> { "#{sidekiq_service_name}.conf" }
5
5
  set :sidekiq_monit_use_sudo, true
6
6
  set :monit_bin, '/usr/bin/monit'
7
7
  set :sidekiq_monit_default_hooks, true
@@ -1,28 +1,3 @@
1
- namespace :load do
2
- task :defaults do
3
- set :sidekiq_default_hooks, true
4
-
5
- set :sidekiq_pid, -> { File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') }
6
- set :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
7
- set :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
8
- set :sidekiq_timeout, 10
9
- set :sidekiq_roles, fetch(:sidekiq_role, :app)
10
- set :sidekiq_processes, 1
11
- set :sidekiq_options_per_process, nil
12
- set :sidekiq_user, nil
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])
17
- # Bundler integration
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"
23
- end
24
- end
25
-
26
1
  namespace :deploy do
27
2
  before :starting, :check_sidekiq_hooks do
28
3
  invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
@@ -31,249 +6,15 @@ end
31
6
 
32
7
  namespace :sidekiq do
33
8
  task :add_default_hooks do
34
- after 'deploy:starting', 'sidekiq:quiet'
35
- after 'deploy:updated', 'sidekiq:stop'
9
+ after 'deploy:starting', 'sidekiq:quiet'
10
+ after 'deploy:updated', 'sidekiq:stop'
36
11
  after 'deploy:published', 'sidekiq:start'
37
12
  after 'deploy:failed', 'sidekiq:restart'
38
13
  end
39
14
 
40
- desc 'Quiet sidekiq (stop fetching new tasks from Redis)'
41
- task :quiet do
42
- on roles fetch(:sidekiq_roles) do |role|
43
- switch_user(role) do
44
- case fetch(:init_system)
45
- when :systemd
46
- execute :systemctl, "--user", "reload", fetch(:service_unit_name), raise_on_non_zero_exit: false
47
- else
48
- if test("[ -d #{release_path} ]")
49
- each_process_with_index(reverse: true) do |pid_file, _idx|
50
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
51
- quiet_sidekiq(pid_file)
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
59
-
60
- desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
61
- task :stop do
62
- on roles fetch(:sidekiq_roles) do |role|
63
- switch_user(role) do
64
- case fetch(:init_system)
65
- when :systemd
66
- execute :systemctl, "--user", "stop", fetch(:service_unit_name)
67
- else
68
- if test("[ -d #{release_path} ]")
69
- each_process_with_index(reverse: true) do |pid_file, _idx|
70
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
71
- stop_sidekiq(pid_file)
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
78
- end
79
-
80
- desc 'Start sidekiq'
81
- task :start do
82
- on roles fetch(:sidekiq_roles) do |role|
83
- switch_user(role) do
84
- case fetch(:init_system)
85
- when :systemd
86
- execute :systemctl, '--user', 'start', fetch(:service_unit_name)
87
- else
88
- each_process_with_index do |pid_file, idx|
89
- unless pid_file_exists?(pid_file) && process_exists?(pid_file)
90
- start_sidekiq(pid_file, idx)
91
- end
92
- end
93
- end
94
- end
95
- end
96
- end
97
-
98
15
  desc 'Restart sidekiq'
99
16
  task :restart do
100
17
  invoke! 'sidekiq:stop'
101
18
  invoke! 'sidekiq:start'
102
19
  end
103
-
104
- desc 'Rolling-restart sidekiq'
105
- task :rolling_restart do
106
- on roles fetch(:sidekiq_roles) do |role|
107
- switch_user(role) do
108
- each_process_with_index(reverse: true) do |pid_file, idx|
109
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
110
- stop_sidekiq(pid_file)
111
- end
112
- start_sidekiq(pid_file, idx)
113
- end
114
- end
115
- end
116
- end
117
-
118
- desc 'Delete any pid file not in use'
119
- task :cleanup do
120
- on roles fetch(:sidekiq_roles) do |role|
121
- switch_user(role) do
122
- each_process_with_index do |pid_file, _idx|
123
- unless process_exists?(pid_file)
124
- next unless pid_file_exists?(pid_file)
125
- execute "rm #{pid_file}"
126
- end
127
- end
128
- end
129
- end
130
- end
131
-
132
- # TODO: Don't start if all processes are off, raise warning.
133
- desc 'Respawn missing sidekiq processes'
134
- task :respawn do
135
- invoke 'sidekiq:cleanup'
136
- on roles fetch(:sidekiq_roles) do |role|
137
- switch_user(role) do
138
- each_process_with_index do |pid_file, idx|
139
- start_sidekiq(pid_file, idx) unless pid_file_exists?(pid_file)
140
- end
141
- end
142
- end
143
- end
144
-
145
- task :install do
146
- on roles fetch(:sidekiq_roles) do |role|
147
- switch_user(role) do
148
- case fetch(:init_system)
149
- when :systemd
150
- create_systemd_template
151
- execute :systemctl, "--user", "enable", fetch(:service_unit_name)
152
- end
153
- end
154
- end
155
- end
156
-
157
- task :uninstall do
158
- on roles fetch(:sidekiq_roles) do |role|
159
- switch_user(role) do
160
- case fetch(:init_system)
161
- when :systemd
162
- execute :systemctl, "--user", "disable", fetch(:service_unit_name)
163
- execute :rm, File.join(fetch(:service_unit_path, fetch_systemd_unit_path),fetch(:service_unit_name))
164
- end
165
- end
166
- end
167
- end
168
-
169
- def each_process_with_index(reverse: false)
170
- pid_file_list = pid_files
171
- pid_file_list.reverse! if reverse
172
- pid_file_list.each_with_index do |pid_file, idx|
173
- within release_path do
174
- yield(pid_file, idx)
175
- end
176
- end
177
- end
178
-
179
- def fetch_systemd_unit_path
180
- home_dir = capture :pwd
181
- File.join(home_dir, ".config", "systemd", "user")
182
- end
183
-
184
- def create_systemd_template
185
- search_paths = [
186
- File.expand_path(
187
- File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
188
- __FILE__
189
- ),
190
- ]
191
- template_path = search_paths.detect {|path| File.file?(path)}
192
- template = File.read(template_path)
193
- systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
194
- execute :mkdir, "-p", systemd_path
195
- upload!(
196
- StringIO.new(ERB.new(template).result(binding)),
197
- "#{systemd_path}/#{fetch :service_unit_name}"
198
- )
199
- execute :systemctl, "--user", "daemon-reload"
200
- end
201
-
202
- def pid_files
203
- sidekiq_roles = Array(fetch(:sidekiq_roles)).dup
204
- sidekiq_roles.select! { |role| host.roles.include?(role) }
205
- sidekiq_roles.flat_map do |role|
206
- processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
207
- Array.new(processes) { |idx| fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid") }
208
- end
209
- end
210
-
211
- def pid_file_exists?(pid_file)
212
- test(*("[ -f #{pid_file} ]").split(' '))
213
- end
214
-
215
- def process_exists?(pid_file)
216
- test(*("kill -0 $( cat #{pid_file} )").split(' '))
217
- end
218
-
219
- def quiet_sidekiq(pid_file)
220
- begin
221
- execute :sidekiqctl, 'quiet', pid_file.to_s
222
- rescue SSHKit::Command::Failed
223
- # If gems are not installed (first deploy) and sidekiq_default_hooks is active
224
- warn 'sidekiqctl not found (ignore if this is the first deploy)'
225
- end
226
- end
227
-
228
- def stop_sidekiq(pid_file)
229
- execute :sidekiqctl, 'stop', pid_file.to_s, fetch(:sidekiq_timeout)
230
- end
231
-
232
- def start_sidekiq(pid_file, idx = 0)
233
- args = []
234
- args.push "--index #{idx}"
235
- args.push "--pidfile #{pid_file}"
236
- args.push "--environment #{fetch(:sidekiq_env)}"
237
- args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
238
- args.push "--require #{fetch(:sidekiq_require)}" if fetch(:sidekiq_require)
239
- args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
240
- Array(fetch(:sidekiq_queue)).each do |queue|
241
- args.push "--queue #{queue}"
242
- end
243
- args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
244
- args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
245
- if (process_options = fetch(:sidekiq_options_per_process))
246
- args.push process_options[idx]
247
- end
248
- # use sidekiq_options for special options
249
- args.push fetch(:sidekiq_options) if fetch(:sidekiq_options)
250
-
251
- if defined?(JRUBY_VERSION)
252
- args.push '>/dev/null 2>&1 &'
253
- warn 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
254
- else
255
- args.push '--daemon'
256
- end
257
-
258
- execute :sidekiq, args.compact.join(' ')
259
- end
260
-
261
- def switch_user(role)
262
- su_user = sidekiq_user(role)
263
- if su_user == role.user
264
- yield
265
- else
266
- as su_user do
267
- yield
268
- end
269
- end
270
- end
271
-
272
- def sidekiq_user(role)
273
- properties = role.properties
274
- properties.fetch(:sidekiq_user) || # local property for sidekiq only
275
- fetch(:sidekiq_user) ||
276
- properties.fetch(:run_as) || # global property across multiple capistrano gems
277
- role.user
278
- end
279
20
  end
@@ -0,0 +1,135 @@
1
+ git_plugin = self
2
+
3
+ namespace :sidekiq do
4
+ desc 'Quiet sidekiq (stop fetching new tasks from Redis)'
5
+ task :quiet do
6
+ on roles fetch(:sidekiq_roles) do |role|
7
+ git_plugin.switch_user(role) do
8
+ if fetch(:sidekiq_service_unit_user) == :system
9
+ execute :sudo, :systemctl, "reload", fetch(:sidekiq_service_unit_name), raise_on_non_zero_exit: false
10
+ else
11
+ execute :systemctl, "--user", "reload", fetch(:sidekiq_service_unit_name), raise_on_non_zero_exit: false
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
18
+ task :stop do
19
+ on roles fetch(:sidekiq_roles) do |role|
20
+ git_plugin.switch_user(role) do
21
+ if fetch(:sidekiq_service_unit_user) == :system
22
+ execute :sudo, :systemctl, "stop", fetch(:sidekiq_service_unit_name)
23
+ else
24
+ execute :systemctl, "--user", "stop", fetch(:sidekiq_service_unit_name)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ desc 'Start sidekiq'
31
+ task :start do
32
+ on roles fetch(:sidekiq_roles) do |role|
33
+ git_plugin.switch_user(role) do
34
+ if fetch(:sidekiq_service_unit_user) == :system
35
+ execute :sudo, :systemctl, 'start', fetch(:sidekiq_service_unit_name)
36
+ else
37
+ execute :systemctl, '--user', 'start', fetch(:sidekiq_service_unit_name)
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ desc 'Install systemd sidekiq service'
44
+ task :install do
45
+ on roles fetch(:sidekiq_roles) do |role|
46
+ git_plugin.switch_user(role) do
47
+ git_plugin.create_systemd_template
48
+ if fetch(:sidekiq_service_unit_user) == :system
49
+ execute :sudo, :systemctl, "enable", fetch(:sidekiq_service_unit_name)
50
+ else
51
+ execute :systemctl, "--user", "enable", fetch(:sidekiq_service_unit_name)
52
+ execute :loginctl, "enable-linger", fetch(:sidekiq_lingering_user) if fetch(:sidekiq_enable_lingering)
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ desc 'UnInstall systemd sidekiq service'
59
+ task :uninstall do
60
+ on roles fetch(:sidekiq_roles) do |role|
61
+ git_plugin.switch_user(role) do
62
+ if fetch(:sidekiq_service_unit_user) == :system
63
+ execute :sudo, :systemctl, "disable", fetch(:sidekiq_service_unit_name)
64
+ else
65
+ execute :systemctl, "--user", "disable", fetch(:sidekiq_service_unit_name)
66
+ end
67
+ execute :rm, '-f', File.join(fetch(:service_unit_path, fetch_systemd_unit_path), fetch(:sidekiq_service_unit_name))
68
+ end
69
+ end
70
+ end
71
+
72
+ desc 'Generate service_locally'
73
+ task :generate_service_locally do
74
+ run_locally do
75
+ File.write('sidekiq', git_plugin.compiled_template)
76
+ end
77
+ end
78
+
79
+ def fetch_systemd_unit_path
80
+ if fetch(:sidekiq_service_unit_user) == :system
81
+ # if the path is not standard `set :service_unit_path`
82
+ "/etc/systemd/system/"
83
+ else
84
+ home_dir = backend.capture :pwd
85
+ File.join(home_dir, ".config", "systemd", "user")
86
+ end
87
+ end
88
+
89
+ def compiled_template
90
+ search_paths = [
91
+ File.expand_path(
92
+ File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
93
+ __FILE__
94
+ ),
95
+ ]
96
+ template_path = search_paths.detect { |path| File.file?(path) }
97
+ template = File.read(template_path)
98
+ ERB.new(template).result(binding)
99
+ end
100
+
101
+ def create_systemd_template
102
+ ctemplate = compiled_template
103
+ systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
104
+
105
+ if fetch(:sidekiq_service_unit_user) == :user
106
+ backend.execute :mkdir, "-p", systemd_path
107
+ end
108
+ backend.upload!(
109
+ StringIO.new(ctemplate),
110
+ "/tmp/#{fetch :sidekiq_service_unit_name}.service"
111
+ )
112
+ if fetch(:sidekiq_service_unit_user) == :system
113
+ backend.execute :sudo, :mv, "/tmp/#{fetch :sidekiq_service_unit_name}.service", "#{systemd_path}/#{fetch :sidekiq_service_unit_name}.service"
114
+ backend.execute :sudo, :systemctl, "daemon-reload"
115
+ else
116
+ backend.execute :sudo, :mv, "/tmp/#{fetch :sidekiq_service_unit_name}.service", "#{systemd_path}/#{fetch :sidekiq_service_unit_name}.service"
117
+ backend.execute :systemctl, "--user", "daemon-reload"
118
+ end
119
+ end
120
+
121
+ def switch_user(role)
122
+ su_user = sidekiq_user
123
+ if su_user != role.user
124
+ yield
125
+ else
126
+ backend.as su_user do
127
+ yield
128
+ end
129
+ end
130
+ end
131
+
132
+ def sidekiq_user
133
+ fetch(:sidekiq_user, fetch(:run_as))
134
+ end
135
+ end
@@ -0,0 +1,47 @@
1
+ namespace :sidekiq do
2
+ desc 'Quiet sidekiq (stop fetching new tasks from Redis)'
3
+ task :quiet do
4
+ on roles fetch(:sidekiq_roles) do |role|
5
+ git_plugin.switch_user(role) do
6
+ sudo :service, fetch(:sidekiq_service_unit_name), :reload
7
+ end
8
+ end
9
+ end
10
+
11
+ desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
12
+ task :stop do
13
+ on roles fetch(:sidekiq_roles) do |role|
14
+ git_plugin.switch_user(role) do
15
+ sudo :service, fetch(:sidekiq_service_unit_name), :stop
16
+ end
17
+ end
18
+ end
19
+
20
+ desc 'Start sidekiq'
21
+ task :start do
22
+ on roles fetch(:sidekiq_roles) do |role|
23
+ git_plugin.switch_user(role) do
24
+ sudo :service, fetch(:sidekiq_service_unit_name), :start
25
+ end
26
+ end
27
+ end
28
+
29
+ def switch_user(role)
30
+ su_user = sidekiq_user(role)
31
+ if su_user == role.user
32
+ yield
33
+ else
34
+ as su_user do
35
+ yield
36
+ end
37
+ end
38
+ end
39
+
40
+ def sidekiq_user(role)
41
+ properties = role.properties
42
+ properties.fetch(:sidekiq_user) || # local property for sidekiq only
43
+ fetch(:sidekiq_user) ||
44
+ properties.fetch(:run_as) || # global property across multiple capistrano gems
45
+ role.user
46
+ end
47
+ end
@@ -5,6 +5,6 @@ check process <%= sidekiq_service_name(idx) %>
5
5
  start program = "/bin/su - <%= sidekiq_user(@role) %> -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:sidekiq] %> <%= sidekiq_config %> --index <%= idx %> --pidfile <%= pid_file %> --environment <%= fetch(:sidekiq_env) %> <%= sidekiq_concurrency %> <%= sidekiq_logfile %> <%= sidekiq_require %> <%= sidekiq_queues %> <%= sidekiq_options_per_process[idx] %> -d'" with timeout 30 seconds
6
6
 
7
7
  stop program = "/bin/su - <%= sidekiq_user(@role) %> -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:sidekiqctl] %> stop <%= pid_file %>'" with timeout <%= fetch(:sidekiq_timeout).to_i + 10 %> seconds
8
- group <%= fetch(:sidekiq_monit_group, fetch(:application)) %>-sidekiq
8
+ group <%= fetch(:sidekiq_monit_group) || fetch(:application) %>-sidekiq
9
9
 
10
10
  <% end %>
@@ -4,11 +4,18 @@ After=syslog.target network.target
4
4
 
5
5
  [Service]
6
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) %>
7
+ WorkingDirectory=<%= File.join(fetch(:deploy_to), 'current') %>
8
+ ExecStart=<%= SSHKit.config.command_map[:bundler] %> exec sidekiq -e <%= fetch(:sidekiq_env) %>
10
9
  ExecReload=/bin/kill -TSTP $MAINPID
11
10
  ExecStop=/bin/kill -TERM $MAINPID
11
+ <%="StandardOutput=append:#{fetch(:sidekiq_log)}" if fetch(:sidekiq_log) %>
12
+ <%="StandardError=append:#{fetch(:sidekiq_error_log)}" if fetch(:sidekiq_error_log) %>
13
+ <%="User=#{sidekiq_user}" if sidekiq_user %>
14
+ <%="EnvironmentFile=#{fetch(:sidekiq_service_unit_env_file)}" if fetch(:sidekiq_service_unit_env_file) %>
15
+
16
+ <% fetch(:sidekiq_service_unit_env_vars, []).each do |environment_variable| %>
17
+ <%="Environment=#{environment_variable}" %>
18
+ <% end %>
12
19
 
13
20
  RestartSec=1
14
21
  Restart=on-failure
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.2
4
+ version: 2.0.0.beta4
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-04-12 00:00:00.000000000 Z
11
+ date: 2020-06-08 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: '3.4'
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: '3.4'
54
+ version: '6.0'
41
55
  description: Sidekiq integration for Capistrano
42
56
  email:
43
57
  - terminale@gmail.com
@@ -46,6 +60,7 @@ extensions: []
46
60
  extra_rdoc_files: []
47
61
  files:
48
62
  - ".gitignore"
63
+ - ".tool-versions"
49
64
  - CHANGELOG.md
50
65
  - CONTRIBUTORS.md
51
66
  - Gemfile
@@ -56,9 +71,13 @@ files:
56
71
  - lib/capistrano-sidekiq.rb
57
72
  - lib/capistrano/sidekiq.rb
58
73
  - lib/capistrano/sidekiq/monit.rb
74
+ - lib/capistrano/sidekiq/systemd.rb
75
+ - lib/capistrano/sidekiq/upstart.rb
59
76
  - lib/capistrano/sidekiq/version.rb
60
77
  - lib/capistrano/tasks/monit.rake
61
78
  - lib/capistrano/tasks/sidekiq.rake
79
+ - lib/capistrano/tasks/systemd.rake
80
+ - lib/capistrano/tasks/upstart.rake
62
81
  - lib/generators/capistrano/sidekiq/monit/template_generator.rb
63
82
  - lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb
64
83
  - lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb
@@ -77,12 +96,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
96
  version: 2.0.0
78
97
  required_rubygems_version: !ruby/object:Gem::Requirement
79
98
  requirements:
80
- - - ">="
99
+ - - ">"
81
100
  - !ruby/object:Gem::Version
82
- version: '0'
101
+ version: 1.3.1
83
102
  requirements: []
84
- rubyforge_project:
85
- rubygems_version: 2.6.14
103
+ rubygems_version: 3.0.3
86
104
  signing_key:
87
105
  specification_version: 4
88
106
  summary: Sidekiq integration for Capistrano