capistrano-sidekiq 1.0.0 → 2.0.0.beta2

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: 32880c1c6b9be519c9495ac2c5d96339b1349c0d
4
- data.tar.gz: e4957a5475c6b66ca3834c7ebfce013d944df4a1
2
+ SHA256:
3
+ metadata.gz: 91c3f4102ef3615f03a48a556d88c44ab661d261b9a3de0c1ac64c8bfcbe8b8e
4
+ data.tar.gz: cad9284e68f38ef297e68e243ae3c986d1952e09113ecbd859336447a878ac6b
5
5
  SHA512:
6
- metadata.gz: '0229b5c4bdcc2504750737b61c8cc1960ff5f1e45f1d0ef19e61a38678862530ef0f1ae563bbc16d93e3be1a23ee0e0ae86c8d348de93c37f52d1b4ed6907883'
7
- data.tar.gz: 651c4e097370eb64cf1a5a695982783522a8804a3a1282552e75a56e36b2fc43e89d59493e77b320abf46a4ca28053d67de8bc951b409371faa97d8ed7785bc4
6
+ metadata.gz: ce5c062014f43fbc0412fb1fdbb2624f3c4782bc63bb81b016c653cea4ad35bcbc7b6a9c62cc7e8d05b79a41c4eb77b3cbd9a49f6d68ea7748ebc60152587952
7
+ data.tar.gz: 6060d3d29376741acb8ceef5371fedaa6cf9473a05fd66f84fb348eca61ce5154f39ab402de3f4a44aefd6d3c220022382414541d98c050706039b9f3e24cf89
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,11 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.3
4
+ - Add upstart support
5
+ - Fix monit service name
6
+
7
+ ## 1.0.2
8
+ - Fix deployment flow hooks
9
+
10
+ ## 1.0.1
11
+ - Add deploy failure handling @phillbaker
12
+ - Support custom monit filename @zocoi
13
+ - Systemd Integration @baierjan
14
+ - Fix regression in sidekiq_roles variable
15
+ - Fixed pidfile accounting per process @jsantos
16
+ - Rubocop corrections for main task @jsantos
17
+
3
18
  ## 1.0.0
4
19
 
5
20
  - Prepend underscore before service name index @Tensho
6
21
  - Convert CHANGELOG to Markdown @Tensho
7
22
  - Drop support for capistrano 2.0 @Tensho
8
23
  - *BREAKING CHANGE* If people used custom monit template, they should adjust it to use pid_files variable instead of processes_pids. @Tensho
24
+ - *BREAKING CHANGE* `:sidekiq_role` has been renamed to its plural form, `:sidekiq_roles`
9
25
 
10
26
  ## 0.20.0
11
27
 
@@ -17,21 +33,21 @@
17
33
  - `sidekiq:stop` task perpertually callable @Tensho
18
34
 
19
35
  ## 0.5.4
20
-
36
+
21
37
  - Add support for custom count of processes per host in monit task @okoriko
22
-
38
+
23
39
  ## 0.5.3
24
-
40
+
25
41
  - Custom count of processes per each host
26
-
42
+
27
43
  ## 0.5.0
28
-
44
+
29
45
  - Multiple processes @mrsimo
30
-
46
+
31
47
  ## 0.3.9
32
-
48
+
33
49
  - Restore daemon flag from Monit template
34
-
50
+
35
51
  ## 0.3.8
36
52
 
37
53
  - Update monit template: use su instead of sudo / permit all Sidekiq options @bensie
@@ -43,59 +59,59 @@
43
59
  - Run Sidekiq as daemon from Monit @dpaluy
44
60
 
45
61
  ## 0.3.5
46
-
62
+
47
63
  - Added `:sidekiq_tag` for capistrano 2 @OscarBarrett
48
-
64
+
49
65
  ## 0.3.4
50
-
66
+
51
67
  - Fix bug in `sidekiq:start` for capistrano 2 task
52
-
68
+
53
69
  ## 0.3.3
