capistrano-sidekiq 1.0.0 → 2.0.0.beta2

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