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 +5 -5
- data/.gitignore +1 -0
- data/.tool-versions +1 -0
- data/CHANGELOG.md +52 -36
- data/README.md +20 -43
- data/capistrano-sidekiq.gemspec +2 -1
- data/lib/capistrano/sidekiq.rb +29 -1
- data/lib/capistrano/sidekiq/monit.rb +17 -1
- data/lib/capistrano/sidekiq/systemd.rb +12 -0
- data/lib/capistrano/sidekiq/upstart.rb +11 -0
- data/lib/capistrano/sidekiq/version.rb +1 -1
- data/lib/capistrano/tasks/monit.rake +2 -1
- data/lib/capistrano/tasks/sidekiq.rake +4 -203
- data/lib/capistrano/tasks/systemd.rake +134 -0
- data/lib/capistrano/tasks/upstart.rake +47 -0
- data/lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb +1 -1
- data/lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb +24 -0
- metadata +27 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 91c3f4102ef3615f03a48a556d88c44ab661d261b9a3de0c1ac64c8bfcbe8b8e
|
4
|
+
data.tar.gz: cad9284e68f38ef297e68e243ae3c986d1952e09113ecbd859336447a878ac6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce5c062014f43fbc0412fb1fdbb2624f3c4782bc63bb81b016c653cea4ad35bcbc7b6a9c62cc7e8d05b79a41c4eb77b3cbd9a49f6d68ea7748ebc60152587952
|
7
|
+
data.tar.gz: 6060d3d29376741acb8ceef5371fedaa6cf9473a05fd66f84fb348eca61ce5154f39ab402de3f4a44aefd6d3c220022382414541d98c050706039b9f3e24cf89
|
data/.gitignore
CHANGED
data/.tool-versions
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 2.6.5
|
data/CHANGELOG.md
CHANGED
@@ -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
|
[](http://badge.fury.io/rb/capistrano-sidekiq)
|
2
|
-
[](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
|
-
|
27
|
-
require 'capistrano/sidekiq
|
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
|
-
|
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)}
|
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
|
-
##
|
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
|
-
|
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
|
|
data/capistrano-sidekiq.gemspec
CHANGED
data/lib/capistrano/sidekiq.rb
CHANGED
@@ -1 +1,29 @@
|
|
1
|
-
|
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
|
-
|
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
|
@@ -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)}/#{
|
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',
|
34
|
-
after 'deploy:updated',
|
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
|
-
|
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
|
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:
|
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:
|
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: '
|
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: '
|
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:
|
101
|
+
version: 1.3.1
|
82
102
|
requirements: []
|
83
|
-
|
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
|