capistrano-sidekiq 3.0.0 → 3.2.0

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: 41a4b345da5a4f9019cca07d226270be72a796a743b03dc9cfeb0cf13a7c0dc3
4
- data.tar.gz: bea4261d462c586ededff2ef99bf0311a463810a334cf73fc128f82041ed3a03
3
+ metadata.gz: 40ec2af554f334c8b2ee7251460a2cb530490bdaa84467d4f7b799bbd91708bd
4
+ data.tar.gz: 47863fe4c06843041874692ab5f45a6e352bc6367bec5de23138f2311bad8e41
5
5
  SHA512:
6
- metadata.gz: 0b8e9df1839123c5cef2a3f15fbc7512bfc1d328f9c79ae141f9f48ff87d0d95e60a3a310dc14b47bc9ef4a01de18e73c14000706fd92c09a7d995380c421760
7
- data.tar.gz: d31d7765c396d32d987b6f70b5de3e2bf5eeb3a43e7528187bb4c1d862b59235772a171353e9611d4d7bc151e7c8a24fecc5855fa459c1e48187b67a91c084e6
6
+ metadata.gz: 67b0f52888ea111e29d797f0565c11415a8eb8806bf3809c3d4229cd369175ee665fe43570bbc7d2317949fe876ff42e7d585345b2a3ee8c2f997cfb7b12763e
7
+ data.tar.gz: 8b3a5307a8221910c346f1967e05c7cfe1be65e0dfae9f996b53226ed28a8ee0fb3e3b7cf3c742c2769e0d67fc90942d181e0116078e656fa768dcc1672dc176
data/CHANGELOG.md CHANGED
@@ -1,11 +1,52 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased](https://github.com/seuros/capistrano-sidekiq/compare/v2.3.0...master)
3
+ ## [Unreleased](https://github.com/seuros/capistrano-sidekiq/compare/v3.2.0...master)
4
+
5
+ ## [3.2.0](https://github.com/seuros/capistrano-sidekiq/compare/v3.1.0...v3.2.0) - 2025-06-22
6
+
7
+ ### Changed
8
+ - Harmonized interface with capistrano-puma for better ecosystem consistency
9
+ - Aligned configuration variable naming patterns
10
+ - Unified systemd command execution methods
11
+ - Standardized template search order across both gems
12
+ - Added documentation reference to example application
13
+
14
+ ## [3.1.0](https://github.com/seuros/capistrano-sidekiq/compare/v3.0.0...v3.1.0) - 2025-06-22
15
+
16
+ ### Fixed
17
+ - Fix undefined method 'as' error by properly calling backend.as (#327)
18
+ - Fix inconsistent systemd variable naming (systemctl_user vs sidekiq_systemctl_user)
19
+ - Fix systemd lingering configuration issues (#311)
20
+ - Fix sidekiq:uninstall to work without sudo for user services (#307)
21
+ - Align configuration pattern with capistrano-puma for consistency
22
+
23
+ ### Added
24
+ - Add sidekiqswarm support for Sidekiq Enterprise
25
+ - Add deployment tracking for Sidekiq 7+ metrics (`sidekiq_mark_deploy`)
26
+ - Add login shell option for systemd (`sidekiq_use_login_shell`)
27
+ - Add configurable sidekiq command (`sidekiq_command`, `sidekiq_command_args`)
28
+ - Add helper tasks for generating multiple config files
29
+ - Add comprehensive documentation for per-server configuration (#312)
30
+ - Add detailed systemd integration guide (#240)
31
+ - Add GitHub Actions CI workflow with Ruby 3.2+ support
32
+ - Add COSS specification compliance
33
+ - Add shared configuration support with other Capistrano service gems
34
+
35
+ ### Changed
36
+ - Update minimum Ruby version to 3.2+ (required by Sidekiq 7)
37
+ - Use consistent sidekiq-prefixed variables for systemd configuration
38
+ - Improve README documentation with shared configuration examples
39
+ - Update CI to test with Ruby 3.2 and 3.3
40
+ - Enhance systemd service template with configurable features
41
+
42
+ ## [3.0.0](https://github.com/seuros/capistrano-sidekiq/compare/v2.3.0...v3.0.0)
4
43
  - Rewrite to match capistrano3-puma api
5
44
  - Add support for multiple sidekiq configs (processes and queues can be configured with erb)
6
45
  - Add support to multiple EnvironmentFile
7
46
  - Add support to multiple EnvironmentVariables
8
47
  - Default role for sidekiq is now :worker instead of :app
48
+ - Remove monit support
49
+ - Remove deprecated --index argument for Sidekiq 6.0+ compatibility (#234)
9
50
 
10
51
  ## [2.3.0](https://github.com/seuros/capistrano-sidekiq/tree/2.3.0) (2022-05-17)
11
52
 
data/README.md CHANGED
@@ -1,54 +1,384 @@
1
+ # Capistrano::Sidekiq
2
+
1
3
  [![Gem Version](https://badge.fury.io/rb/capistrano-sidekiq.svg)](http://badge.fury.io/rb/capistrano-sidekiq)
4
+ [![COSS Compliant](https://img.shields.io/badge/COSS-compliant-green.svg)](https://github.com/contriboss/coss_spec)
2
5
 
3
- # Capistrano::Sidekiq
6
+ Sidekiq integration for Capistrano - providing systemd service management and deployment coordination for Sidekiq 7+.
7
+
8
+ ## Example Application
4
9
 
5
- Sidekiq integration for Capistrano
10
+ For a complete working example of this gem in action, see the [capistrano-example-app](https://github.com/seuros/capistrano-example-app) which demonstrates:
11
+ - Rails 8.0 deployment with Capistrano
12
+ - Sidekiq 7.0 with Redis 7+
13
+ - Systemd service management
14
+ - rbenv integration
15
+ - Complete deployment guide
6
16
 
7
17
  ## Installation
8
18
 
9
- gem 'capistrano-sidekiq', group: :development
19
+ Add to your Gemfile:
20
+
21
+ ```ruby
22
+ gem 'capistrano-sidekiq', group: :development
23
+ ```
24
+
25
+ Then execute:
26
+
27
+ ```bash
28
+ $ bundle install
29
+ ```
30
+
31
+ ## Setup
32
+
33
+ Add to your Capfile:
34
+
35
+ ```ruby
36
+ # Capfile
37
+ require 'capistrano/sidekiq'
38
+ install_plugin Capistrano::Sidekiq # Default sidekiq tasks
39
+ install_plugin Capistrano::Sidekiq::Systemd # Systemd integration
40
+ ```
41
+
42
+ ## Configuration Options
43
+
44
+ ### Basic Settings
45
+
46
+ ```ruby
47
+ # config/deploy.rb
48
+ set :sidekiq_roles, :worker # Default role for Sidekiq processes
49
+ set :sidekiq_default_hooks, true # Enable default deployment hooks
50
+ set :sidekiq_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage))) # Environment for Sidekiq processes
51
+
52
+ # Single config file
53
+ set :sidekiq_config_files, ['sidekiq.yml']
54
+
55
+ # Multiple config files for different Sidekiq processes
56
+ set :sidekiq_config_files, ['sidekiq.yml', 'sidekiq-high-priority.yml']
57
+ ```
58
+
59
+ ### Shared Configuration with Other Gems
60
+
61
+ This gem follows the Capistrano convention of sharing common settings across multiple service gems (e.g., capistrano-puma, capistrano-sidekiq). The following settings are shared:
62
+
63
+ - `:service_unit_user` - Determines if services run as system or user services
64
+ - `:systemctl_bin` - Path to the systemctl binary
65
+ - `:lingering_user` - User for systemd lingering (for user services)
66
+ - `:service_unit_env_files` - Shared environment files
67
+ - `:service_unit_env_vars` - Shared environment variables
68
+
69
+ Each gem can override these with prefixed versions (e.g., `:sidekiq_systemctl_user`).
70
+
71
+ ### Advanced Configuration
72
+
73
+ ```ruby
74
+ # Shared systemd settings (can be used by multiple Capistrano gems like capistrano-puma)
75
+ set :service_unit_user, :user # Run as user or system service (:system or :user)
76
+ set :systemctl_bin, '/bin/systemctl' # Path to systemctl binary
77
+ set :lingering_user, 'deploy' # User to enable lingering for (defaults to :user)
78
+
79
+ # Sidekiq-specific overrides (optional - defaults to shared settings above)
80
+ set :sidekiq_systemctl_user, :system # Override service_unit_user for Sidekiq only
81
+ set :sidekiq_systemctl_bin, '/usr/bin/systemctl' # Override systemctl_bin for Sidekiq only
82
+ set :sidekiq_service_unit_name, "custom_sidekiq_#{fetch(:stage)}" # Custom service name
83
+ set :sidekiq_lingering_user, 'sidekiq' # Override lingering user for Sidekiq only
84
+
85
+ # Environment configuration
86
+ set :sidekiq_service_unit_env_files, ['/etc/environment'] # Environment files
87
+ set :sidekiq_service_unit_env_vars, [ # Environment variables
88
+ 'RAILS_ENV=production',
89
+ 'MALLOC_ARENA_MAX=2'
90
+ ]
91
+
92
+ # Logging configuration
93
+ set :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
94
+ set :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq.error.log') }
95
+
96
+ # Command customization
97
+ set :sidekiq_command, 'sidekiq' # Use 'sidekiq' or 'sidekiqswarm' for Enterprise
98
+ set :sidekiq_command_args, -> { "-e #{fetch(:sidekiq_env)}" }
99
+
100
+ # Use login shell to load environment (for rbenv, rvm, etc.)
101
+ set :sidekiq_use_login_shell, true
102
+
103
+ # Sidekiq Enterprise - Swarm configuration
104
+ set :sidekiq_command, 'sidekiqswarm'
105
+ set :sidekiq_swarm_env_vars, [
106
+ 'SIDEKIQ_COUNT=5', # Number of processes
107
+ 'SIDEKIQ_MAXMEM_MB=768', # Memory limit per process
108
+ 'SIDEKIQ_PRELOAD_APP=1' # Preload app for memory efficiency
109
+ ]
110
+ # Merge swarm env vars with regular env vars
111
+ set :sidekiq_service_unit_env_vars, -> {
112
+ fetch(:sidekiq_service_unit_env_vars, []) + fetch(:sidekiq_swarm_env_vars, [])
113
+ }
114
+ ```
115
+
116
+ ### Per-Server Configuration
117
+
118
+ You can configure Sidekiq differently for specific servers, allowing you to run different Sidekiq processes with different configurations on different servers.
119
+
120
+ #### Basic Per-Server Setup
121
+
122
+ ```ruby
123
+ # config/deploy/production.rb
124
+ server 'worker1.example.com',
125
+ roles: [:worker],
126
+ sidekiq_config_files: ['sidekiq_high_priority.yml']
127
+
128
+ server 'worker2.example.com',
129
+ roles: [:worker],
130
+ sidekiq_config_files: ['sidekiq_low_priority.yml']
131
+ ```
132
+
133
+ #### Advanced Per-Server Configuration
134
+
135
+ ```ruby
136
+ # Different users and multiple processes per server
137
+ server 'worker1.example.com',
138
+ roles: [:worker],
139
+ sidekiq_config_files: ['sidekiq_critical.yml', 'sidekiq_default.yml'],
140
+ sidekiq_user: 'sidekiq_critical',
141
+ sidekiq_systemctl_user: :system # Run as system service on this server
142
+
143
+ server 'worker2.example.com',
144
+ roles: [:worker],
145
+ sidekiq_config_files: ['sidekiq_batch.yml'],
146
+ sidekiq_user: 'sidekiq_batch',
147
+ sidekiq_service_unit_env_vars: ['MALLOC_ARENA_MAX=4'] # Server-specific env vars
148
+ ```
149
+
150
+ #### How It Works
151
+
152
+ 1. **Configuration Files**: Each server can have its own set of `sidekiq_config_files`
153
+ 2. **Service Creation**: A separate systemd service is created for each config file
154
+ 3. **Service Naming**: Services are named as `<app>_sidekiq_<stage>` for the default `sidekiq.yml`, or `<app>_sidekiq_<stage>.<config_name>` for additional configs
155
+ 4. **Independent Control**: Each service can be started, stopped, and restarted independently
156
+
157
+ #### Example Configurations
158
+
159
+ **config/sidekiq_high_priority.yml:**
160
+ ```yaml
161
+ :concurrency: 10
162
+ :queues:
163
+ - [critical, 2]
164
+ - [high, 1]
165
+ ```
166
+
167
+ **config/sidekiq_low_priority.yml:**
168
+ ```yaml
169
+ :concurrency: 5
170
+ :queues:
171
+ - [low, 1]
172
+ - [default, 1]
173
+ ```
174
+
175
+ #### Deployment Commands
176
+
177
+ When using per-server configurations, Capistrano will:
178
+ - Install the appropriate services on each server during `cap production sidekiq:install`
179
+ - Start only the configured services on each server during `cap production sidekiq:start`
180
+ - Manage each server's services independently
181
+
182
+ You can also target specific servers:
183
+ ```bash
184
+ cap production sidekiq:restart --hosts=worker1.example.com
185
+ ```
186
+
187
+ ## Multiple Processes
188
+
189
+ There are two ways to run multiple Sidekiq processes:
190
+
191
+ ### Option 1: Multiple Config Files (Recommended)
192
+
193
+ Create separate config files for different workloads:
194
+
195
+ ```yaml
196
+ # config/sidekiq_critical.yml
197
+ :concurrency: 5
198
+ :queues:
199
+ - [critical, 2]
200
+
201
+ # config/sidekiq_default.yml
202
+ :concurrency: 10
203
+ :queues:
204
+ - [default, 1]
205
+ - [low, 1]
206
+ ```
207
+
208
+ Configure in deploy.rb:
209
+ ```ruby
210
+ set :sidekiq_config_files, ['sidekiq_critical.yml', 'sidekiq_default.yml']
211
+ ```
212
+
213
+ This creates separate services:
214
+ - `myapp_sidekiq_production.sidekiq_critical`
215
+ - `myapp_sidekiq_production.sidekiq_default`
216
+
217
+ Benefits:
218
+ - Clear purpose for each process
219
+ - Independent scaling and management
220
+ - Different configurations per process
221
+ - Meaningful service names
222
+
223
+ ### Option 2: Sidekiq Enterprise (Sidekiqswarm)
224
+
225
+ For simple scaling with identical processes:
226
+
227
+ ```ruby
228
+ set :sidekiq_command, 'sidekiqswarm'
229
+ set :sidekiq_service_unit_env_vars, ['SIDEKIQ_COUNT=10']
230
+ ```
231
+
232
+ This runs 10 identical processes with a single service.
233
+
234
+ ### Quick Setup for Multiple Processes
235
+
236
+ Use the helper task to generate config files:
237
+
238
+ ```bash
239
+ # Generate 5 config files
240
+ bundle exec cap production sidekiq:helpers:generate_configs[5]
241
+
242
+ # This creates:
243
+ # - config/sidekiq.yml (critical, high queues)
244
+ # - config/sidekiq_1.yml (default, medium queues)
245
+ # - config/sidekiq_2.yml (low, background queues)
246
+ # - config/sidekiq_3.yml (low, background queues)
247
+ # - config/sidekiq_4.yml (low, background queues)
248
+ ```
249
+
250
+ Then add to your deploy.rb:
251
+ ```ruby
252
+ set :sidekiq_config_files, ['sidekiq.yml', 'sidekiq_1.yml', 'sidekiq_2.yml', 'sidekiq_3.yml', 'sidekiq_4.yml']
253
+ ```
254
+
255
+ ## Available Tasks
256
+
257
+ ```bash
258
+ # View all available tasks
259
+ cap -T sidekiq
10
260
 
11
- And then execute:
261
+ # Common commands
262
+ cap sidekiq:start # Start Sidekiq
263
+ cap sidekiq:stop # Stop Sidekiq (graceful shutdown)
264
+ cap sidekiq:restart # Restart Sidekiq
265
+ cap sidekiq:quiet # Quiet Sidekiq (stop processing new jobs)
266
+ cap sidekiq:install # Install Sidekiq systemd service
267
+ cap sidekiq:uninstall # Remove Sidekiq systemd service
268
+ cap sidekiq:enable # Enable Sidekiq systemd service
269
+ cap sidekiq:disable # Disable Sidekiq systemd service
270
+ cap sidekiq:mark_deploy # Mark deployment in Sidekiq metrics (Sidekiq 7+)
12
271
 
13
- $ bundle
272
+ # Helper tasks
273
+ cap sidekiq:helpers:generate_configs[3] # Generate 3 config files
274
+ cap sidekiq:helpers:show_config # Show current configuration
275
+ ```
276
+
277
+ ## Systemd Integration
278
+
279
+ For detailed information about systemd integration, see [Systemd Integration Guide](docs/SYSTEMD_INTEGRATION.md).
280
+
281
+ ## Deployment Tracking (Sidekiq 7+)
14
282
 
283
+ Sidekiq 7 introduced metrics with deployment tracking. Enable it to see deployment markers in your Sidekiq metrics graphs:
284
+
285
+ ### Configuration
15
286
 
16
- ## Usage
17
287
  ```ruby
18
- # Capfile
19
- require 'capistrano/sidekiq'
20
- install_plugin Capistrano::Sidekiq # Default sidekiq tasks
21
- # Then select your service manager
22
- install_plugin Capistrano::Sidekiq::Systemd
288
+ # config/deploy.rb
289
+
290
+ # Enable deployment marking
291
+ set :sidekiq_mark_deploy, true
292
+
293
+ # Optional: Custom deploy label (defaults to git commit description)
294
+ set :sidekiq_deploy_label, "v#{fetch(:current_revision)[0..6]} deployed to #{fetch(:stage)}"
23
295
  ```
24
296
 
25
- Configurable options - Please ensure you check your version's branch for the available settings - shown here with defaults:
297
+ ### How It Works
298
+
299
+ When enabled, the gem will:
300
+ 1. Automatically mark deployments after successful deploys
301
+ 2. Show vertical red lines in Sidekiq's metrics graphs
302
+ 3. Display the deploy label when hovering over the marker
303
+
304
+ This helps correlate performance changes with deployments.
305
+
306
+ ## Sidekiq Enterprise (Swarm) Support
307
+
308
+ This gem supports Sidekiq Enterprise's `sidekiqswarm` command for managing multiple processes with a single service.
309
+
310
+ ### Configuration
26
311
 
27
312
  ```ruby
28
- :sidekiq_roles => :worker
29
- :sidekiq_default_hooks => true
30
- :sidekiq_env => fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
31
- # single config
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
313
+ # config/deploy.rb
314
+
315
+ # Use sidekiqswarm instead of sidekiq
316
+ set :sidekiq_command, 'sidekiqswarm'
317
+
318
+ # Configure swarm-specific environment variables
319
+ set :sidekiq_service_unit_env_vars, [
320
+ 'SIDEKIQ_COUNT=10', # Number of processes to spawn
321
+ 'SIDEKIQ_MAXMEM_MB=512', # Memory limit per process
322
+ 'SIDEKIQ_PRELOAD_APP=1', # Preload Rails app for memory efficiency
323
+ 'RAILS_ENV=production'
324
+ ]
325
+
326
+ # Optional: Configure shutdown timeout for graceful stops
327
+ set :sidekiq_command_args, -> { "-e #{fetch(:sidekiq_env)} -t 30" }
35
328
  ```
36
329
 
37
- ## Example
330
+ ### Benefits of Sidekiqswarm
331
+
332
+ - **Single Service**: Manage N processes with one systemd service
333
+ - **Memory Efficiency**: Preload app once, fork processes
334
+ - **Auto-restart**: Processes that exceed memory limits are automatically restarted
335
+ - **Simplified Management**: No need for multiple service files
336
+
337
+ ### Per-Server Swarm Configuration
338
+
339
+ ```ruby
340
+ server 'worker1.example.com',
341
+ roles: [:worker],
342
+ sidekiq_service_unit_env_vars: ['SIDEKIQ_COUNT=20', 'SIDEKIQ_MAXMEM_MB=1024']
343
+
344
+ server 'worker2.example.com',
345
+ roles: [:worker],
346
+ sidekiq_service_unit_env_vars: ['SIDEKIQ_COUNT=5', 'SIDEKIQ_MAXMEM_MB=512']
347
+ ```
348
+
349
+ ## Working with Systemd Logs
350
+
351
+ View Sidekiq service logs using journalctl:
352
+
353
+ ```bash
354
+ # View last 100 lines of logs
355
+ journalctl -u sidekiq_myapp_production -n 100
356
+
357
+ # Follow logs in real-time
358
+ journalctl -u sidekiq_myapp_production -f
359
+ ```
360
+
361
+ ## Log File Configuration
362
+
363
+ ### Modern Systemd (v240+, e.g., Ubuntu 20.04+)
364
+
365
+ Log files are configured automatically using the `append:` functionality in the systemd service file.
38
366
 
39
- A sample application is provided to show how to use this gem at https://github.com/seuros/capistrano-example-app
367
+ ### Legacy Systemd Systems
40
368
 
41
- ## Configuring the log files on systems with less recent Systemd versions
369
+ For systems with older Systemd versions where `append:` is not supported:
42
370
 
43
- The template used by this project assumes a recent version of Systemd (v240+, e.g. Ubuntu 20.04).
371
+ 1. Sidekiq messages are sent to syslog by default
372
+ 2. Configure system logger to filter Sidekiq messages
44
373
 
45
- On systems with a less recent version, the `append:` functionality is not supported, and the Sidekiq log messages are sent to the syslog.
374
+ ## Example Application
46
375
 
47
- It's possible to workaround this limitation by configuring the system logger to filter the Sidekiq messages; see [wiki](/../../wiki/Configuring-append-mode-log-files-via-Syslog-NG).
376
+ A complete example application demonstrating the usage of this gem is available at:
377
+ https://github.com/seuros/capistrano-example-app
48
378
 
49
379
  ## Contributing
50
380
 
51
- 1. Fork it
381
+ 1. Fork the repository
52
382
  2. Create your feature branch (`git checkout -b my-new-feature`)
53
383
  3. Commit your changes (`git commit -am 'Add some feature'`)
54
384
  4. Push to the branch (`git push origin my-new-feature`)
@@ -1,46 +1,72 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Capistrano
4
- class Sidekiq::Systemd < Capistrano::Plugin
5
- include SidekiqCommon
6
- def define_tasks
7
- eval_rakefile File.expand_path('../tasks/systemd.rake', __dir__)
8
- end
9
- def set_defaults
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
4
+ class Sidekiq
5
+ class Systemd < Capistrano::Plugin
6
+ include SidekiqCommon
7
+ def define_tasks
8
+ eval_rakefile File.expand_path('../tasks/systemd.rake', __dir__)
9
+ eval_rakefile File.expand_path('../tasks/helpers.rake', __dir__)
10
+ end
13
11
 
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)) }
12
+ def set_defaults
13
+ set_if_empty :systemctl_bin, '/bin/systemctl'
14
+ set_if_empty :service_unit_user, :user
15
+ set_if_empty :systemctl_user, -> { fetch(:service_unit_user, :user) == :user }
16
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, []) }
17
+ set_if_empty :sidekiq_systemctl_bin, -> { fetch(:systemctl_bin) }
18
+ set_if_empty :sidekiq_service_unit_name, -> { "#{fetch(:application)}_sidekiq_#{fetch(:stage)}" }
20
19
 
21
- set_if_empty :sidekiq_service_templates_path, fetch(:service_templates_path, 'config/deploy/templates')
22
- end
20
+ set_if_empty :sidekiq_systemctl_user, -> { fetch(:service_unit_user) }
21
+ set_if_empty :sidekiq_enable_lingering, -> { fetch(:sidekiq_systemctl_user) != :system }
22
+ set_if_empty :sidekiq_lingering_user, -> { fetch(:lingering_user, fetch(:user)) }
23
+
24
+ ## Sidekiq could have a stripped down or more complex version of the environment variables
25
+ set_if_empty :sidekiq_service_unit_env_files, -> { fetch(:service_unit_env_files, []) }
26
+ set_if_empty :sidekiq_service_unit_env_vars, -> { fetch(:service_unit_env_vars, []) }
23
27
 
24
- def systemd_command(*args)
25
- command = [fetch(:systemctl_bin)]
28
+ set_if_empty :sidekiq_service_templates_path, fetch(:service_templates_path, 'config/deploy/templates')
26
29
 
27
- unless fetch(:service_unit_user) == :system
28
- command << "--user"
30
+ # Allow customization of the sidekiq command
31
+ set_if_empty :sidekiq_command, 'sidekiq'
32
+ set_if_empty :sidekiq_command_args, -> { "-e #{fetch(:sidekiq_env)}" }
33
+
34
+ # Deployment tracking for Sidekiq 7+ metrics
35
+ set_if_empty :sidekiq_mark_deploy, false
36
+ set_if_empty :sidekiq_deploy_label, nil
37
+
38
+ # Login shell option for loading environment
39
+ set_if_empty :sidekiq_use_login_shell, false
29
40
  end
30
41
 
31
- command + args
32
- end
42
+ def fetch_systemd_unit_path
43
+ if fetch(:sidekiq_systemctl_user) == :system
44
+ '/etc/systemd/system/'
45
+ else
46
+ home_dir = backend.capture :pwd
47
+ File.join(home_dir, '.config', 'systemd', 'user')
48
+ end
49
+ end
50
+
51
+ def systemd_command(*args)
52
+ command = [fetch(:sidekiq_systemctl_bin)]
33
53
 
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)
54
+ command << '--user' unless fetch(:sidekiq_systemctl_user) == :system
55
+
56
+ command + args
39
57
  end
40
- end
41
58
 
42
- def execute_systemd(*args)
43
- sudo_if_needed(*systemd_command(*args))
59
+ def sudo_if_needed(*command)
60
+ if fetch(:sidekiq_systemctl_user) == :system
61
+ backend.sudo command.map(&:to_s).join(' ')
62
+ else
63
+ backend.execute(*command)
64
+ end
65
+ end
66
+
67
+ def execute_systemd(*)
68
+ sudo_if_needed(*systemd_command(*))
69
+ end
44
70
  end
45
71
  end
46
72
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Capistrano
4
- SidekiqVERSION = '3.0.0'
4
+ SIDEKIQ_VERSION = '3.2.0'
5
5
  end
@@ -1,39 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'capistrano/bundler'
3
+ require 'capistrano/bundler' unless ENV['TEST']
4
4
  require 'capistrano/plugin'
5
5
 
6
6
  module Capistrano
7
7
  module SidekiqCommon
8
- def compiled_template(config_file = "sidekiq.yml")
8
+ def compiled_template_sidekiq(from, role, config_file = 'sidekiq.yml')
9
+ @role = role
9
10
  @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)
11
+ file = [
12
+ "lib/capistrano/templates/#{from}-#{role.hostname}-#{fetch(:stage)}.rb",
13
+ "lib/capistrano/templates/#{from}-#{role.hostname}.rb",
14
+ "lib/capistrano/templates/#{from}-#{fetch(:stage)}.rb",
15
+ "lib/capistrano/templates/#{from}.rb.erb",
16
+ "lib/capistrano/templates/#{from}.rb",
17
+ "lib/capistrano/templates/#{from}.erb",
18
+ "config/deploy/templates/#{from}.rb.erb",
19
+ "config/deploy/templates/#{from}.rb",
20
+ "config/deploy/templates/#{from}.erb",
21
+ File.expand_path("../templates/#{from}.erb", __FILE__),
22
+ File.expand_path("../templates/#{from}.rb.erb", __FILE__)
23
+ ].detect { |path| File.file?(path) }
24
+ erb = File.read(file)
25
+ StringIO.new(ERB.new(erb, trim_mode: '-').result(binding))
21
26
  end
22
27
 
23
- def expanded_bundle_path
28
+ def template_sidekiq(from, to, role, config_file = 'sidekiq.yml')
29
+ backend.upload! compiled_template_sidekiq(from, role, config_file), to
30
+ end
31
+
32
+ def expanded_bundle_command
24
33
  backend.capture(:echo, SSHKit.config.command_map[:bundle]).strip
25
34
  end
26
35
 
27
36
  def sidekiq_config
28
- "--config config/#{@config_file}" if @config_file != "sidekiq.yml"
37
+ "--config config/#{@config_file}" if @config_file != 'sidekiq.yml'
29
38
  end
30
39
 
31
- def switch_user(role, &block)
40
+ def sidekiq_switch_user(role, &block)
32
41
  su_user = sidekiq_user(role)
33
42
  if su_user == role.user
34
43
  yield
35
44
  else
36
- as su_user, &block
45
+ backend.as(su_user, &block)
37
46
  end
38
47
  end
39
48
 
@@ -42,13 +51,16 @@ module Capistrano
42
51
  fetch(:sidekiq_user)
43
52
  else
44
53
  properties = role.properties
54
+ return role.user unless properties
55
+
45
56
  properties.fetch(:sidekiq_user) || # local property for sidekiq only
46
- fetch(:sidekiq_user) ||
57
+ fetch(:sidekiq_user, nil) ||
47
58
  properties.fetch(:run_as) || # global property across multiple capistrano gems
48
59
  role.user
49
60
  end
50
61
  end
51
62
  end
63
+
52
64
  class Sidekiq < Capistrano::Plugin
53
65
  def define_tasks
54
66
  eval_rakefile File.expand_path('tasks/sidekiq.rake', __dir__)
@@ -59,10 +71,10 @@ module Capistrano
59
71
 
60
72
  set_if_empty :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:rake_env, fetch(:stage)))) }
61
73
  set_if_empty :sidekiq_roles, fetch(:sidekiq_role, :worker)
62
- set_if_empty :sidekiq_configs, %w[sidekiq] # sidekiq.yml
74
+ set_if_empty :sidekiq_configs, %w[sidekiq] # sidekiq.yml
63
75
 
64
76
  set_if_empty :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
65
- set_if_empty :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
77
+ set_if_empty :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq_error.log') }
66
78
 
67
79
  set_if_empty :sidekiq_config_files, ['sidekiq.yml']
68
80
 
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :sidekiq do
4
+ namespace :helpers do
5
+ desc 'Generate multiple Sidekiq config files'
6
+ task :generate_configs, :count do |_task, args|
7
+ count = (args[:count] || 3).to_i
8
+
9
+ puts "Generating #{count} Sidekiq config files..."
10
+
11
+ # Base template
12
+ base_config = {
13
+ concurrency: 10,
14
+ timeout: 25,
15
+ verbose: false,
16
+ strict: true
17
+ }
18
+
19
+ # Generate config files
20
+ count.times do |i|
21
+ config = base_config.dup
22
+
23
+ # Assign queues based on index
24
+ config[:queues] = case i
25
+ when 0
26
+ [['critical', 2], ['high', 1]]
27
+ when 1
28
+ [['default', 1], ['medium', 1]]
29
+ else
30
+ [['low', 1], ['background', 1]]
31
+ end
32
+
33
+ filename = i.zero? ? 'sidekiq.yml' : "sidekiq_#{i}.yml"
34
+ filepath = "config/#{filename}"
35
+
36
+ # Generate YAML content
37
+ content = <<~YAML
38
+ # Sidekiq configuration file #{i + 1}/#{count}
39
+ :concurrency: #{config[:concurrency]}
40
+ :timeout: #{config[:timeout]}
41
+ :verbose: #{config[:verbose]}
42
+ :strict: #{config[:strict]}
43
+
44
+ :queues:
45
+ YAML
46
+
47
+ config[:queues].each do |queue, priority|
48
+ content += " - [#{queue}, #{priority}]\n"
49
+ end
50
+
51
+ puts " Creating #{filepath}..."
52
+ File.write(filepath, content)
53
+ end
54
+
55
+ puts "\nAdd to your deploy.rb:"
56
+ puts "set :sidekiq_config_files, #{count.times.map do |i|
57
+ i.zero? ? "'sidekiq.yml'" : "'sidekiq_#{i}.yml'"
58
+ end.join(', ')}"
59
+ end
60
+
61
+ desc 'Show current Sidekiq configuration'
62
+ task :show_config do
63
+ on roles(fetch(:sidekiq_roles)) do
64
+ within current_path do
65
+ config_files = fetch(:sidekiq_config_files, ['sidekiq.yml'])
66
+
67
+ config_files.each do |config_file|
68
+ puts "\n=== #{config_file} ==="
69
+ if test("[ -f config/#{config_file} ]")
70
+ puts capture(:cat, "config/#{config_file}")
71
+ else
72
+ puts ' File not found'
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  namespace :deploy do
2
4
  before :starting, :check_sidekiq_hooks do
