capistrano-sidekiq 1.0.3 → 2.0.0.beta5

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
  SHA256:
3
- metadata.gz: 2eadf4da0195248e5ce25a260423b32f4f71e7f54b6c0d396b7f5e1c40604aa3
4
- data.tar.gz: e682b32cc48da4c50aebfaed702c7dd98a27b04f23747da96289807a32fa105a
3
+ metadata.gz: 50c54a8decaa51b559addb7e9c1d5bfcbdc474cbac2d11054d1cfdc7a8753b1f
4
+ data.tar.gz: c7b60c5cdb1a19d3131ab83c2a6c2e1c54ddf51f9349969f1e3aac26b83de370
5
5
  SHA512:
6
- metadata.gz: a2016c2552e53d2eb04e8615b094b7d52b868907db40e196b0b5fa2b13de0121b81f9921e7947d9758fd68a12377a8355de5da4556629e5d4d8b9aa3a3ff3cfd
7
- data.tar.gz: eeccd0a9dea2b6a81ed1de9e4a72cf909b1a12e67f9aa06043f0c57e7f13fef8b536b41442eb190a35048a211ed8e8e53162307c5cef2ead88ab84f85f04c5fa
6
+ metadata.gz: bb67be5724197a7499c41381fccf9f70db21a245957554a3a9a31f4d296c8bcb44a397db1e89cc1ac2116a804da924157a838e0a4958371d25d1cf905ef6f836
7
+ data.tar.gz: 773d1e88acaae73ed7c62cd3f49c038207d1cf124672fca77f7c7737320bdd037400f573d68edc64aa7f7045c44311a04d570dfd6aaea93dd487636c592be4d9
@@ -0,0 +1 @@
1
+ ruby 2.6.5
data/README.md CHANGED
@@ -6,12 +6,6 @@ Sidekiq integration for Capistrano
6
6
 
7
7
  ## Installation
8
8
 
9
- Add this line to your application's Gemfile:
10
-
11
- gem 'capistrano-sidekiq', github: 'seuros/capistrano-sidekiq'
12
-
13
- or:
14
-
15
9
  gem 'capistrano-sidekiq', group: :development
16
10
 
17
11
  And then execute:
@@ -21,29 +15,34 @@ And then execute:
21
15
 
22
16
  ## Usage
23
17
  ```ruby
24
- # Capfile
25
- require 'capistrano/sidekiq'
26
- 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
27
28
  ```
28
29
 
29
30
 
30
31
  Configurable options, shown here with defaults:
31
32
 
32
33
  ```ruby
34
+ :sidekiq_roles => :app
33
35
  :sidekiq_default_hooks => true
34
36
  :sidekiq_pid => File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') # ensure this path exists in production before deploying.
35
37
  :sidekiq_env => fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
36
38
  :sidekiq_log => File.join(shared_path, 'log', 'sidekiq.log')
37
- :sidekiq_options => nil
38
- :sidekiq_require => nil
39
- :sidekiq_tag => nil
40
- :sidekiq_config => nil # if you have a config/sidekiq.yml, do not forget to set this.
41
- :sidekiq_queue => nil
42
- :sidekiq_timeout => 10
43
- :sidekiq_roles => :app
44
- :sidekiq_processes => 1
45
- :sidekiq_options_per_process => nil
46
- :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
+
47
46
  # sidekiq monit
48
47
  :sidekiq_monit_templates_path => 'config/deploy/templates'
49
48
  :sidekiq_monit_conf_dir => '/etc/monit/conf.d'
@@ -51,10 +50,8 @@ Configurable options, shown here with defaults:
51
50
  :monit_bin => '/usr/bin/monit'
52
51
  :sidekiq_monit_default_hooks => true
53
52
  :sidekiq_monit_group => nil
54
- :sidekiq_service_name => "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}" + (index ? "_#{index}" : '')
53
+ :sidekiq_service_name => "sidekiq_#{fetch(:application)}"
55
54
 
56
- :sidekiq_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" # Only for capistrano2.5
57
- :sidekiqctl_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" # Only for capistrano2.5
58
55
  :sidekiq_user => nil #user to run sidekiq as
59
56
  ```
