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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f55ede23a48a3ff9319774a09692f01137ae02ef54b6f27bead18518650973c
4
- data.tar.gz: 3587deeffde5524d5390e0fc60e474c0bf1c34c048422a15a30efc8cb5460ca2
3
+ metadata.gz: 1d2fab3d52e0ca2c2fdb94e71d21d87e543a3f605f4f822b4c8bf2794c5f8144
4
+ data.tar.gz: 2ede4bc9269188112bef354fc06e2fa7ddb6f1f8de1db57a3dc2cf24da10095f
5
5
  SHA512:
6
- metadata.gz: 46b1223d92a931beed504100ed25debb4c1b5d0a98a0e60b279c0d283ac5356a5ed5c3d80b87dbe8220cc8faa60999ab3d1266147ff22d1968b8545e313a1f00
7
- data.tar.gz: da0d5e2e30b0fefc4a1e37beae281bbbba52417fa4446f13bcff69bb395df9250945797f76a039ae5774574d24ca7b2d563c2f4013fa8726faaa00b3d66c857a
6
+ metadata.gz: c6651700dda4403c8b3e23d2da8f2d7c685c8ae36311cfdea998a1e731de7b87279ad0a354ba9d9da537f10c6735a2e8277f24f04e4a6748d9f70ce63617232c
7
+ data.tar.gz: adacca94a04e2a3ae569e4e94152b1b0a75c345a182aa7595776d75f3c7df789942539ea280a1545361b4610e4ba8e8cb23d72962ab1482a8a2ae26f2a3568e0
data/CHANGELOG.md CHANGED
@@ -1,8 +1,25 @@
1
1
  # Changelog
2
2
 
3
- ## [2.2.0](https://github.com/seuros/capistrano-sidekiq/tree/2.2.0) (2022-05-16)
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
- [Full Changelog](https://github.com/seuros/capistrano-sidekiq/compare/v2.1.0...2.2.0)
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 => :app
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
- :sidekiq_config => 'config/sidekiq.yml'
41
- # per process config - process 1, process 2,... etc.
42
- :sidekiq_config => [
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
- ## Customizing the monit sidekiq templates
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 Sidekiq::Helpers
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 :sidekiq_service_unit_name, 'sidekiq' # This will change in version 3.0.0 to {application}-sidekiq
7
- set_if_empty :sidekiq_service_unit_user, :user # :system
8
- set_if_empty :sidekiq_enable_lingering, true
9
- set_if_empty :sidekiq_lingering_user, nil
10
- set_if_empty :sidekiq_service_templates_path, 'config/deploy/templates'
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 define_tasks
14
- eval_rakefile File.expand_path('../../tasks/systemd.rake', __FILE__)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Capistrano
2
- SidekiqVERSION = '2.2.0'
4
+ SidekiqVERSION = '3.0.0.alpha.1'
3
5
  end
@@ -1,19 +1,71 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'capistrano/bundler'
2
- require "capistrano/plugin"
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('../tasks/sidekiq.rake', __FILE__)
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, :app)
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.error.log') }
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.systemctl_command(command)
17
- end
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 sidekiq service'
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 sidekiq service'
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.systemctl_command(:stop)
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 'Generate service_locally'
115
- task :generate_service_locally do
116
- run_locally do
117
- File.write('sidekiq', git_plugin.compiled_template)
118
- end
119
- end
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
- def fetch_systemd_unit_path
122
- if fetch(:sidekiq_service_unit_user) == :system
123
- # if the path is not standard `set :service_unit_path`
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
- def compiled_template
132
- local_template_directory = fetch(:sidekiq_service_templates_path)
133
- search_paths = [
134
- File.join(local_template_directory, "#{fetch(:sidekiq_service_unit_name)}.service.capistrano.erb"),
135
- File.join(local_template_directory, 'sidekiq.service.capistrano.erb'),
136
- File.expand_path(
137
- File.join(*%w[.. .. .. generators capistrano sidekiq systemd templates sidekiq.service.capistrano.erb]),
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 create_systemd_template
147
- ctemplate = compiled_template
148
- systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
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.execute :mv, temp_file_name, systemd_file_name
160
- backend.execute :systemctl, '--user', 'daemon-reload'
80
+ home_dir = backend.capture :pwd
81
+ File.join(home_dir, ".config", "systemd", "user")
161
82
  end
162
83
  end
163
84
 
164
- def create_systemd_config_symlink(process)
165
- config = fetch(:sidekiq_config)
166
- return unless config
167
-
168
- process_config = config[process - 1]
169
- if process_config.nil?
170
- backend.error(
171
- "No configuration for Process ##{process} found. "\
172
- 'Please make sure you have 1 item in :sidekiq_config for each process.'
173
- )
174
- exit 1
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 delete_systemd_config_symlink(process)
189
- config_link_path = File.join(
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
- def systemctl_command(*args, process: nil)
197
- execute_array =
198
- if fetch(:sidekiq_service_unit_user) == :system
199
- %i[sudo systemctl]
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
- [:systemctl, '--user']
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 sidekiq_user
228
- fetch(:sidekiq_user, fetch(:run_as))
229
- end
230
-
231
- def sidekiq_config
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 sidekiq_queues
253
- Array(fetch(:sidekiq_queue)).map do |queue|
254
- "--queue #{queue}"
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
- # process = 1 | sidekiq_systemd_1.yaml
273
- # process = nil | sidekiq_systemd_%i.yaml
274
- def sidekiq_systemd_config_name(process = nil)
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
- def config_per_process?
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 duration(start_time)
291
- Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
142
+ def config_files(role)
143
+ role.properties.fetch(:sidekiq_config_files) ||
144
+ fetch(:sidekiq_config_files)
292
145
  end
293
146
  end