3
5
  invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
@@ -8,7 +10,36 @@ namespace :sidekiq do
8
10
  task :add_default_hooks do
9
11
  after 'deploy:starting', 'sidekiq:quiet' if Rake::Task.task_defined?('sidekiq:quiet')
10
12
  after 'deploy:updated', 'sidekiq:stop'
13
+ after 'deploy:reverted', 'sidekiq:stop'
11
14
  after 'deploy:published', 'sidekiq:start'
15
+ after 'deploy:published', 'sidekiq:mark_deploy' if fetch(:sidekiq_mark_deploy, false)
12
16
  after 'deploy:failed', 'sidekiq:restart'
13
17
  end
18
+
19
+ desc 'Mark deployment in Sidekiq metrics'
20
+ task :mark_deploy do
21
+ if fetch(:sidekiq_mark_deploy, false)
22
+ on roles(fetch(:sidekiq_roles)) do
23
+ within current_path do
24
+ # Get deploy label - use custom label or git description
25
+ deploy_label = fetch(:sidekiq_deploy_label) || begin
26
+ capture(:git, 'log', '-1', '--format="%h %s"').strip
27
+ rescue StandardError
28
+ "#{fetch(:application)} #{fetch(:stage)} deploy"
29
+ end
30
+
31
+ info "Marking deployment in Sidekiq metrics: #{deploy_label}"
32
+
33
+ # Create a Ruby script to mark the deployment
34
+ mark_deploy_script = <<~RUBY
35
+ require 'sidekiq/deploy'
36
+ Sidekiq::Deploy.mark!(ARGV[0])
37
+ RUBY
38
+
39
+ # Execute the script with the deploy label
40
+ execute :bundle, :exec, :ruby, '-e', mark_deploy_script, '--', deploy_label
41
+ end
42
+ end
43
+ end
44
+ end
14
45
  end
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  git_plugin = self
@@ -14,7 +13,7 @@ namespace :sidekiq do
14
13
  desc description