60
57
 
@@ -74,70 +71,6 @@ SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
74
71
  SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
75
72
  ```
76
73
 
77
- ## Multiple processes
78
-
79
- You can configure sidekiq to start with multiple processes. Just set the proper amount in `sidekiq_processes`.
80
-
81
- You can also customize the configuration for every process. If you want to do that, just set
82
- `sidekiq_options_per_process` with an array of the configuration options that you want in string format.
83
- This example should boot the first process with the queue `high` and the second one with the queues `default`
84
- and `low`:
85
-
86
- ```ruby
87
- set :sidekiq_processes, 2
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
- Enable lingering for systemd user account
112
-
113
- ```
114
- loginctl enable-linger USERACCOUNT
115
- ```
116
-
117
- Install systemd.service template file and enable the service with:
118
-
119
- ```
120
- bundle exec cap sidekiq:install
121
- ```
122
-
123
- Default name for the service file is `sidekiq-stage.service`. This can be changed as needed, for example:
124
-
125
- ```ruby
126
- set :service_unit_name, "sidekiq-#{fetch(:application)}-#{fetch(:stage)}.service"
127
- ```
128
-
129
- ## Integration with upstart
130
-
131
- Set init system to upstart in the cap deploy config:
132
-
133
- ```ruby
134
- set :init_system, :upstart
135
- ```
136
-
137
- Set upstart service name:
138
- ```ruby
139
- set :upstart_service_name, 'sidekiq'
140
- ```
141
74
 
142
75
  ## Customizing the monit sidekiq templates
143
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', "< 6.0"
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.3'
2
+ SidekiqVERSION = '2.0.0.beta5'
3
3
  end
@@ -1,29 +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
- set :upstart_service_name, "sidekiq"
24
- end
25
- end
26
-
27
1
  namespace :deploy do
28
2
  before :starting, :check_sidekiq_hooks do
29
3
  invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
@@ -32,255 +6,15 @@ end
32
6
 
33
7
  namespace :sidekiq do
34
8
  task :add_default_hooks do
35
- after 'deploy:starting', 'sidekiq:quiet'
36
- after 'deploy:updated', 'sidekiq:stop'
9
+ after 'deploy:starting', 'sidekiq:quiet'
10
+ after 'deploy:updated', 'sidekiq:stop'
37
11
  after 'deploy:published', 'sidekiq:start'
38
12
  after 'deploy:failed', 'sidekiq:restart'
39
13
  end
40
14
 
41
- desc 'Quiet sidekiq (stop fetching new tasks from Redis)'
42
- task :quiet do
43
- on roles fetch(:sidekiq_roles) do |role|
44
- switch_user(role) do
45
- case fetch(:init_system)
46
- when :systemd
47
- execute :systemctl, "--user", "reload", fetch(:service_unit_name), raise_on_non_zero_exit: false
48
- when :upstart
49
- sudo :service, fetch(:upstart_service_name), :reload
50
- else
51
- if test("[ -d #{release_path} ]")
52
- each_process_with_index(reverse: true) do |pid_file, _idx|
53
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
54
- quiet_sidekiq(pid_file)
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
62
-
63
- desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
64
- task :stop do
65
- on roles fetch(:sidekiq_roles) do |role|
66
- switch_user(role) do
67
- case fetch(:init_system)
68
- when :systemd
69
- execute :systemctl, "--user", "stop", fetch(:service_unit_name)
70
- when :upstart
71
- sudo :service, fetch(:upstart_service_name), :stop
72
- else
73
- if test("[ -d #{release_path} ]")
74
- each_process_with_index(reverse: true) do |pid_file, _idx|
75
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
76
- stop_sidekiq(pid_file)
77
- end
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
84
-
85
- desc 'Start sidekiq'
86
- task :start do
87
- on roles fetch(:sidekiq_roles) do |role|
88
- switch_user(role) do
89
- case fetch(:init_system)
90
- when :systemd
91
- execute :systemctl, '--user', 'start', fetch(:service_unit_name)
92
- when :upstart
93
- sudo :service, fetch(:upstart_service_name), :start
94
- else
95
- each_process_with_index do |pid_file, idx|
96
- unless pid_file_exists?(pid_file) && process_exists?(pid_file)
97
- start_sidekiq(pid_file, idx)
98
- end
99
- end
100
- end
101
- end
102
- end
103
- end
104
-
105
15
  desc 'Restart sidekiq'