54
-
70
+
55
71
  - `sidekiq:restart` after `deploy:restart` added to default hooks
56
-
72
+
57
73
  ## 0.3.2
58
-
74
+
59
75
  - `:sidekiq_queue` accept an array
60
-
76
+
61
77
  ## 0.3.1
62
-
78
+
63
79
  - Fix logs @rottman
64
80
  - Add concurrency option support @ungsophy
65
-
81
+
66
82
  ## 0.3.0
67
-
83
+
68
84
  - Fix monit task @andreygerasimchuk
69
-
85
+
70
86
  ## 0.2.9
71
-
87
+
72
88
  - Check if current directory exist @alexdunae
73
-
89
+
74
90
  ## 0.2.8
75
-
91
+
76
92
  - Added `:sidekiq_queue` & `:sidekiq_config`
77
-
93
+
78
94
  ## 0.2.7
79
-
95
+
80
96
  - Signal usage @penso
81
-
97
+
82
98
  ## 0.2.6
83
-
99
+
84
100
  - `sidekiq:start` check if sidekiq is running
85
-
101
+
86
102
  ## 0.2.5
87
-
103
+
88
104
  - Bug fixes
89
-
105
+
90
106
  ## 0.2.4
91
-
107
+
92
108
  - Fast deploy with `:sidekiq_run_in_background`
93
-
109
+
94
110
  ## 0.2.3
95
-
111
+
96
112
  - Added monit tasks (alpha)
97
-
113
+
98
114
  ## 0.2.0
99
-
115
+
100
116
  - Added `sidekiq:rolling_restart` @jlecour
101
-
117
+
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,28 @@ 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
+
48
40
  # sidekiq monit
49
41
  :sidekiq_monit_templates_path => 'config/deploy/templates'
50
42
  :sidekiq_monit_conf_dir => '/etc/monit/conf.d'
@@ -52,42 +44,27 @@ Configurable options, shown here with defaults:
52
44
  :monit_bin => '/usr/bin/monit'
53
45
  :sidekiq_monit_default_hooks => true
54
46
  :sidekiq_monit_group => nil
55
- :sidekiq_service_name => "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}" + (index ? "_#{index}" : '')
47
+ :sidekiq_service_name => "sidekiq_#{fetch(:application)}"
56
48
 
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
49
  :sidekiq_user => nil #user to run sidekiq as
60
50
  ```
61
51
 
52
+ ## Known issues with Capistrano 3
53
+
62
54
  There is a known bug that prevents sidekiq from starting when pty is true on Capistrano 3.
63
55
  ```ruby
64
56
  set :pty, false
65
57
  ```
66
58
 
67
- ## Multiple processes
68
-
69
- You can configure sidekiq to start with multiple processes. Just set the proper amount in `sidekiq_processes`.
70
-
71
- You can also customize the configuration for every process. If you want to do that, just set
72
- `sidekiq_options_per_process` with an array of the configuration options that you want in string format.
73
- This example should boot the first process with the queue `high` and the second one with the queues `default`
74
- and `low`:
59
+ ## Bundler
75
60
 
61
+ If you'd like to prepend `bundle exec` to your sidekiq and sidekiqctl calls, modify the SSHKit command maps
62
+ in your deploy.rb file:
76
63
  ```ruby