15
14
  task command do
16
15
  on roles fetch(:sidekiq_roles) do |role|
17
- git_plugin.switch_user(role) do
16
+ git_plugin.sidekiq_switch_user(role) do
18
17
  git_plugin.config_files(role).each do |config_file|
19
18
  git_plugin.execute_systemd(command, git_plugin.sidekiq_service_file_name(config_file))
20
19
  end
@@ -26,7 +25,7 @@ namespace :sidekiq do
26
25
  desc 'Quiet Sidekiq (stop fetching new tasks from Redis)'
27
26
  task :quiet do
28
27
  on roles fetch(:sidekiq_roles) do |role|
29
- git_plugin.switch_user(role) do
28
+ git_plugin.sidekiq_switch_user(role) do
30
29
  git_plugin.quiet_sidekiq(role)
31
30
  end
32
31
  end
@@ -35,7 +34,7 @@ namespace :sidekiq do
35
34
  desc 'Install Sidekiq systemd service'
36
35
  task :install do
37
36
  on roles fetch(:sidekiq_roles) do |role|
38
- git_plugin.switch_user(role) do
37
+ git_plugin.sidekiq_switch_user(role) do
39
38
  git_plugin.create_systemd_template(role)
40
39
  end
41
40
  end
@@ -46,7 +45,7 @@ namespace :sidekiq do
46
45
  task :uninstall do
47
46
  invoke 'sidekiq:disable'
48
47
  on roles fetch(:sidekiq_roles) do |role|
49
- git_plugin.switch_user(role) do
48
+ git_plugin.sidekiq_switch_user(role) do
50
49
  git_plugin.rm_systemd_service(role)
51
50
  end
52
51
  end
@@ -56,11 +55,11 @@ namespace :sidekiq do
56
55
  task :enable do
57
56
  on roles(fetch(:sidekiq_roles)) do |role|
58
57
  git_plugin.config_files(role).each do |config_file|
59
- git_plugin.execute_systemd("enable", git_plugin.sidekiq_service_file_name(config_file))
58
+ git_plugin.execute_systemd('enable', git_plugin.sidekiq_service_file_name(config_file))
60
59
  end
61
60
 
62
- if fetch(:systemctl_user) && fetch(:sidekiq_lingering_user)
63
- execute :loginctl, "enable-linger", fetch(:sidekiq_lingering_user)
61
+ if fetch(:sidekiq_enable_lingering) && fetch(:sidekiq_lingering_user)
62
+ execute :loginctl, 'enable-linger', fetch(:sidekiq_lingering_user)
64
63
  end
65
64
  end
66
65
  end
@@ -69,36 +68,36 @@ namespace :sidekiq do
69
68
  task :disable do
70
69
  on roles(fetch(:sidekiq_roles)) do |role|
71
70
  git_plugin.config_files(role).each do |config_file|
72
- git_plugin.execute_systemd("disable", git_plugin.sidekiq_service_file_name(config_file))
71
+ git_plugin.execute_systemd('disable', git_plugin.sidekiq_service_file_name(config_file))
73
72
  end
74
73
  end
75
74
  end
76
75
 
77
76
  def fetch_systemd_unit_path
78
77
  if fetch(:sidekiq_systemctl_user) == :system
79
- "/etc/systemd/system/"
78
+ '/etc/systemd/system/'
80
79
  else
81
80
  home_dir = backend.capture :pwd
82
- File.join(home_dir, ".config", "systemd", "user")
81
+ File.join(home_dir, '.config', 'systemd', 'user')
83
82
  end
84
83
  end
85
84
 
86
85
  def create_systemd_template(role)
87
86
  systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
88
- backend.execute :mkdir, '-p', systemd_path if fetch(:systemctl_user)
87
+ backend.execute :mkdir, '-p', systemd_path if fetch(:sidekiq_systemctl_user) != :system
89
88
 
90
89
  config_files(role).each do |config_file|
91
- ctemplate = compiled_template(config_file)
92
- temp_file_name = File.join('/tmp', "sidekiq.#{config_file}.service")
93
- systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(config_file))
94
- backend.upload!(StringIO.new(ctemplate), temp_file_name)
95
- if fetch(:systemctl_user)
96
- warn "Moving #{temp_file_name} to #{systemd_file_name}"
97
- backend.execute :mv, temp_file_name, systemd_file_name
98
- else
99
- warn "Installing #{systemd_file_name} as root"
100
- backend.execute :sudo, :mv, temp_file_name, systemd_file_name
101
- end
90
+ ctemplate = compiled_template_sidekiq('sidekiq.service.capistrano', role, 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!(ctemplate, temp_file_name)
94
+ if fetch(:sidekiq_systemctl_user) == :system
95
+ warn "Installing #{systemd_file_name} as root"
96
+ backend.execute :sudo, :mv, temp_file_name, systemd_file_name
97
+ else
98
+ warn "Moving #{temp_file_name} to #{systemd_file_name}"
99
+ backend.execute :mv, temp_file_name, systemd_file_name
100
+ end
102
101
  end
103
102
  end
104
103
 
@@ -107,12 +106,12 @@ namespace :sidekiq do
107
106
 
108
107
  config_files(role).each do |config_file|
109
108
  systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(config_file))
110
- if fetch(:systemctl_user)
111
- warn "Deleting #{systemd_file_name}"
112
- backend.execute :rm, "-f", systemd_file_name
113
- else
109
+ if fetch(:sidekiq_systemctl_user) == :system
114
110
  warn "Deleting #{systemd_file_name} as root"
115
- backend.execute :sudo, :rm, "-f", systemd_file_name
111
+ backend.execute :sudo, :rm, '-f', systemd_file_name
112
+ else
113
+ warn "Deleting #{systemd_file_name}"
114
+ backend.execute :rm, '-f', systemd_file_name
116
115
  end
117
116
  end
118
117
  end
@@ -121,21 +120,21 @@ namespace :sidekiq do
121
120
  config_files(role).each do |config_file|
122
121
  sidekiq_service = sidekiq_service_unit_name(config_file)
123
122
  warn "Quieting #{sidekiq_service}"
124
- execute_systemd("kill -s TSTP", sidekiq_service)
123
+ execute_systemd('kill -s TSTP', sidekiq_service)
125
124
  end
126
125
  end
127
126
 
128
127
  def sidekiq_service_unit_name(config_file)
129
- if config_file != "sidekiq.yml"
130
- fetch(:sidekiq_service_unit_name) + "." + config_file.split(".")[0..-2].join(".")
131
- else
128
+ if config_file == 'sidekiq.yml'
132
129
  fetch(:sidekiq_service_unit_name)
130
+ else
131
+ "#{fetch(:sidekiq_service_unit_name)}.#{config_file.split('.')[0..-2].join('.')}"
133
132
  end
134
133
  end
135
134
 
136
135
  def sidekiq_service_file_name(config_file)
137
136
  ## Remove the extension
138
- config_file = config_file.split('.')[0..-1].join('.')
137
+ config_file = config_file.split('.').join('.')
139
138
 
140
139
  "#{sidekiq_service_unit_name(config_file)}.service"
141
140
  end
@@ -20,7 +20,11 @@ Type=notify
20
20
  WatchdogSec=10
21
21
  <%="User=#{sidekiq_user}" if fetch(:sidekiq_systemctl_user) == :system %>
22
22
  WorkingDirectory=<%= current_path %>
23
- ExecStart=<%= expanded_bundle_path %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %>
23
+ <% if fetch(:sidekiq_use_login_shell) %>
24
+ ExecStart=/bin/bash -lc '<%= expanded_bundle_command %> exec <%= fetch(:sidekiq_command) %> <%= fetch(:sidekiq_command_args) %> <%= sidekiq_config %>'
25
+ <% else %>
26
+ ExecStart=<%= expanded_bundle_command %> exec <%= fetch(:sidekiq_command) %> <%= fetch(:sidekiq_command_args) %> <%= sidekiq_config %>
27
+ <% end %>
24
28
 
