capistrano-sidekiq 2.2.0 → 3.0.0.alpha.1

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