77
- set :sidekiq_options_per_process, ["--queue high", "--queue default --queue low"]
64
+ SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
65
+ SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
78
66
  ```
79
67
 
80
- ## Different number of processes per role
81
-
82
- You can configure how many processes you want to run on each host next way:
83
-
84
- ```ruby
85
- set :sidekiq_roles, [:sidekiq_small, :sidekiq_big]
86
- set :sidekiq_small_processes, 1
87
- set :sidekiq_big_processes, 4
88
- server 'example-small.com', roles: [:sidekiq_small]
89
- server 'example-big.com', roles: [:sidekiq_big]
90
- ```
91
68
 
92
69
  ## Customizing the monit sidekiq templates
93
70
 
@@ -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,29 @@
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
+ # Rbenv, Chruby, and RVM integration
17
+ append :rbenv_map_bins, 'sidekiq', 'sidekiqctl'
18
+ append :rvm_map_bins, 'sidekiq', 'sidekiqctl'
19
+ append :chruby_map_bins, 'sidekiq', 'sidekiqctl'
20
+ # Bundler integration
21
+ append :bundle_bins, 'sidekiq', 'sidekiqctl'
22
+ end
23
+
24
+ end
25
+ end
26
+
27
+ require_relative 'sidekiq/systemd'
28
+ require_relative 'sidekiq/upstart'
29
+ 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,12 @@
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
+ end
7
+
8
+ def define_tasks
9
+ eval_rakefile File.expand_path('../../tasks/systemd.rake', __FILE__)
10
+ end
11
+ end
12
+ 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.0'
2
+ SidekiqVERSION = '2.0.0.beta2'
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"
@@ -1,219 +1,20 @@
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, :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
- end
20
- end
21
-
22
1
  namespace :deploy do
23
2
  before :starting, :check_sidekiq_hooks do
24
3
  invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
25
4
  end
26
- after :publishing, :restart_sidekiq do
27
- invoke 'sidekiq:restart' if fetch(:sidekiq_default_hooks)
28
- end
29
5
  end
30
6
 
31
7
  namespace :sidekiq do
32
8
  task :add_default_hooks do
33
- after 'deploy:starting', 'sidekiq:quiet'
34
- after 'deploy:updated', 'sidekiq:stop'
35
- after 'deploy:reverted', 'sidekiq:stop'
9
+ after 'deploy:starting', 'sidekiq:quiet'
10
+ after 'deploy:updated', 'sidekiq:stop'
36
11
  after 'deploy:published', 'sidekiq:start'
37
- end
38
-
39
- desc 'Quiet sidekiq (stop fetching new tasks from Redis)'
40
- task :quiet do
41
- on roles fetch(:sidekiq_roles) do |role|
42
- 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)
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
-
54
- desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
55
- task :stop do
56
- on roles fetch(:sidekiq_roles) do |role|
57
- 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)
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
68
-
69
- desc 'Start sidekiq'
70
- task :start do
71
- on roles fetch(:sidekiq_roles) do |role|
72
- 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)
76
- end
77
- end
78
- end
79
- end
12
+ after 'deploy:failed', 'sidekiq:restart'
80
13
  end
81
14
 
82
15
  desc 'Restart sidekiq'
83
16
  task :restart do
84
17
  invoke! 'sidekiq:stop'
85
- invoke 'sidekiq:start'
86
- end
87
-
88
- desc 'Rolling-restart sidekiq'
89
- task :rolling_restart do
90
- on roles fetch(:sidekiq_roles) do |role|
91
- switch_user(role) do
92
- each_process_with_index(true) do |pid_file, idx|
93
- if pid_file_exists?(pid_file) && process_exists?(pid_file)
94
- stop_sidekiq(pid_file)
95
- end
96
- start_sidekiq(pid_file, idx)
97
- end
98
- end
99
- end
100
- end
101
-
102
- desc 'Delete any pid file not in use'
103
- task :cleanup do
104
- on roles fetch(:sidekiq_roles) do |role|
105
- switch_user(role) do
106
- each_process_with_index do |pid_file, idx|
107
- unless process_exists?(pid_file)
108
- if pid_file_exists?(pid_file)
109
- execute "rm #{pid_file}"
110
- end
111
- end
112
- end
113
- end
114
- end
115
- end
116
-
117
- # TODO: Don't start if all processes are off, raise warning.
118
- desc 'Respawn missing sidekiq processes'
119
- task :respawn do
120
- invoke 'sidekiq:cleanup'
121
- on roles fetch(:sidekiq_roles) do |role|
122
- switch_user(role) do
123
- each_process_with_index do |pid_file, idx|
124
- unless pid_file_exists?(pid_file)
125
- start_sidekiq(pid_file, idx)
126
- end
127
- end
128
- end
129
- end
130
- end
131
-
132
- 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|
136
- within release_path do
137
- yield(pid_file, idx)
138
- end
139
- end
140
- end
141
-
142
- def pid_files
143
- sidekiq_roles = Array(fetch(:sidekiq_roles))
144
- sidekiq_roles.select! { |role| host.roles.include?(role) }
145
- sidekiq_roles.flat_map do |role|
146
- processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
147
- Array.new(processes) { |idx| fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid") }
148
- end
149
- end
150
-
151
- def pid_file_exists?(pid_file)
152
- test(*("[ -f #{pid_file} ]").split(' '))
153
- end
154
-
155
- def process_exists?(pid_file)
156
- test(*("kill -0 $( cat #{pid_file} )").split(' '))
157
- end
158
-
159
- def quiet_sidekiq(pid_file)
160
- begin
161
- execute :sidekiqctl, 'quiet', "#{pid_file}"
162
- rescue SSHKit::Command::Failed
163
- # If gems are not installed (first deploy) and sidekiq_default_hooks is active
164
- warn 'sidekiqctl not found (ignore if this is the first deploy)'
165
- end
166
- end
167
-
168
- def stop_sidekiq(pid_file)
169
- execute :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
170
- end
171
-
172
- def start_sidekiq(pid_file, idx = 0)
173
- args = []
174
- args.push "--index #{idx}"
175
- args.push "--pidfile #{pid_file}"
176
- args.push "--environment #{fetch(:sidekiq_env)}"
177
- args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
178
- args.push "--require #{fetch(:sidekiq_require)}" if fetch(:sidekiq_require)
179
- args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
180
- Array(fetch(:sidekiq_queue)).each do |queue|
181
- args.push "--queue #{queue}"
182
- end
183
- args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
184
- args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
185
- if process_options = fetch(:sidekiq_options_per_process)
186
- args.push process_options[idx]
187
- end
188
- # use sidekiq_options for special options
189
- args.push fetch(:sidekiq_options) if fetch(:sidekiq_options)
190
-
191
- if defined?(JRUBY_VERSION)
192
- args.push '>/dev/null 2>&1 &'
193
- warn 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
194
- else
195
- args.push '--daemon'
196
- end
197
-
198
- execute :sidekiq, args.compact.join(' ')
199
- end
200
-
201
- def switch_user(role, &block)
202
- su_user = sidekiq_user(role)
203
- if su_user == role.user
204
- block.call
205
- else
206
- as su_user do
207
- block.call
208
- end
209
- end
210
- end
211
-
212
- def sidekiq_user(role)
213
- properties = role.properties
214
- 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
18
+ invoke! 'sidekiq:start'
218
19
  end
219
20
  end
@@ -0,0 +1,134 @@
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
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ desc 'UnInstall systemd sidekiq service'
58
+ task :uninstall do
59
+ on roles fetch(:sidekiq_roles) do |role|
60
+ git_plugin.switch_user(role) do
61
+ if fetch(:sidekiq_service_unit_user) == :system
62
+ execute :sudo, :systemctl, "disable", fetch(:sidekiq_service_unit_name)
63
+ else
64
+ execute :systemctl, "--user", "disable", fetch(:sidekiq_service_unit_name)
65
+ end
66
+ execute :rm, '-f', File.join(fetch(:service_unit_path, fetch_systemd_unit_path), fetch(:sidekiq_service_unit_name))
67
+ end
68
+ end
69
+ end
70
+
71
+ desc 'Generate service_locally'
72
+ task :generate_service_locally do
73
+ run_locally do
74
+ File.write('sidekiq', git_plugin.compiled_template)
75
+ end
76
+ end
77
+
78
+ def fetch_systemd_unit_path
79
+ if fetch(:sidekiq_service_unit_user) == :system
80
+ # if the path is not standard `set :service_unit_path`
81
+ "/etc/systemd/system/"
82
+ else
83
+ home_dir = backend.capture :pwd
84
+ File.join(home_dir, ".config", "systemd", "user")
85
+ end
86
+ end
87
+
88
+ def compiled_template
89
+ search_paths = [
90
+ File.expand_path(
91
+ File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
92
+ __FILE__
93
+ ),
94
+ ]
95
+ template_path = search_paths.detect { |path| File.file?(path) }
96
+ template = File.read(template_path)
97
+ ERB.new(template).result(binding)
98
+ end
99
+
100
+ def create_systemd_template
101
+ ctemplate = compiled_template
102
+ systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
103
+
104
+ if fetch(:sidekiq_service_unit_user) == :user
105
+ backend.execute :mkdir, "-p", systemd_path
106
+ end
107
+ backend.upload!(
108
+ StringIO.new(ctemplate),
109
+ "/tmp/#{fetch :sidekiq_service_unit_name}.service"
110
+ )
111
+ if fetch(:sidekiq_service_unit_user) == :system
112
+ backend.execute :sudo, :mv, "/tmp/#{fetch :sidekiq_service_unit_name}.service", "#{systemd_path}/#{fetch :sidekiq_service_unit_name}.service"
113
+ backend.execute :sudo, :systemctl, "daemon-reload"
114
+ else
115
+ backend.execute :sudo, :mv, "/tmp/#{fetch :sidekiq_service_unit_name}.service", "#{systemd_path}/#{fetch :sidekiq_service_unit_name}.service"
116
+ backend.execute :systemctl, "--user", "daemon-reload"
117
+ end
118
+ end
119
+
120
+ def switch_user(role)
121
+ su_user = sidekiq_user
122
+ if su_user != role.user
123
+ yield
124
+ else
125
+ as su_user do
126
+ yield
127
+ end
128
+ end
129
+ end
130
+
131
+ def sidekiq_user
132
+ fetch(:sidekiq_user, fetch(:run_as))
133
+ end
134
+ 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 %>
@@ -0,0 +1,24 @@
1
+ [Unit]
2
+ Description=sidekiq for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
3
+ After=syslog.target network.target
4
+
5
+ [Service]
6
+ Type=simple
7
+ WorkingDirectory=<%= File.join(fetch(:deploy_to), 'current') %>
8
+ ExecStart=<%= SSHKit.config.command_map[:bundler] %> exec sidekiq -e <%= fetch(:sidekiq_env) %> -l <%= fetch(:sidekiq_log) %>
9
+ ExecReload=/bin/kill -TSTP $MAINPID
10
+ ExecStop=/bin/kill -TERM $MAINPID
11
+ <%="User=#{sidekiq_user}" if sidekiq_user %>
12
+ <%="EnvironmentFile=#{fetch(:sidekiq_service_unit_env_file)}" if fetch(:sidekiq_service_unit_env_file) %>
13
+
14
+ <% fetch(:sidekiq_service_unit_env_vars, []).each do |environment_variable| %>
15
+ <%="Environment=#{environment_variable}" %>
16
+ <% end %>
17
+
18
+ RestartSec=1
19
+ Restart=on-failure
20
+
21
+ SyslogIdentifier=sidekiq
22
+
23
+ [Install]
24
+ 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: 2.0.0.beta2
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: 2020-05-25 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,11 +71,16 @@ 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
83
+ - lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb
64
84
  homepage: https://github.com/seuros/capistrano-sidekiq
65
85
  licenses:
66
86
  - LGPL-3.0
@@ -76,12 +96,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
96
  version: 2.0.0
77
97
  required_rubygems_version: !ruby/object:Gem::Requirement
78
98
  requirements:
79
- - - ">="
99
+ - - ">"
80
100
  - !ruby/object:Gem::Version
81
- version: '0'
101
+ version: 1.3.1
82
102
  requirements: []
83
- rubyforge_project:
84
- rubygems_version: 2.6.11
103
+ rubygems_version: 3.0.3
85
104
  signing_key:
86
105
  specification_version: 4
87
106
  summary: Sidekiq integration for Capistrano