25
29
  # Use `systemctl kill -s TSTP <% sidekiq_service_unit_name(@config_file) %>` to quiet the Sidekiq process
26
30
  UMask=0002
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-01-01 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: capistrano
@@ -43,14 +43,84 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 6.0.6
46
+ version: '7.0'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 6.0.6
53
+ version: '7.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: minitest
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '5.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rake
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '13.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '13.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.50'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.50'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rubocop-minitest
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.30'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.30'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop-rake
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.6'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.6'
54
124
  description: Sidekiq integration for Capistrano
55
125
  email:
56
126
  - terminale@gmail.com
@@ -65,15 +135,15 @@ files:
65
135
  - lib/capistrano/sidekiq.rb
66
136
  - lib/capistrano/sidekiq/systemd.rb
67
137
  - lib/capistrano/sidekiq/version.rb
138
+ - lib/capistrano/tasks/helpers.rake
68
139
  - lib/capistrano/tasks/sidekiq.rake
69
140
  - lib/capistrano/tasks/systemd.rake
70
141
  - lib/capistrano/templates/sidekiq.service.capistrano.erb
71
- - lib/generators/capistrano/sidekiq/monit/template_generator.rb
72
- - lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb
73
142
  homepage: https://github.com/seuros/capistrano-sidekiq
74
143
  licenses:
75
144
  - LGPL-3.0
76
- metadata: {}
145
+ metadata:
146
+ rubygems_mfa_required: 'true'
77
147
  post_install_message: "\n Version 3.0.0 is a major release. Please see README.md,
78
148
  breaking changes are listed in CHANGELOG.md\n "
79
149
  rdoc_options: []
@@ -83,14 +153,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
153
  requirements:
84
154
  - - ">="
85
155
  - !ruby/object:Gem::Version
86
- version: 2.5.0
156
+ version: 3.2.0
87
157
  required_rubygems_version: !ruby/object:Gem::Requirement
88
158
  requirements:
89
159
  - - ">="
90
160
  - !ruby/object:Gem::Version
91
161
  version: '0'
92
162
  requirements: []
93
- rubygems_version: 3.6.2
163
+ rubygems_version: 3.6.7
94
164
  specification_version: 4
95
165
  summary: Sidekiq integration for Capistrano
96
166
  test_files: []
@@ -1,24 +0,0 @@
1
- require 'rails/generators/base'
2
-
3
- module Capistrano
4
- module Sidekiq
5
- module Monit
6
- module Generators
7
- class TemplateGenerator < Rails::Generators::Base
8
-
9
- namespace "capistrano:sidekiq:monit:template"
10
- desc "Create local monitrc.erb, and erb files for monitored processes for customization"
11
- source_root File.expand_path('../templates', __FILE__)
12
- argument :templates_path, type: :string,
13
- default: "config/deploy/templates",
14
- banner: "path to templates"
15
-
16
- def copy_template
17
- copy_file "sidekiq_monit.conf.erb", "#{templates_path}/sidekiq_monit.erb"
18
- end
19
-
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,8 +0,0 @@
1
- # Monit configuration for Sidekiq
2
- # Service name: <%= sidekiq_service_name %>
3
- #
4
- check process <%= sidekiq_service_name %>
5
- matching 'sidekiq .* <%= fetch(:application) %>'
6
- start program = "/bin/su - <%= sidekiq_user(role) %> -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:bundle] %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %> <%= sidekiq_concurrency %> <%= sidekiq_require %> <%= sidekiq_queues %> <%= sidekiq_logfile ? ">> #{sidekiq_logfile} 2>&1" : nil %> &'" with timeout <%= fetch(:sidekiq_timeout).to_i + 10 %> seconds
7
- stop program = "/bin/su - <%= sidekiq_user(role) %> -c 'ps ax | grep "<%= "sidekiq .* #{fetch(:application)}" %>" | grep -v grep | awk "{print \$1}" | xargs --no-run-if-empty kill'" with timeout <%= fetch(:sidekiq_timeout).to_i + 10 %> seconds
8
- group <%= fetch(:sidekiq_monit_group) || fetch(:application) %>-sidekiq