106
16
  task :restart do
107
17
  invoke! 'sidekiq:stop'
108
18
  invoke! 'sidekiq:start'
109
19
  end
110
-
111
- desc 'Rolling-restart sidekiq'
112
- task :rolling_restart do
113
- on roles fetch(:sidekiq_roles) do |role|
114
- switch_user(role) do
115
- each_process_with_index(reverse: true) do |pid_file, idx|
116
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
117
- stop_sidekiq(pid_file)
118
- end
119
- start_sidekiq(pid_file, idx)
120
- end
121
- end
122
- end
123
- end
124
-
125
- desc 'Delete any pid file not in use'
126
- task :cleanup do
127
- on roles fetch(:sidekiq_roles) do |role|
128
- switch_user(role) do
129
- each_process_with_index do |pid_file, _idx|
130
- unless process_exists?(pid_file)
131
- next unless pid_file_exists?(pid_file)
132
- execute "rm #{pid_file}"
133
- end
134
- end
135
- end
136
- end
137
- end
138
-
139
- # TODO: Don't start if all processes are off, raise warning.
140
- desc 'Respawn missing sidekiq processes'
141
- task :respawn do
142
- invoke 'sidekiq:cleanup'
143
- on roles fetch(:sidekiq_roles) do |role|
144
- switch_user(role) do
145
- each_process_with_index do |pid_file, idx|
146
- start_sidekiq(pid_file, idx) unless pid_file_exists?(pid_file)
147
- end
148
- end
149
- end
150
- end
151
-
152
- task :install do
153
- on roles fetch(:sidekiq_roles) do |role|
154
- switch_user(role) do
155
- case fetch(:init_system)
156
- when :systemd
157
- create_systemd_template
158
- execute :systemctl, "--user", "enable", fetch(:service_unit_name)
159
- end
160
- end
161
- end
162
- end
163
-
164
- task :uninstall do
165
- on roles fetch(:sidekiq_roles) do |role|
166
- switch_user(role) do
167
- case fetch(:init_system)
168
- when :systemd
169
- execute :systemctl, "--user", "disable", fetch(:service_unit_name)
170
- execute :rm, File.join(fetch(:service_unit_path, fetch_systemd_unit_path),fetch(:service_unit_name))
171
- end
172
- end
173
- end
174
- end
175
-
176
- def each_process_with_index(reverse: false)
177
- pid_file_list = pid_files
178
- pid_file_list.reverse! if reverse
179
- pid_file_list.each_with_index do |pid_file, idx|
180
- within release_path do
181
- yield(pid_file, idx)
182
- end
183
- end
184
- end
185
-
186
- def fetch_systemd_unit_path
187
- home_dir = capture :pwd
188
- File.join(home_dir, ".config", "systemd", "user")
189
- end
190
-
191
- def create_systemd_template
192
- search_paths = [
193
- File.expand_path(
194
- File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
195
- __FILE__
196
- ),
197
- ]
198
- template_path = search_paths.detect {|path| File.file?(path)}
199
- template = File.read(template_path)
200
- systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
201
- execute :mkdir, "-p", systemd_path
202
- upload!(
203
- StringIO.new(ERB.new(template).result(binding)),
204
- "#{systemd_path}/#{fetch :service_unit_name}"
205
- )
206
- execute :systemctl, "--user", "daemon-reload"
207
- end
208
-
209
- def pid_files
210
- sidekiq_roles = Array(fetch(:sidekiq_roles)).dup
211
- sidekiq_roles.select! { |role| host.roles.include?(role) }
212
- sidekiq_roles.flat_map do |role|
213
- processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
214
- Array.new(processes) { |idx| fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid") }
215
- end
216
- end
217
-
218
- def pid_file_exists?(pid_file)
219
- test(*("[ -f #{pid_file} ]").split(' '))
220
- end
221
-
222
- def process_exists?(pid_file)
223
- test(*("kill -0 $( cat #{pid_file} )").split(' '))
224
- end
225
-
226
- def quiet_sidekiq(pid_file)
227
- begin
228
- execute :sidekiqctl, 'quiet', pid_file.to_s
229
- rescue SSHKit::Command::Failed
230
- # If gems are not installed (first deploy) and sidekiq_default_hooks is active
231
- warn 'sidekiqctl not found (ignore if this is the first deploy)'
232
- end
233
- end
234
-
235
- def stop_sidekiq(pid_file)
236
- execute :sidekiqctl, 'stop', pid_file.to_s, fetch(:sidekiq_timeout)
237
- end
238
-
239
- def start_sidekiq(pid_file, idx = 0)
240
- args = []
241
- args.push "--index #{idx}"
242
- args.push "--pidfile #{pid_file}"
243
- args.push "--environment #{fetch(:sidekiq_env)}"
244
- args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
245
- args.push "--require #{fetch(:sidekiq_require)}" if fetch(:sidekiq_require)
246
- args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
247
- Array(fetch(:sidekiq_queue)).each do |queue|
248
- args.push "--queue #{queue}"
249
- end
250
- args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
251
- args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
252
- if (process_options = fetch(:sidekiq_options_per_process))
253
- args.push process_options[idx]
254
- end
255
- # use sidekiq_options for special options
256
- args.push fetch(:sidekiq_options) if fetch(:sidekiq_options)
257
-
258
- if defined?(JRUBY_VERSION)
259
- args.push '>/dev/null 2>&1 &'
260
- warn 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
261
- else
262
- args.push '--daemon'
263
- end
264
-
265
- execute :sidekiq, args.compact.join(' ')
266
- end
267
-
268
- def switch_user(role)
269
- su_user = sidekiq_user(role)
270
- if su_user == role.user
271
- yield
272
- else
273
- as su_user do
274
- yield
275
- end
276
- end
277
- end
278
-
279
- def sidekiq_user(role)
280
- properties = role.properties
281
- properties.fetch(:sidekiq_user) || # local property for sidekiq only
282
- fetch(:sidekiq_user) ||
283
- properties.fetch(:run_as) || # global property across multiple capistrano gems
284
- role.user
285
- end
286
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 :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,144 @@
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
+ sudo :service, fetch(:sidekiq_service_unit_name), :reload
9
+ end
10
+ end
11
+ end
12
+
13
+ desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
14
+ task :stop do
15
+ on roles fetch(:sidekiq_roles) do |role|
16
+ git_plugin.switch_user(role) do
17
+ sudo :service, fetch(:sidekiq_service_unit_name), :stop
18
+ end
19
+ end
20
+ end
21
+
22
+ desc 'Start sidekiq'
23
+ task :start do
24
+ on roles fetch(:sidekiq_roles) do |role|
25
+ git_plugin.switch_user(role) do
26
+ sudo :service, fetch(:sidekiq_service_unit_name), :start
27
+ end
28
+ end
29
+ end
30
+
31
+ desc 'Install upstart sidekiq service'
32
+ task :install do
33
+ on roles fetch(:sidekiq_roles) do |role|
34
+ git_plugin.switch_user(role) do
35
+ git_plugin.create_upstart_template
36
+ end
37
+ end
38
+ end
39
+
40
+ desc 'UnInstall upstart sidekiq service'
41
+ task :uninstall do
42
+ on roles fetch(:sidekiq_roles) do |role|
43
+ git_plugin.switch_user(role) do
44
+ execute :rm, '-f', File.join(fetch(:service_unit_path, fetch_upstart_unit_path), fetch(:sidekiq_service_unit_name))
45
+ end
46
+ end
47
+ end
48
+
49
+ desc 'Generate service_locally'
50
+ task :generate_service_locally do
51
+ run_locally do
52
+ File.write('sidekiq.conf', git_plugin.compiled_template)
53
+ end
54
+ end
55
+
56
+ def fetch_upstart_unit_path
57
+ if fetch(:sidekiq_service_unit_user) == :system
58
+ # if the path is not standard `set :service_unit_path`
59
+ "/etc/init"
60
+ else
61
+ home_dir = backend.capture :pwd
62
+ File.join(home_dir, '.config', 'upstart')
63
+ end
64
+ end
65
+
66
+ def compiled_template
67
+ search_paths = [
68
+ File.expand_path(
69
+ File.join(*%w[.. .. .. generators capistrano sidekiq upstart templates sidekiq.conf.erb]),
70
+ __FILE__
71
+ ),
72
+ ]
73
+ template_path = search_paths.detect { |path| File.file?(path) }
74
+ template = File.read(template_path)
75
+ ERB.new(template).result(binding)
76
+ end
77
+
78
+ def create_upstart_template
79
+ ctemplate = compiled_template
80
+ upstart_path = fetch(:service_unit_path, fetch_upstart_unit_path)
81
+
82
+ if fetch(:sidekiq_service_unit_user) != :system
83
+ backend.execute :mkdir, "-p", upstart_path
84
+ end
85
+ conf_filename = "#{fetch :sidekiq_service_unit_name}.conf"
86
+ backend.upload!(
87
+ StringIO.new(ctemplate),
88
+ "/tmp/#{conf_filename}"
89
+ )
90
+ if fetch(:sidekiq_service_unit_user) == :system
91
+ backend.execute :sudo, :mv, "/tmp/#{conf_filename}", "#{upstart_path}/#{conf_filename}"
92
+ backend.execute :sudo, :initctl, 'reload-configuration'
93
+ else
94
+ backend.execute :sudo, :mv, "/tmp/#{conf_filename}", "#{upstart_path}/#{conf_filename}"
95
+ #backend.execute :sudo, :initctl, 'reload-configuration' #TODO
96
+ end
97
+ end
98
+
99
+ def switch_user(role)
100
+ su_user = sidekiq_user(role)
101
+ if su_user == role.user
102
+ yield
103
+ else
104
+ as su_user do
105
+ yield
106
+ end
107
+ end
108
+ end
109
+
110
+ def sidekiq_user(role = nil)
111
+ if role.nil?
112
+ fetch(:sidekiq_user)
113
+ else
114
+ properties = role.properties
115
+ properties.fetch(:sidekiq_user) || # local property for sidekiq only
116
+ fetch(:sidekiq_user) ||
117
+ properties.fetch(:run_as) || # global property across multiple capistrano gems
118
+ role.user
119
+ end
120
+ end
121
+
122
+ def num_workers
123
+ fetch(:sidekiq_upstart_num_workers, nil)
124
+ end
125
+
126
+ def sidekiq_config
127
+ if fetch(:sidekiq_config)
128
+ "--config #{fetch(:sidekiq_config)}"
129
+ end
130
+ end
131
+
132
+ def sidekiq_concurrency
133
+ if fetch(:sidekiq_concurrency)
134
+ "--concurrency #{fetch(:sidekiq_concurrency)}"
135
+ end
136
+ end
137
+
138
+ def sidekiq_queues
139
+ Array(fetch(:sidekiq_queue)).map do |queue|
140
+ "--queue #{queue}"
141
+ end.join(' ')
142
+ end
143
+
144
+ 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[:bundle] %> 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
@@ -0,0 +1,78 @@
1
+ # /etc/init/sidekiq.conf - Sidekiq config | https://github.com/mperham/sidekiq/blob/master/examples/upstart/sidekiq.conf
2
+
3
+ # This example config should work with Ubuntu 12.04+. It
4
+ # allows you to manage multiple Sidekiq instances with
5
+ # Upstart, Ubuntu's native service management tool.
6
+ #
7
+ # See workers.conf for how to manage all Sidekiq instances at once.
8
+ #
9
+ # Save this config as /etc/init/sidekiq.conf then manage sidekiq with:
10
+ # sudo start <%= fetch(:sidekiq_service_unit_name) %> index=0
11
+ # sudo stop <%= fetch(:sidekiq_service_unit_name) %> index=0
12
+ # sudo status <%= fetch(:sidekiq_service_unit_name) %> index=0
13
+ #
14
+ # Hack Upstart's reload command to 'quiet' Sidekiq:
15
+ #
16
+ # sudo reload <%= fetch(:sidekiq_service_unit_name) %> index=0
17
+ #
18
+ # or use the service command:
19
+ # sudo service <%= fetch(:sidekiq_service_unit_name) %> {start,stop,restart,status}
20
+ #
21
+
22
+ description "Sidekiq for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>"
23
+
24
+ # This script is not meant to start on bootup, workers.conf
25
+ # will start all sidekiq instances explicitly when it starts.
26
+ #start on runlevel [2345]
27
+ #stop on runlevel [06]
28
+ <% if sidekiq_user %>
29
+
30
+ # change to match your deployment user
31
+ setuid <%= sidekiq_user %>
32
+ setgid <%= sidekiq_user %>
33
+ env HOME=/home/<%= sidekiq_user %>
34
+ <% end %>
35
+
36
+ # Greatly reduce Ruby memory fragmentation and heap usage
37
+ # https://www.mikeperham.com/2018/04/25/taming-rails-memory-bloat/
38
+ env MALLOC_ARENA_MAX=2
39
+
40
+ respawn
41
+ respawn limit 3 30
42
+
43
+ # TERM is used when stopping sidekiq. Without declaring these as
44
+ # normal exit codes, it just respawns.
45
+ normal exit 0 TERM
46
+
47
+ # Older versions of Upstart might not support the reload command and need
48
+ # this commented out.
49
+ reload signal TSTP
50
+
51
+ # Upstart waits 5 seconds by default to kill a process. Increase timeout to
52
+ # give sidekiq process enough time to exit.
53
+ kill timeout 30
54
+ <% if num_workers %>
55
+
56
+ instance $index
57
+ <% end %>
58
+ script
59
+ # this script runs in /bin/sh by default
60
+ # respawn as bash so we can source in rbenv
61
+ exec /bin/bash <<'EOT'
62
+ # Pick your poison :) Or none if you're using a system wide installed Ruby.
63
+ # rbenv
64
+ # source /home/apps/.bash_profile
65
+ # OR
66
+ # source /home/apps/.profile
67
+ # OR system:
68
+ # source /etc/profile.d/rbenv.sh
69
+ #
70
+ # rvm
71
+ # source /home/apps/.rvm/scripts/rvm
72
+
73
+ # Logs out to /var/log/upstart/<%= fetch(:sidekiq_service_unit_name) %>.log by default
74
+
75
+ cd <%= File.join(fetch(:deploy_to), 'current') %>
76
+ exec <%= SSHKit.config.command_map[:bundle] %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %> <%= sidekiq_concurrency %> <%= sidekiq_queues %>
77
+ EOT
78
+ end script
@@ -0,0 +1,37 @@
1
+ # /etc/init/workers.conf - manage a set of Sidekiqs | https://github.com/mperham/sidekiq/blob/master/examples/upstart/workers.conf
2
+
3
+ # This example config should work with Ubuntu 14.10 and below It
4
+ # allows you to manage multiple Sidekiq instances with
5
+ # Upstart, Ubuntu's native service management tool.
6
+ #
7
+ # See sidekiq.conf for how to manage a single Sidekiq instance.
8
+ #
9
+ # Use "stop workers" to stop all Sidekiq instances.
10
+ # Use "start workers" to start all instances.
11
+ # Use "restart workers" to restart all instances.
12
+ # Crazy, right?
13
+ #
14
+
15
+ description "manages the set of sidekiq processes"
16
+
17
+ # This starts upon bootup and stops on shutdown
18
+ start on runlevel [2345]
19
+ stop on runlevel [06]
20
+
21
+ # Set this to the number of Sidekiq processes you want
22
+ # to run on this machine
23
+ env NUM_WORKERS=2
24
+
25
+ pre-start script
26
+ for i in `seq 1 ${NUM_WORKERS}`
27
+ do
28
+ start sidekiq index=$i
29
+ done
30
+ end script
31
+
32
+ post-stop script
33
+ for i in `seq 1 ${NUM_WORKERS}`
34
+ do
35
+ stop sidekiq index=$i
36
+ done
37
+ end script
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.3
4
+ version: 2.0.0.beta5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-02 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -25,13 +25,24 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.9.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: sidekiq
28
+ name: capistrano-bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.4'
34
- - - "<"
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'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sidekiq
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
35
46
  - !ruby/object:Gem::Version
36
47
  version: '6.0'
37
48
  type: :runtime
@@ -39,9 +50,6 @@ dependencies:
39
50
  version_requirements: !ruby/object:Gem::Requirement
40
51
  requirements:
41
52
  - - ">="
42
- - !ruby/object:Gem::Version
43
- version: '3.4'
44
- - - "<"
45
53
  - !ruby/object:Gem::Version
46
54
  version: '6.0'
47
55
  description: Sidekiq integration for Capistrano
@@ -52,6 +60,7 @@ extensions: []
52
60
  extra_rdoc_files: []
53
61
  files:
54
62
  - ".gitignore"
63
+ - ".tool-versions"
55
64
  - CHANGELOG.md
56
65
  - CONTRIBUTORS.md
57
66
  - Gemfile
@@ -62,12 +71,18 @@ files:
62
71
  - lib/capistrano-sidekiq.rb
63
72
  - lib/capistrano/sidekiq.rb
64
73
  - lib/capistrano/sidekiq/monit.rb
74
+ - lib/capistrano/sidekiq/systemd.rb
75
+ - lib/capistrano/sidekiq/upstart.rb
65
76
  - lib/capistrano/sidekiq/version.rb
66
77
  - lib/capistrano/tasks/monit.rake
67
78
  - lib/capistrano/tasks/sidekiq.rake
79
+ - lib/capistrano/tasks/systemd.rake
80
+ - lib/capistrano/tasks/upstart.rake
68
81
  - lib/generators/capistrano/sidekiq/monit/template_generator.rb
69
82
  - lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb
70
83
  - lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb
84
+ - lib/generators/capistrano/sidekiq/upstart/templates/sidekiq.conf.erb
85
+ - lib/generators/capistrano/sidekiq/upstart/templates/workers.conf.erb
71
86
  homepage: https://github.com/seuros/capistrano-sidekiq
72
87
  licenses:
73
88
  - LGPL-3.0
@@ -83,9 +98,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
98
  version: 2.0.0
84
99
  required_rubygems_version: !ruby/object:Gem::Requirement
85
100
  requirements:
86
- - - ">="
101
+ - - ">"
87
102
  - !ruby/object:Gem::Version
88
- version: '0'
103
+ version: 1.3.1
89
104
  requirements: []
90
105
  rubygems_version: 3.0.3
91
106
  signing_key: