capistrano-sidekiq 2.2.0 → 3.0.0.alpha.1
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 +4 -4
- data/CHANGELOG.md +23 -2
- data/README.md +6 -66
- data/lib/capistrano/sidekiq/systemd.rb +38 -9
- data/lib/capistrano/sidekiq/version.rb +3 -1
- data/lib/capistrano/sidekiq.rb +56 -8
- data/lib/capistrano/tasks/systemd.rake +72 -219
- data/lib/capistrano/templates/sidekiq.service.capistrano.erb +45 -0
- data/lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb +7 -5
- metadata +13 -25
- data/.gitignore +0 -19
- data/.tool-versions +0 -1
- data/CONTRIBUTORS.md +0 -11
- data/Gemfile +0 -8
- data/Rakefile +0 -9
- data/capistrano-sidekiq.gemspec +0 -22
- data/lib/capistrano/sidekiq/helpers.rb +0 -60
- data/lib/capistrano/sidekiq/monit.rb +0 -19
- data/lib/capistrano/sidekiq/upstart.rb +0 -15
- data/lib/capistrano/tasks/monit.rake +0 -127
- data/lib/capistrano/tasks/upstart.rake +0 -104
- data/lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb +0 -70
- data/lib/generators/capistrano/sidekiq/upstart/templates/sidekiq.conf.erb +0 -78
- data/lib/generators/capistrano/sidekiq/upstart/templates/workers.conf.erb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d2fab3d52e0ca2c2fdb94e71d21d87e543a3f605f4f822b4c8bf2794c5f8144
|
4
|
+
data.tar.gz: 2ede4bc9269188112bef354fc06e2fa7ddb6f1f8de1db57a3dc2cf24da10095f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6651700dda4403c8b3e23d2da8f2d7c685c8ae36311cfdea998a1e731de7b87279ad0a354ba9d9da537f10c6735a2e8277f24f04e4a6748d9f70ce63617232c
|
7
|
+
data.tar.gz: adacca94a04e2a3ae569e4e94152b1b0a75c345a182aa7595776d75f3c7df789942539ea280a1545361b4610e4ba8e8cb23d72962ab1482a8a2ae26f2a3568e0
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,25 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [Unreleased](https://github.com/seuros/capistrano-sidekiq/compare/v2.3.0...master)
|
4
|
+
- Rewrite to match capistrano3-puma api
|
5
|
+
- Add support for multiple sidekiq configs (processes and queues can be configured with erb)
|
6
|
+
- Add support to multiple EnvironmentFile
|
7
|
+
- Add support to multiple EnvironmentVariables
|
8
|
+
- Default role for sidekiq is now :worker instead of :app
|
4
9
|
|
5
|
-
[
|
10
|
+
## [2.3.0](https://github.com/seuros/capistrano-sidekiq/tree/2.3.0) (2022-05-17)
|
11
|
+
|
12
|
+
[Full Changelog](https://github.com/seuros/capistrano-sidekiq/compare/v2.2.0...2.3.0)
|
13
|
+
|
14
|
+
**Merged pull requests:**
|
15
|
+
|
16
|
+
- fix sidekiq processes naming when count is 1 [\#300](https://github.com/seuros/capistrano-sidekiq/pull/300) ([seuros](https://github.com/seuros))
|
17
|
+
- Support multiple processes in `sidekiq:install` [\#299](https://github.com/seuros/capistrano-sidekiq/pull/299) ([lloydwatkin](https://github.com/lloydwatkin))
|
18
|
+
- fix: monit config template [\#288](https://github.com/seuros/capistrano-sidekiq/pull/288) ([jpickwell](https://github.com/jpickwell))
|
19
|
+
|
20
|
+
## [v2.2.0](https://github.com/seuros/capistrano-sidekiq/tree/v2.2.0) (2022-05-16)
|
21
|
+
|
22
|
+
[Full Changelog](https://github.com/seuros/capistrano-sidekiq/compare/v2.1.0...v2.2.0)
|
6
23
|
|
7
24
|
**Merged pull requests:**
|
8
25
|
|
@@ -270,3 +287,7 @@
|
|
270
287
|
- More robust version checking [\#4](https://github.com/seuros/capistrano-sidekiq/pull/4) ([jlecour](https://github.com/jlecour))
|
271
288
|
- More explicit start command [\#3](https://github.com/seuros/capistrano-sidekiq/pull/3) ([jlecour](https://github.com/jlecour))
|
272
289
|
- Improve pid and log files settings [\#1](https://github.com/seuros/capistrano-sidekiq/pull/1) ([jlecour](https://github.com/jlecour))
|
290
|
+
|
291
|
+
|
292
|
+
|
293
|
+
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
|
data/README.md
CHANGED
@@ -16,87 +16,27 @@ And then execute:
|
|
16
16
|
## Usage
|
17
17
|
```ruby
|
18
18
|
# Capfile
|
19
|
-
|
20
19
|
require 'capistrano/sidekiq'
|
21
20
|
install_plugin Capistrano::Sidekiq # Default sidekiq tasks
|
22
21
|
# Then select your service manager
|
23
22
|
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
23
|
```
|
29
24
|
|
30
|
-
|
31
25
|
Configurable options - Please ensure you check your version's branch for the available settings - shown here with defaults:
|
32
26
|
|
33
27
|
```ruby
|
34
|
-
:sidekiq_roles => :
|
28
|
+
:sidekiq_roles => :worker
|
35
29
|
:sidekiq_default_hooks => true
|
36
|
-
:sidekiq_pid => File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') # ensure this path exists in production before deploying.
|
37
30
|
:sidekiq_env => fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
|
38
|
-
:sidekiq_log => File.join(shared_path, 'log', 'sidekiq.log')
|
39
31
|
# single config
|
40
|
-
:
|
41
|
-
#
|
42
|
-
:
|
43
|
-
'config/sidekiq_config1.yml',
|
44
|
-
'config/sidekiq_config2.yml'
|
45
|
-
]
|
46
|
-
:sidekiq_concurrency => 25
|
47
|
-
:sidekiq_queue => %w(default high low)
|
48
|
-
:sidekiq_processes => 1 # number of systemd processes you want to start
|
49
|
-
|
50
|
-
# sidekiq systemd options
|
51
|
-
:sidekiq_service_templates_path => 'config/deploy/templates' # to be used if a custom template is needed (filaname should be #{fetch(:sidekiq_service_unit_name)}.service.capistrano.erb or sidekiq.service.capistrano.erb
|
52
|
-
:sidekiq_service_unit_name => 'sidekiq'
|
53
|
-
:sidekiq_service_unit_user => :user # :system
|
54
|
-
:sidekiq_enable_lingering => true
|
55
|
-
:sidekiq_lingering_user => nil
|
56
|
-
|
57
|
-
# sidekiq monit
|
58
|
-
:sidekiq_monit_templates_path => 'config/deploy/templates'
|
59
|
-
:sidekiq_monit_conf_dir => '/etc/monit/conf.d'
|
60
|
-
:sidekiq_monit_use_sudo => true
|
61
|
-
:monit_bin => '/usr/bin/monit'
|
62
|
-
:sidekiq_monit_default_hooks => true
|
63
|
-
:sidekiq_monit_group => nil
|
64
|
-
:sidekiq_service_name => "sidekiq_#{fetch(:application)}"
|
65
|
-
|
66
|
-
:sidekiq_user => nil #user to run sidekiq as
|
67
|
-
```
|
68
|
-
See `capistrano/sidekiq/helpers.rb` for other undocumented configuration settings.
|
69
|
-
|
70
|
-
## Known issues with Capistrano 3
|
71
|
-
|
72
|
-
There is a known bug that prevents sidekiq from starting when pty is true on Capistrano 3.
|
73
|
-
```ruby
|
74
|
-
set :pty, false
|
75
|
-
```
|
76
|
-
|
77
|
-
## Bundler
|
78
|
-
|
79
|
-
If you'd like to prepend `bundle exec` to your sidekiq and sidekiqctl calls, modify the SSHKit command maps
|
80
|
-
in your deploy.rb file:
|
81
|
-
```ruby
|
82
|
-
SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
|
83
|
-
SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
|
32
|
+
:sidekiq_config_files, ['sidekiq.yml']
|
33
|
+
# multiple configs
|
34
|
+
:sidekiq_config_files, ['sidekiq.yml', 'sidekiq-2.yml'] # you can also set it per server
|
84
35
|
```
|
85
36
|
|
37
|
+
## Example
|
86
38
|
|
87
|
-
|
88
|
-
|
89
|
-
If you need change some config in redactor, you can
|
90
|
-
|
91
|
-
```
|
92
|
-
bundle exec rails generate capistrano:sidekiq:monit:template
|
93
|
-
```
|
94
|
-
|
95
|
-
If your deploy user has no need in `sudo` for using monit, you can disable it as follows:
|
96
|
-
|
97
|
-
```ruby
|
98
|
-
set :sidekiq_monit_use_sudo, false
|
99
|
-
```
|
39
|
+
A sample application is provided to show how to use this gem at https://github.com/seuros/capistrano-example-app
|
100
40
|
|
101
41
|
## Configuring the log files on systems with less recent Systemd versions
|
102
42
|
|
@@ -1,17 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Capistrano
|
2
4
|
class Sidekiq::Systemd < Capistrano::Plugin
|
3
|
-
include
|
4
|
-
|
5
|
+
include SidekiqCommon
|
6
|
+
def define_tasks
|
7
|
+
eval_rakefile File.expand_path('../tasks/systemd.rake', __dir__)
|
8
|
+
end
|
5
9
|
def set_defaults
|
6
|
-
set_if_empty :
|
7
|
-
set_if_empty :
|
8
|
-
set_if_empty :
|
9
|
-
|
10
|
-
set_if_empty :
|
10
|
+
set_if_empty :systemctl_bin, '/bin/systemctl'
|
11
|
+
set_if_empty :service_unit_user, :user
|
12
|
+
set_if_empty :systemctl_user, fetch(:service_unit_user, :user) == :user
|
13
|
+
|
14
|
+
set_if_empty :sidekiq_service_unit_name, -> { "#{fetch(:application)}_sidekiq_#{fetch(:stage)}" }
|
15
|
+
set_if_empty :sidekiq_lingering_user, -> { fetch(:lingering_user, fetch(:user)) }
|
16
|
+
|
17
|
+
## Sidekiq could have a stripped down or more complex version of the environment variables
|
18
|
+
set_if_empty :sidekiq_service_unit_env_files, -> { fetch(:service_unit_env_files, []) }
|
19
|
+
set_if_empty :sidekiq_service_unit_env_vars, -> { fetch(:service_unit_env_vars, []) }
|
20
|
+
|
21
|
+
set_if_empty :sidekiq_service_templates_path, fetch(:service_templates_path, 'config/deploy/templates')
|
11
22
|
end
|
12
23
|
|
13
|
-
def
|
14
|
-
|
24
|
+
def systemd_command(*args)
|
25
|
+
command = [fetch(:systemctl_bin)]
|
26
|
+
|
27
|
+
unless fetch(:service_unit_user) == :system
|
28
|
+
command << "--user"
|
29
|
+
end
|
30
|
+
|
31
|
+
command + args
|
32
|
+
end
|
33
|
+
|
34
|
+
def sudo_if_needed(*command)
|
35
|
+
if fetch(:service_unit_user) == :system
|
36
|
+
backend.sudo command.map(&:to_s).join(" ")
|
37
|
+
else
|
38
|
+
backend.execute(*command)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_systemd(*args)
|
43
|
+
sudo_if_needed(*systemd_command(*args))
|
15
44
|
end
|
16
45
|
end
|
17
46
|
end
|
data/lib/capistrano/sidekiq.rb
CHANGED
@@ -1,19 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'capistrano/bundler'
|
2
|
-
require
|
4
|
+
require 'capistrano/plugin'
|
3
5
|
|
4
6
|
module Capistrano
|
7
|
+
module SidekiqCommon
|
8
|
+
def compiled_template(config_file = "sidekiq.yml")
|
9
|
+
@config_file = config_file
|
10
|
+
local_template_directory = fetch(:sidekiq_service_templates_path)
|
11
|
+
search_paths = [
|
12
|
+
File.join(local_template_directory, 'sidekiq.service.capistrano.erb'),
|
13
|
+
File.expand_path(
|
14
|
+
File.join(*%w[.. templates sidekiq.service.capistrano.erb]),
|
15
|
+
__FILE__
|
16
|
+
)
|
17
|
+
]
|
18
|
+
template_path = search_paths.detect { |path| File.file?(path) }
|
19
|
+
template = File.read(template_path)
|
20
|
+
ERB.new(template, trim_mode: '-').result(binding)
|
21
|
+
end
|
22
|
+
|
23
|
+
def expanded_bundle_path
|
24
|
+
backend.capture(:echo, SSHKit.config.command_map[:bundle]).strip
|
25
|
+
end
|
26
|
+
|
27
|
+
def sidekiq_config
|
28
|
+
"--config config/#{@config_file}" if @config_file != "sidekiq.yml"
|
29
|
+
end
|
30
|
+
|
31
|
+
def switch_user(role, &block)
|
32
|
+
su_user = sidekiq_user(role)
|
33
|
+
if su_user == role.user
|
34
|
+
yield
|
35
|
+
else
|
36
|
+
as su_user, &block
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def sidekiq_user(role = nil)
|
41
|
+
if role.nil?
|
42
|
+
fetch(:sidekiq_user)
|
43
|
+
else
|
44
|
+
properties = role.properties
|
45
|
+
properties.fetch(:sidekiq_user) || # local property for sidekiq only
|
46
|
+
fetch(:sidekiq_user) ||
|
47
|
+
properties.fetch(:run_as) || # global property across multiple capistrano gems
|
48
|
+
role.user
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
5
52
|
class Sidekiq < Capistrano::Plugin
|
6
53
|
def define_tasks
|
7
|
-
eval_rakefile File.expand_path('
|
54
|
+
eval_rakefile File.expand_path('tasks/sidekiq.rake', __dir__)
|
8
55
|
end
|
9
56
|
|
10
57
|
def set_defaults
|
11
58
|
set_if_empty :sidekiq_default_hooks, true
|
12
59
|
|
13
60
|
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, :
|
61
|
+
set_if_empty :sidekiq_roles, fetch(:sidekiq_role, :worker)
|
62
|
+
set_if_empty :sidekiq_configs, %w[sidekiq] # sidekiq.yml
|
63
|
+
|
15
64
|
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.
|
65
|
+
set_if_empty :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
|
66
|
+
|
67
|
+
set_if_empty :sidekiq_config_files, ['sidekiq.yml']
|
68
|
+
|
17
69
|
# Rbenv, Chruby, and RVM integration
|
18
70
|
append :rbenv_map_bins, 'sidekiq', 'sidekiqctl'
|
19
71
|
append :rvm_map_bins, 'sidekiq', 'sidekiqctl'
|
@@ -21,11 +73,7 @@ module Capistrano
|
|
21
73
|
# Bundler integration
|
22
74
|
append :bundle_bins, 'sidekiq', 'sidekiqctl'
|
23
75
|
end
|
24
|
-
|
25
76
|
end
|
26
77
|
end
|
27
78
|
|
28
|
-
require_relative 'sidekiq/helpers'
|
29
79
|
require_relative 'sidekiq/systemd'
|
30
|
-
require_relative 'sidekiq/upstart'
|
31
|
-
require_relative 'sidekiq/monit'
|
@@ -6,59 +6,17 @@ namespace :sidekiq do
|
|
6
6
|
standard_actions = {
|
7
7
|
start: 'Start Sidekiq',
|
8
8
|
stop: 'Stop Sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)',
|
9
|
-
status: 'Get Sidekiq Status'
|
9
|
+
status: 'Get Sidekiq Status',
|
10
|
+
restart: 'Restart Sidekiq'
|
10
11
|
}
|
11
12
|
standard_actions.each do |command, description|
|
12
13
|
desc description
|
13
14
|
task command do
|
14
15
|
on roles fetch(:sidekiq_roles) do |role|
|
15
16
|
git_plugin.switch_user(role) do
|
16
|
-
git_plugin.
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
desc 'Restart Sidekiq (Quiet, Wait till workers finish or 30 seconds, Stop, Start)'
|
23
|
-
task :restart do
|
24
|
-
on roles fetch(:sidekiq_roles) do |role|
|
25
|
-
git_plugin.switch_user(role) do
|
26
|
-
git_plugin.quiet_sidekiq
|
27
|
-
git_plugin.process_block do |process|
|
28
|
-
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
29
|
-
running = nil
|
30
|
-
|
31
|
-
# get running workers
|
32
|
-
while (running.nil? || running > 0) && git_plugin.duration(start_time) < 30 do
|
33
|
-
command_args =
|
34
|
-
if fetch(:sidekiq_service_unit_user) == :system
|
35
|
-
[:sudo, 'systemd-cgls']
|
36
|
-
else
|
37
|
-
['systemd-cgls', '--user']
|
38
|
-
end
|
39
|
-
# need to pipe through tr -cd... to strip out systemd colors or you
|
40
|
-
# get log error messages for non UTF-8 characters.
|
41
|
-
command_args.push(
|
42
|
-
'-u', "#{git_plugin.sidekiq_service_unit_name(process: process)}.service",
|
43
|
-
'|', 'tr -cd \'\11\12\15\40-\176\''
|
44
|
-
)
|
45
|
-
status = capture(*command_args, raise_on_non_zero_exit: false)
|
46
|
-
status_match = status.match(/\[(?<running>\d+) of (?<total>\d+) busy\]/)
|
47
|
-
break unless status_match
|
48
|
-
|
49
|
-
running = status_match[:running]&.to_i
|
50
|
-
|
51
|
-
colors = SSHKit::Color.new($stdout)
|
52
|
-
if running.zero?
|
53
|
-
info colors.colorize("✔ Process ##{process}: No running workers. Shutting down for restart!", :green)
|
54
|
-
else
|
55
|
-
info colors.colorize("⧗ Process ##{process}: Waiting for #{running} workers.", :yellow)
|
56
|
-
sleep(1)
|
57
|
-
end
|
17
|
+
git_plugin.config_files(role).each do |config_file|
|
18
|
+
git_plugin.execute_systemd(command, git_plugin.sidekiq_service_file_name(config_file))
|
58
19
|
end
|
59
|
-
|
60
|
-
git_plugin.systemctl_command(:stop, process: process)
|
61
|
-
git_plugin.systemctl_command(:start, process: process)
|
62
20
|
end
|
63
21
|
end
|
64
22
|
end
|
@@ -68,226 +26,121 @@ namespace :sidekiq do
|
|
68
26
|
task :quiet do
|
69
27
|
on roles fetch(:sidekiq_roles) do |role|
|
70
28
|
git_plugin.switch_user(role) do
|
71
|
-
git_plugin.quiet_sidekiq
|
29
|
+
git_plugin.quiet_sidekiq(role)
|
72
30
|
end
|
73
31
|
end
|
74
32
|
end
|
75
33
|
|
76
|
-
desc 'Install systemd
|
34
|
+
desc 'Install Sidekiq systemd service'
|
77
35
|
task :install do
|
78
36
|
on roles fetch(:sidekiq_roles) do |role|
|
79
37
|
git_plugin.switch_user(role) do
|
80
|
-
git_plugin.create_systemd_template
|
81
|
-
if git_plugin.config_per_process?
|
82
|
-
git_plugin.process_block do |process|
|
83
|
-
git_plugin.create_systemd_config_symlink(process)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
git_plugin.systemctl_command(:enable)
|
87
|
-
|
88
|
-
if fetch(:sidekiq_service_unit_user) != :system && fetch(:sidekiq_enable_lingering)
|
89
|
-
execute :loginctl, 'enable-linger', fetch(:sidekiq_lingering_user)
|
90
|
-
end
|
38
|
+
git_plugin.create_systemd_template(role)
|
91
39
|
end
|
92
40
|
end
|
41
|
+
invoke 'sidekiq:enable'
|
93
42
|
end
|
94
43
|
|
95
|
-
desc 'Uninstall systemd
|
44
|
+
desc 'Uninstall Sidekiq systemd service'
|
96
45
|
task :uninstall do
|
46
|
+
invoke 'sidekiq:disable'
|
97
47
|
on roles fetch(:sidekiq_roles) do |role|
|
98
48
|
git_plugin.switch_user(role) do
|
99
|
-
git_plugin.
|
100
|
-
git_plugin.systemctl_command(:disable)
|
101
|
-
if git_plugin.config_per_process?
|
102
|
-
git_plugin.process_block do |process|
|
103
|
-
git_plugin.delete_systemd_config_symlink(process)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
execute :sudo, :rm, '-f', File.join(
|
107
|
-
fetch(:service_unit_path, git_plugin.fetch_systemd_unit_path),
|
108
|
-
git_plugin.sidekiq_service_file_name
|
109
|
-
)
|
49
|
+
git_plugin.rm_systemd_service(role)
|
110
50
|
end
|
111
51
|
end
|
112
52
|
end
|
113
53
|
|
114
|
-
desc '
|
115
|
-
task :
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
54
|
+
desc 'Enable Sidekiq systemd service'
|
55
|
+
task :enable do
|
56
|
+
on roles(fetch(:sidekiq_roles)) do |role|
|
57
|
+
git_plugin.config_files(role).each do |config_file|
|
58
|
+
git_plugin.execute_systemd("enable", git_plugin.sidekiq_service_file_name(config_file))
|
59
|
+
end
|
120
60
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
'/etc/systemd/system/'
|
125
|
-
else
|
126
|
-
home_dir = backend.capture :pwd
|
127
|
-
File.join(home_dir, '.config', 'systemd', 'user')
|
61
|
+
if fetch(:systemctl_user) && fetch(:sidekiq_lingering_user)
|
62
|
+
execute :loginctl, "enable-linger", fetch(:puma_lingering_user)
|
63
|
+
end
|
128
64
|
end
|
129
65
|
end
|
130
66
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
__FILE__
|
139
|
-
)
|
140
|
-
]
|
141
|
-
template_path = search_paths.detect { |path| File.file?(path) }
|
142
|
-
template = File.read(template_path)
|
143
|
-
ERB.new(template).result(binding)
|
67
|
+
desc 'Disable Sidekiq systemd service'
|
68
|
+
task :disable do
|
69
|
+
on roles(fetch(:sidekiq_roles)) do |role|
|
70
|
+
git_plugin.config_files(role).each do |config_file|
|
71
|
+
git_plugin.execute_systemd("disable", git_plugin.sidekiq_service_file_name(config_file))
|
72
|
+
end
|
73
|
+
end
|
144
74
|
end
|
145
75
|
|
146
|
-
def
|
147
|
-
|
148
|
-
|
149
|
-
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name)
|
150
|
-
|
151
|
-
backend.execute :mkdir, '-p', systemd_path if fetch(:sidekiq_service_unit_user) == :user
|
152
|
-
|
153
|
-
temp_file_name = File.join('/tmp', sidekiq_service_file_name)
|
154
|
-
backend.upload!(StringIO.new(ctemplate), temp_file_name)
|
155
|
-
if fetch(:sidekiq_service_unit_user) == :system
|
156
|
-
backend.execute :sudo, :mv, temp_file_name, systemd_file_name
|
157
|
-
backend.execute :sudo, :systemctl, 'daemon-reload'
|
76
|
+
def fetch_systemd_unit_path
|
77
|
+
if fetch(:puma_systemctl_user) == :system
|
78
|
+
"/etc/systemd/system/"
|
158
79
|
else
|
159
|
-
backend.
|
160
|
-
|
80
|
+
home_dir = backend.capture :pwd
|
81
|
+
File.join(home_dir, ".config", "systemd", "user")
|
161
82
|
end
|
162
83
|
end
|
163
84
|
|
164
|
-
def
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
85
|
+
def create_systemd_template(role)
|
86
|
+
systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
|
87
|
+
backend.execute :mkdir, '-p', systemd_path if fetch(:systemctl_user)
|
88
|
+
|
89
|
+
config_files(role).each do |config_file|
|
90
|
+
ctemplate = compiled_template(config_file)
|
91
|
+
temp_file_name = File.join('/tmp', "sidekiq.#{config_file}.service")
|
92
|
+
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(config_file))
|
93
|
+
backend.upload!(StringIO.new(ctemplate), temp_file_name)
|
94
|
+
if fetch(:systemctl_user)
|
95
|
+
warn "Moving #{temp_file_name} to #{systemd_file_name}"
|
96
|
+
backend.execute :mv, temp_file_name, systemd_file_name
|
97
|
+
else
|
98
|
+
warn "Installing #{systemd_file_name} as root"
|
99
|
+
backend.execute :sudo, :mv, temp_file_name, systemd_file_name
|
100
|
+
end
|
175
101
|
end
|
176
|
-
|
177
|
-
base_path = fetch(:deploy_to)
|
178
|
-
config_link_base_path = File.join(base_path, 'shared', 'sidekiq_systemd')
|
179
|
-
config_link_path = File.join(
|
180
|
-
config_link_base_path, sidekiq_systemd_config_name(process)
|
181
|
-
)
|
182
|
-
process_config_path = File.join(base_path, 'current', process_config)
|
183
|
-
|
184
|
-
backend.execute :mkdir, '-p', config_link_base_path
|
185
|
-
backend.execute :ln, '-sf', process_config_path, config_link_path
|
186
102
|
end
|
187
103
|
|
188
|
-
def
|
189
|
-
|
190
|
-
fetch(:deploy_to), 'shared', 'sidekiq_systemd',
|
191
|
-
sidekiq_systemd_config_name(process)
|
192
|
-
)
|
193
|
-
backend.execute :rm, config_link_path, raise_on_non_zero_exit: false
|
194
|
-
end
|
104
|
+
def rm_systemd_service(role)
|
105
|
+
systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
|
195
106
|
|
196
|
-
|
197
|
-
|
198
|
-
if fetch(:
|
199
|
-
|
107
|
+
config_files(role).each do |config_file|
|
108
|
+
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(config_file))
|
109
|
+
if fetch(:systemctl_user)
|
110
|
+
warn "Deleting #{systemd_file_name}"
|
111
|
+
backend.execute :rm, "-f", systemd_file_name
|
200
112
|
else
|
201
|
-
|
113
|
+
warn "Deleting #{systemd_file_name} as root"
|
114
|
+
backend.execute :sudo, :rm, "-f", systemd_file_name
|
202
115
|
end
|
203
|
-
|
204
|
-
if process
|
205
|
-
execute_array.push(
|
206
|
-
*args, sidekiq_service_unit_name(process: process)
|
207
|
-
).flatten
|
208
|
-
else
|
209
|
-
execute_array.push(*args, sidekiq_service_unit_name).flatten
|
210
|
-
end
|
211
|
-
backend.execute(*execute_array, raise_on_non_zero_exit: false)
|
212
|
-
end
|
213
|
-
|
214
|
-
def quiet_sidekiq
|
215
|
-
systemctl_command(:kill, '-s', :TSTP)
|
216
|
-
end
|
217
|
-
|
218
|
-
def switch_user(role, &block)
|
219
|
-
su_user = sidekiq_user
|
220
|
-
if su_user != role.user
|
221
|
-
yield
|
222
|
-
else
|
223
|
-
backend.as su_user, &block
|
224
116
|
end
|
225
117
|
end
|
226
118
|
|
227
|
-
def
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
config = fetch(:sidekiq_config)
|
233
|
-
return unless config
|
234
|
-
|
235
|
-
if config_per_process?
|
236
|
-
config = File.join(
|
237
|
-
fetch(:deploy_to), 'shared', 'sidekiq_systemd',
|
238
|
-
sidekiq_systemd_config_name
|
239
|
-
)
|
119
|
+
def quiet_sidekiq(role)
|
120
|
+
config_files(role).each do |config_file|
|
121
|
+
sidekiq_service = sidekiq_service_unit_name(config_file)
|
122
|
+
warn "Quieting #{sidekiq_service}"
|
123
|
+
execute_systemd("kill -s TSTP", sidekiq_service)
|
240
124
|
end
|
241
|
-
"--config #{config}"
|
242
|
-
end
|
243
|
-
|
244
|
-
def sidekiq_concurrency
|
245
|
-
"--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
|
246
|
-
end
|
247
|
-
|
248
|
-
def sidekiq_processes
|
249
|
-
fetch(:sidekiq_processes, 1)
|
250
125
|
end
|
251
126
|
|
252
|
-
def
|
253
|
-
|
254
|
-
"
|
255
|
-
end.join(' ')
|
256
|
-
end
|
257
|
-
|
258
|
-
def sidekiq_service_file_name
|
259
|
-
"#{fetch(:sidekiq_service_unit_name)}.service"
|
260
|
-
end
|
261
|
-
|
262
|
-
def sidekiq_service_unit_name(process: nil)
|
263
|
-
if process
|
264
|
-
"#{fetch(:sidekiq_service_unit_name)}@#{process}"
|
265
|
-
elsif sidekiq_processes > 1
|
266
|
-
"#{fetch(:sidekiq_service_unit_name)}@{1..#{sidekiq_processes}}"
|
127
|
+
def sidekiq_service_unit_name(config_file)
|
128
|
+
if config_file != "sidekiq.yml"
|
129
|
+
fetch(:sidekiq_service_unit_name) + "." + config_file.split(".")[0..-2].join(".")
|
267
130
|
else
|
268
131
|
fetch(:sidekiq_service_unit_name)
|
269
132
|
end
|
270
133
|
end
|
271
134
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
file_name = 'sidekiq_systemd_'
|
276
|
-
file_name << (process&.to_s || '%i')
|
277
|
-
"#{file_name}.yaml"
|
278
|
-
end
|
135
|
+
def sidekiq_service_file_name(config_file)
|
136
|
+
## Remove the extension
|
137
|
+
config_file = config_file.split('.')[0..-1].join('.')
|
279
138
|
|
280
|
-
|
281
|
-
fetch(:sidekiq_config).is_a?(Array)
|
282
|
-
end
|
283
|
-
|
284
|
-
def process_block
|
285
|
-
(1..sidekiq_processes).each do |process|
|
286
|
-
yield(process)
|
287
|
-
end
|
139
|
+
"#{sidekiq_service_unit_name(config_file)}.service"
|
288
140
|
end
|
289
141
|
|
290
|
-
def
|
291
|
-
|
142
|
+
def config_files(role)
|
143
|
+
role.properties.fetch(:sidekiq_config_files) ||
|
144
|
+
fetch(:sidekiq_config_files)
|
292
145
|
end
|
293
146
|
end
|