capistrano-sidekiq 0.20.0 → 1.0.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
  SHA1:
3
- metadata.gz: 50ef7df7aa365e37232b22ba2083cc679d1dc695
4
- data.tar.gz: 823d9f95a0ef7de7ab150b0e787b9f6404896998
3
+ metadata.gz: 32880c1c6b9be519c9495ac2c5d96339b1349c0d
4
+ data.tar.gz: e4957a5475c6b66ca3834c7ebfce013d944df4a1
5
5
  SHA512:
6
- metadata.gz: c5d075cf0db606e94647fa6b6247813fd26f9357f74022edecef03235d085de47cc52211b0e8c18b54bb4a8e63d5f30ccf03305a6a999c913964fa22a34ba682
7
- data.tar.gz: 269fc014f4ae8b33fa4d94505873ee3eaa254d2f254a09f3e0ddc1a5d38bff63c01ced1223c5da1f67bfbdea9900ab78d321e39fc5efb5ec06c8f34c1ebd702e
6
+ metadata.gz: '0229b5c4bdcc2504750737b61c8cc1960ff5f1e45f1d0ef19e61a38678862530ef0f1ae563bbc16d93e3be1a23ee0e0ae86c8d348de93c37f52d1b4ed6907883'
7
+ data.tar.gz: 651c4e097370eb64cf1a5a695982783522a8804a3a1282552e75a56e36b2fc43e89d59493e77b320abf46a4ca28053d67de8bc951b409371faa97d8ed7785bc4
@@ -0,0 +1,101 @@
1
+ # Changelog
2
+
3
+ ## 1.0.0
4
+
5
+ - Prepend underscore before service name index @Tensho
6
+ - Convert CHANGELOG to Markdown @Tensho
7
+ - Drop support for capistrano 2.0 @Tensho
8
+ - *BREAKING CHANGE* If people used custom monit template, they should adjust it to use pid_files variable instead of processes_pids. @Tensho
9
+
10
+ ## 0.20.0
11
+
12
+ - Use new capistrano DSL for reenable tasks @Tensho
13
+
14
+ ## 0.10.0
15
+
16
+ - Fix Monit tasks
17
+ - `sidekiq:stop` task perpertually callable @Tensho
18
+
19
+ ## 0.5.4
20
+
21
+ - Add support for custom count of processes per host in monit task @okoriko
22
+
23
+ ## 0.5.3
24
+
25
+ - Custom count of processes per each host
26
+
27
+ ## 0.5.0
28
+
29
+ - Multiple processes @mrsimo
30
+
31
+ ## 0.3.9
32
+
33
+ - Restore daemon flag from Monit template
34
+
35
+ ## 0.3.8
36
+
37
+ - Update monit template: use su instead of sudo / permit all Sidekiq options @bensie
38
+ - Unmonitor monit while deploy @Saicheg
39
+
40
+ ## 0.3.7
41
+
42
+ - Fix capistrano2 task @tribble
43
+ - Run Sidekiq as daemon from Monit @dpaluy
44
+
45
+ ## 0.3.5
46
+
47
+ - Added `:sidekiq_tag` for capistrano 2 @OscarBarrett
48
+
49
+ ## 0.3.4
50
+
51
+ - Fix bug in `sidekiq:start` for capistrano 2 task
52
+
53
+ ## 0.3.3
54
+
55
+ - `sidekiq:restart` after `deploy:restart` added to default hooks
56
+
57
+ ## 0.3.2
58
+
59
+ - `:sidekiq_queue` accept an array
60
+
61
+ ## 0.3.1
62
+
63
+ - Fix logs @rottman
64
+ - Add concurrency option support @ungsophy
65
+
66
+ ## 0.3.0
67
+
68
+ - Fix monit task @andreygerasimchuk
69
+
70
+ ## 0.2.9
71
+
72
+ - Check if current directory exist @alexdunae
73
+
74
+ ## 0.2.8
75
+
76
+ - Added `:sidekiq_queue` & `:sidekiq_config`
77
+
78
+ ## 0.2.7
79
+
80
+ - Signal usage @penso
81
+
82
+ ## 0.2.6
83
+
84
+ - `sidekiq:start` check if sidekiq is running
85
+
86
+ ## 0.2.5
87
+
88
+ - Bug fixes
89
+
90
+ ## 0.2.4
91
+
92
+ - Fast deploy with `:sidekiq_run_in_background`
93
+
94
+ ## 0.2.3
95
+
96
+ - Added monit tasks (alpha)
97
+
98
+ ## 0.2.0
99
+
100
+ - Added `sidekiq:rolling_restart` @jlecour
101
+
data/README.md CHANGED
@@ -41,16 +41,19 @@ Configurable options, shown here with defaults:
41
41
  :sidekiq_config => nil # if you have a config/sidekiq.yml, do not forget to set this.
42
42
  :sidekiq_queue => nil
43
43
  :sidekiq_timeout => 10
44
- :sidekiq_role => :app
44
+ :sidekiq_roles => :app
45
45
  :sidekiq_processes => 1
46
46
  :sidekiq_options_per_process => nil
47
47
  :sidekiq_concurrency => nil
48
+ # sidekiq monit
48
49
  :sidekiq_monit_templates_path => 'config/deploy/templates'
49
50
  :sidekiq_monit_conf_dir => '/etc/monit/conf.d'
50
51
  :sidekiq_monit_use_sudo => true
51
52
  :monit_bin => '/usr/bin/monit'
52
53
  :sidekiq_monit_default_hooks => true
53
- :sidekiq_service_name => "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}"
54
+ :sidekiq_monit_group => nil
55
+ :sidekiq_service_name => "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}" + (index ? "_#{index}" : '')
56
+
54
57
  :sidekiq_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" # Only for capistrano2.5
55
58
  :sidekiqctl_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" # Only for capistrano2.5
56
59
  :sidekiq_user => nil #user to run sidekiq as
@@ -74,12 +77,12 @@ and `low`:
74
77
  set :sidekiq_options_per_process, ["--queue high", "--queue default --queue low"]
75
78
  ```
76
79
 
77
- ## Different number of processes per host
80
+ ## Different number of processes per role
78
81
 
79
82
  You can configure how many processes you want to run on each host next way:
80
83
 
81
84
  ```ruby
82
- set :sidekiq_role, [:sidekiq_small, :sidekiq_big]
85
+ set :sidekiq_roles, [:sidekiq_small, :sidekiq_big]
83
86
  set :sidekiq_small_processes, 1
84
87
  set :sidekiq_big_processes, 4
85
88
  server 'example-small.com', roles: [:sidekiq_small]
@@ -5,7 +5,7 @@ require 'capistrano/sidekiq/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'capistrano-sidekiq'
8
- spec.version = Capistrano::Sidekiq::VERSION
8
+ spec.version = Capistrano::SidekiqVERSION
9
9
  spec.authors = ['Abdelkader Boudih']
10
10
  spec.email = ['terminale@gmail.com']
11
11
  spec.summary = %q{Sidekiq integration for Capistrano}
@@ -1,5 +1 @@
1
- if Gem::Specification.find_by_name('capistrano').version >= Gem::Version.new('3.0.0')
2
- load File.expand_path('../tasks/sidekiq.rake', __FILE__)
3
- else
4
- require_relative 'tasks/capistrano2'
5
- end
1
+ load File.expand_path('../tasks/sidekiq.rake', __FILE__)
@@ -1,2 +1 @@
1
- # load monit tasks
2
- load File.expand_path('../../tasks/monit.rake', __FILE__)
1
+ load File.expand_path('../../tasks/monit.rake', __FILE__)
@@ -1,5 +1,3 @@
1
1
  module Capistrano
2
- module Sidekiq
3
- VERSION = '0.20.0'
4
- end
2
+ SidekiqVERSION = '1.0.0'
5
3
  end
@@ -5,6 +5,7 @@ namespace :load do
5
5
  set :monit_bin, '/usr/bin/monit'
6
6
  set :sidekiq_monit_default_hooks, true
7
7
  set :sidekiq_monit_templates_path, 'config/deploy/templates'
8
+ set :sidekiq_monit_group, nil
8
9
  end
9
10
  end
10
11
 
@@ -26,7 +27,7 @@ namespace :sidekiq do
26
27
 
27
28
  desc 'Config Sidekiq monit-service'
28
29
  task :config do
29
- on roles(fetch(:sidekiq_role)) do |role|
30
+ on roles(fetch(:sidekiq_roles)) do |role|
30
31
  @role = role
31
32
  upload_sidekiq_template 'sidekiq_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
32
33
 
@@ -39,7 +40,7 @@ namespace :sidekiq do
39
40
 
40
41
  desc 'Monitor Sidekiq monit-service'
41
42
  task :monitor do
42
- on roles(fetch(:sidekiq_role)) do
43
+ on roles(fetch(:sidekiq_roles)) do
43
44
  fetch(:sidekiq_processes).times do |idx|
44
45
  begin
45
46
  sudo_if_needed "#{fetch(:monit_bin)} monitor #{sidekiq_service_name(idx)}"
@@ -53,7 +54,7 @@ namespace :sidekiq do
53
54
 
54
55
  desc 'Unmonitor Sidekiq monit-service'
55
56
  task :unmonitor do
56
- on roles(fetch(:sidekiq_role)) do
57
+ on roles(fetch(:sidekiq_roles)) do
57
58
  fetch(:sidekiq_processes).times do |idx|
58
59
  begin
59
60
  sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{sidekiq_service_name(idx)}"
@@ -66,7 +67,7 @@ namespace :sidekiq do
66
67
 
67
68
  desc 'Start Sidekiq monit-service'
68
69
  task :start do
69
- on roles(fetch(:sidekiq_role)) do
70
+ on roles(fetch(:sidekiq_roles)) do
70
71
  fetch(:sidekiq_processes).times do |idx|
71
72
  sudo_if_needed "#{fetch(:monit_bin)} start #{sidekiq_service_name(idx)}"
72
73
  end
@@ -75,7 +76,7 @@ namespace :sidekiq do
75
76
 
76
77
  desc 'Stop Sidekiq monit-service'
77
78
  task :stop do
78
- on roles(fetch(:sidekiq_role)) do
79
+ on roles(fetch(:sidekiq_roles)) do
79
80
  fetch(:sidekiq_processes).times do |idx|
80
81
  sudo_if_needed "#{fetch(:monit_bin)} stop #{sidekiq_service_name(idx)}"
81
82
  end
@@ -84,7 +85,7 @@ namespace :sidekiq do
84
85
 
85
86
  desc 'Restart Sidekiq monit-service'
86
87
  task :restart do
87
- on roles(fetch(:sidekiq_role)) do
88
+ on roles(fetch(:sidekiq_roles)) do
88
89
  fetch(:sidekiq_processes).times do |idx|
89
90
  sudo_if_needed"#{fetch(:monit_bin)} restart #{sidekiq_service_name(idx)}"
90
91
  end
@@ -92,7 +93,7 @@ namespace :sidekiq do
92
93
  end
93
94
 
94
95
  def sidekiq_service_name(index=nil)
95
- fetch(:sidekiq_service_name, "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}") + index.to_s
96
+ fetch(:sidekiq_service_name, "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}") + (index ? "_#{index}" : '')
96
97
  end
97
98
 
98
99
  def sidekiq_config
@@ -137,5 +138,30 @@ namespace :sidekiq do
137
138
  fetch(:sidekiq_monit_use_sudo)
138
139
  end
139
140
 
141
+ def upload_sidekiq_template(from, to, role)
142
+ template = sidekiq_template(from, role)
143
+ upload!(StringIO.new(ERB.new(template).result(binding)), to)
144
+ end
145
+
146
+ def sidekiq_template(name, role)
147
+ local_template_directory = fetch(:sidekiq_monit_templates_path)
148
+
149
+ search_paths = [
150
+ "#{name}-#{role.hostname}-#{fetch(:stage)}.erb",
151
+ "#{name}-#{role.hostname}.erb",
152
+ "#{name}-#{fetch(:stage)}.erb",
153
+ "#{name}.erb"
154
+ ].map { |filename| File.join(local_template_directory, filename) }
155
+
156
+ global_search_path = File.expand_path(
157
+ File.join(*%w[.. .. .. generators capistrano sidekiq monit templates], "#{name}.conf.erb"),
158
+ __FILE__
159
+ )
160
+
161
+ search_paths << global_search_path
162
+
163
+ template_path = search_paths.detect { |path| File.file?(path) }
164
+ File.read(template_path)
165
+ end
140
166
  end
141
167
  end
@@ -1,15 +1,15 @@
1
1
  namespace :load do
2
2
  task :defaults do
3
- set :sidekiq_default_hooks, -> { true }
3
+ set :sidekiq_default_hooks, true
4
4
 
5
5
  set :sidekiq_pid, -> { File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') }
6
6
  set :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
7
7
  set :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
8
- set :sidekiq_timeout, -> { 10 }
9
- set :sidekiq_role, -> { :app }
10
- set :sidekiq_processes, -> { 1 }
11
- set :sidekiq_options_per_process, -> { nil }
12
- set :sidekiq_user, -> { nil }
8
+ set :sidekiq_timeout, 10
9
+ set :sidekiq_roles, :app
10
+ set :sidekiq_processes, 1
11
+ set :sidekiq_options_per_process, nil
12
+ set :sidekiq_user, nil
13
13
  # Rbenv, Chruby, and RVM integration
14
14
  set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
15
15
  set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
@@ -29,110 +29,20 @@ namespace :deploy do
29
29
  end
30
30
 
31
31
  namespace :sidekiq do
32
- def for_each_process(reverse = false, &block)
33
- pids = processes_pids
34
- pids.reverse! if reverse
35
- pids.each_with_index do |pid_file, idx|
36
- within release_path do
37
- yield(pid_file, idx)
38
- end
39
- end
40
- end
41
-
42
- def processes_pids
43
- pids = []
44
- sidekiq_roles = Array(fetch(:sidekiq_role))
45
- sidekiq_roles.each do |role|
46
- next unless host.roles.include?(role)
47
- processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
48
- processes.times do |idx|
49
- pids.push fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid")
50
- end
51
- end
52
-
53
- pids
54
- end
55
-
56
- def pid_process_exists?(pid_file)
57
- pid_file_exists?(pid_file) and test(*("kill -0 $( cat #{pid_file} )").split(' '))
58
- end
59
-
60
- def pid_file_exists?(pid_file)
61
- test(*("[ -f #{pid_file} ]").split(' '))
62
- end
63
-
64
- def stop_sidekiq(pid_file)
65
- if fetch(:stop_sidekiq_in_background, fetch(:sidekiq_run_in_background))
66
- if fetch(:sidekiq_use_signals)
67
- background "kill -TERM `cat #{pid_file}`"
68
- else
69
- background :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
70
- end
71
- else
72
- execute :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
73
- end
74
- end
75
-
76
- def quiet_sidekiq(pid_file)
77
- if fetch(:sidekiq_use_signals)
78
- background "kill -USR1 `cat #{pid_file}`"
79
- else
80
- begin
81
- execute :sidekiqctl, 'quiet', "#{pid_file}"
82
- rescue SSHKit::Command::Failed
83
- # If gems are not installed eq(first deploy) and sidekiq_default_hooks as active
84
- warn 'sidekiqctl not found (ignore if this is the first deploy)'
85
- end
86
- end
87
- end
88
-
89
- def start_sidekiq(pid_file, idx = 0)
90
- args = []
91
- args.push "--index #{idx}"
92
- args.push "--pidfile #{pid_file}"
93
- args.push "--environment #{fetch(:sidekiq_env)}"
94
- args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
95
- args.push "--require #{fetch(:sidekiq_require)}" if fetch(:sidekiq_require)
96
- args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
97
- Array(fetch(:sidekiq_queue)).each do |queue|
98
- args.push "--queue #{queue}"
99
- end
100
- args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
101
- args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
102
- if process_options = fetch(:sidekiq_options_per_process)
103
- args.push process_options[idx]
104
- end
105
- # use sidekiq_options for special options
106
- args.push fetch(:sidekiq_options) if fetch(:sidekiq_options)
107
-
108
- if defined?(JRUBY_VERSION)
109
- args.push '>/dev/null 2>&1 &'
110
- warn 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
111
- else
112
- args.push '--daemon'
113
- end
114
-
115
- if fetch(:start_sidekiq_in_background, fetch(:sidekiq_run_in_background))
116
- background :sidekiq, args.compact.join(' ')
117
- else
118
- execute :sidekiq, args.compact.join(' ')
119
- end
120
- end
121
-
122
32
  task :add_default_hooks do
123
- after 'deploy:starting', 'sidekiq:quiet'
124
- after 'deploy:updated', 'sidekiq:stop'
125
- after 'deploy:reverted', 'sidekiq:stop'
33
+ after 'deploy:starting', 'sidekiq:quiet'
34
+ after 'deploy:updated', 'sidekiq:stop'
35
+ after 'deploy:reverted', 'sidekiq:stop'
126
36
  after 'deploy:published', 'sidekiq:start'
127
37
  end
128
38
 
129
- desc 'Quiet sidekiq (stop processing new tasks)'
39
+ desc 'Quiet sidekiq (stop fetching new tasks from Redis)'
130
40
  task :quiet do
131
- on roles fetch(:sidekiq_role) do |role|
41
+ on roles fetch(:sidekiq_roles) do |role|
132
42
  switch_user(role) do
133
- if test("[ -d #{release_path} ]") # fixes #11
134
- for_each_process(true) do |pid_file, idx|
135
- if pid_process_exists?(pid_file)
43
+ if test("[ -d #{release_path} ]")
44
+ each_process_with_index(reverse: true) do |pid_file, idx|
45
+ if pid_file_exists?(pid_file) && process_exists?(pid_file)
136
46
  quiet_sidekiq(pid_file)
137
47
  end
138
48
  end
@@ -141,13 +51,13 @@ namespace :sidekiq do
141
51
  end
142
52
  end
143
53
 
144
- desc 'Stop sidekiq'
54
+ desc 'Stop sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)'
145
55
  task :stop do
146
- on roles fetch(:sidekiq_role) do |role|
56
+ on roles fetch(:sidekiq_roles) do |role|
147
57
  switch_user(role) do
148
58
  if test("[ -d #{release_path} ]")
149
- for_each_process(true) do |pid_file, idx|
150
- if pid_process_exists?(pid_file)
59
+ each_process_with_index(reverse: true) do |pid_file, idx|
60
+ if pid_file_exists?(pid_file) && process_exists?(pid_file)
151
61
  stop_sidekiq(pid_file)
152
62
  end
153
63
  end
@@ -158,10 +68,12 @@ namespace :sidekiq do
158
68
 
159
69
  desc 'Start sidekiq'
160
70
  task :start do
161
- on roles fetch(:sidekiq_role) do |role|
71
+ on roles fetch(:sidekiq_roles) do |role|
162
72
  switch_user(role) do
163
- for_each_process do |pid_file, idx|
164
- start_sidekiq(pid_file, idx) unless pid_process_exists?(pid_file)
73
+ each_process_with_index do |pid_file, idx|
74
+ unless pid_file_exists?(pid_file) && process_exists?(pid_file)
75
+ start_sidekiq(pid_file, idx)
76
+ end
165
77
  end
166
78
  end
167
79
  end
@@ -175,10 +87,10 @@ namespace :sidekiq do
175
87
 
176
88
  desc 'Rolling-restart sidekiq'
177
89
  task :rolling_restart do
178
- on roles fetch(:sidekiq_role) do |role|
90
+ on roles fetch(:sidekiq_roles) do |role|
179
91
  switch_user(role) do
180
- for_each_process(true) do |pid_file, idx|
181
- if pid_process_exists?(pid_file)
92
+ each_process_with_index(true) do |pid_file, idx|
93
+ if pid_file_exists?(pid_file) && process_exists?(pid_file)
182
94
  stop_sidekiq(pid_file)
183
95
  end
184
96
  start_sidekiq(pid_file, idx)
@@ -187,26 +99,28 @@ namespace :sidekiq do
187
99
  end
188
100
  end
189
101
 
190
- # Delete any pid file not in use
102
+ desc 'Delete any pid file not in use'
191
103
  task :cleanup do
192
- on roles fetch(:sidekiq_role) do |role|
104
+ on roles fetch(:sidekiq_roles) do |role|
193
105
  switch_user(role) do
194
- for_each_process do |pid_file, idx|
195
- if pid_file_exists?(pid_file)
196
- execute "rm #{pid_file}" unless pid_process_exists?(pid_file)
106
+ each_process_with_index do |pid_file, idx|
107
+ unless process_exists?(pid_file)
108
+ if pid_file_exists?(pid_file)
109
+ execute "rm #{pid_file}"
110
+ end
197
111
  end
198
112
  end
199
113
  end
200
114
  end
201
115
  end
202
116
 
203
- # TODO : Don't start if all processes are off, raise warning.
117
+ # TODO: Don't start if all processes are off, raise warning.
204
118
  desc 'Respawn missing sidekiq processes'
205
119
  task :respawn do
206
120
  invoke 'sidekiq:cleanup'
207
- on roles fetch(:sidekiq_role) do |role|
121
+ on roles fetch(:sidekiq_roles) do |role|
208
122
  switch_user(role) do
209
- for_each_process do |pid_file, idx|
123
+ each_process_with_index do |pid_file, idx|
210
124
  unless pid_file_exists?(pid_file)
211
125
  start_sidekiq(pid_file, idx)
212
126
  end
@@ -215,6 +129,75 @@ namespace :sidekiq do
215
129
  end
216
130
  end
217
131
 
132
+ def each_process_with_index(reverse: false)
133
+ _pid_files = pid_files
134
+ _pid_files.reverse! if reverse
135
+ _pid_files.each_with_index do |pid_file, idx|
136
+ within release_path do
137
+ yield(pid_file, idx)
138
+ end
139
+ end
140
+ end
141
+
142
+ def pid_files
143
+ sidekiq_roles = Array(fetch(:sidekiq_roles))
144
+ sidekiq_roles.select! { |role| host.roles.include?(role) }
145
+ sidekiq_roles.flat_map do |role|
146
+ processes = fetch(:"#{ role }_processes") || fetch(:sidekiq_processes)
147
+ Array.new(processes) { |idx| fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid") }
148
+ end
149
+ end
150
+
151
+ def pid_file_exists?(pid_file)
152
+ test(*("[ -f #{pid_file} ]").split(' '))
153
+ end
154
+
155
+ def process_exists?(pid_file)
156
+ test(*("kill -0 $( cat #{pid_file} )").split(' '))
157
+ end
158
+
159
+ def quiet_sidekiq(pid_file)
160
+ begin
161
+ execute :sidekiqctl, 'quiet', "#{pid_file}"
162
+ rescue SSHKit::Command::Failed
163
+ # If gems are not installed (first deploy) and sidekiq_default_hooks is active
164
+ warn 'sidekiqctl not found (ignore if this is the first deploy)'
165
+ end
166
+ end
167
+
168
+ def stop_sidekiq(pid_file)
169
+ execute :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
170
+ end
171
+
172
+ def start_sidekiq(pid_file, idx = 0)
173
+ args = []
174
+ args.push "--index #{idx}"
175
+ args.push "--pidfile #{pid_file}"
176
+ args.push "--environment #{fetch(:sidekiq_env)}"
177
+ args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
178
+ args.push "--require #{fetch(:sidekiq_require)}" if fetch(:sidekiq_require)
179
+ args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
180
+ Array(fetch(:sidekiq_queue)).each do |queue|
181
+ args.push "--queue #{queue}"
182
+ end
183
+ args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
184
+ args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
185
+ if process_options = fetch(:sidekiq_options_per_process)
186
+ args.push process_options[idx]
187
+ end
188
+ # use sidekiq_options for special options
189
+ args.push fetch(:sidekiq_options) if fetch(:sidekiq_options)
190
+
191
+ if defined?(JRUBY_VERSION)
192
+ args.push '>/dev/null 2>&1 &'
193
+ warn 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
194
+ else
195
+ args.push '--daemon'
196
+ end
197
+
198
+ execute :sidekiq, args.compact.join(' ')
199
+ end
200
+
218
201
  def switch_user(role, &block)
219
202
  su_user = sidekiq_user(role)
220
203
  if su_user == role.user
@@ -228,35 +211,9 @@ namespace :sidekiq do
228
211
 
229
212
  def sidekiq_user(role)
230
213
  properties = role.properties
231
- properties.fetch(:sidekiq_user) || # local property for sidekiq only
214
+ properties.fetch(:sidekiq_user) || # local property for sidekiq only
232
215
  fetch(:sidekiq_user) ||
233
216
  properties.fetch(:run_as) || # global property across multiple capistrano gems
234
217
  role.user
235
218
  end
236
-
237
- def upload_sidekiq_template(from, to, role)
238
- template = sidekiq_template(from, role)
239
- upload!(StringIO.new(ERB.new(template).result(binding)), to)
240
- end
241
-
242
- def sidekiq_template(name, role)
243
- local_template_directory = fetch(:sidekiq_monit_templates_path)
244
-
245
- search_paths = [
246
- "#{name}-#{role.hostname}-#{fetch(:stage)}.erb",
247
- "#{name}-#{role.hostname}.erb",
248
- "#{name}-#{fetch(:stage)}.erb",
249
- "#{name}.erb"
250
- ].map { |filename| File.join(local_template_directory, filename) }
251
-
252
- global_search_path = File.expand_path(
253
- File.join(*%w[.. .. .. generators capistrano sidekiq monit templates], "#{name}.conf.erb"),
254
- __FILE__
255
- )
256
-
257
- search_paths << global_search_path
258
-
259
- template_path = search_paths.detect { |path| File.file?(path) }
260
- File.read(template_path)
261
- end
262
219
  end
@@ -1,5 +1,5 @@
1
1
  # Monit configuration for Sidekiq : <%= fetch(:application) %>
2
- <% processes_pids.each_with_index do |pid_file, idx| %>
2
+ <% pid_files.each_with_index do |pid_file, idx| %>
3
3
  check process <%= sidekiq_service_name(idx) %>
4
4
  with pidfile "<%= pid_file %>"
5
5
  start program = "/bin/su - <%= sidekiq_user(@role) %> -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:sidekiq] %> <%= sidekiq_config %> --index <%= idx %> --pidfile <%= pid_file %> --environment <%= fetch(:sidekiq_env) %> <%= sidekiq_concurrency %> <%= sidekiq_logfile %> <%= sidekiq_require %> <%= sidekiq_queues %> <%= sidekiq_options_per_process[idx] %> -d'" with timeout 30 seconds
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-01 00:00:00.000000000 Z
11
+ date: 2018-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -46,7 +46,7 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - ".gitignore"
49
- - CHANGELOG
49
+ - CHANGELOG.md
50
50
  - CONTRIBUTORS.md
51
51
  - Gemfile
52
52
  - LICENSE.txt
@@ -57,7 +57,6 @@ files:
57
57
  - lib/capistrano/sidekiq.rb
58
58
  - lib/capistrano/sidekiq/monit.rb
59
59
  - lib/capistrano/sidekiq/version.rb
60
- - lib/capistrano/tasks/capistrano2.rb
61
60
  - lib/capistrano/tasks/monit.rake
62
61
  - lib/capistrano/tasks/sidekiq.rake
63
62
  - lib/generators/capistrano/sidekiq/monit/template_generator.rb
data/CHANGELOG DELETED
@@ -1,28 +0,0 @@
1
- ## Changelog
2
- - 0.10.0:
3
- * Fix Monit tasks
4
- * sidekiq:stop task perpertually callable
5
- - 0.5.4: Add support for custom count of processes per host in monit task @okoriko
6
- - 0.5.3: Custom count of processes per each host
7
- - 0.5.0: Multiple processes @mrsimo
8
- - 0.3.9: Restore daemon flag from Monit template
9
- - 0.3.8:
10
- * Update monit template: use su instead of sudo / permit all Sidekiq options @bensie
11
- * Unmonitor monit while deploy @Saicheg
12
- - 0.3.7:
13
- * fix capistrano2 task @tribble
14
- * Run Sidekiq as daemon from Monit @dpaluy
15
- - 0.3.5: Added :sidekiq_tag for capistrano2 @OscarBarrett
16
- - 0.3.4: fix bug in sidekiq:start for capistrano 2 task
17
- - 0.3.3: sidekiq:restart after deploy:restart added to default hooks
18
- - 0.3.2: :sidekiq_queue accept an array
19
- - 0.3.1: Fix logs @rottman, add concurrency option support @ungsophy
20
- - 0.3.0: Fix monit task @andreygerasimchuk
21
- - 0.2.9: Check if current directory exist @alexdunae
22
- - 0.2.8: Added :sidekiq_queue & :sidekiq_config
23
- - 0.2.7: Signal usage @penso
24
- - 0.2.6: sidekiq:start check if sidekiq is running
25
- - 0.2.5: bug fixes
26
- - 0.2.4: Fast deploy with :sidekiq_run_in_background
27
- - 0.2.3: Added monit tasks (alpha)
28
- - 0.2.0: Added sidekiq:rolling_restart - @jlecour
@@ -1,147 +0,0 @@
1
- Capistrano::Configuration.instance.load do
2
-
3
- _cset(:sidekiq_default_hooks) { true }
4
-
5
- _cset(:sidekiq_pid) { File.join(shared_path, 'pids', 'sidekiq.pid') }
6
- _cset(:sidekiq_env) { fetch(:rack_env, fetch(:rails_env, 'production')) }
7
- _cset(:sidekiq_tag) { nil }
8
- _cset(:sidekiq_log) { File.join(shared_path, 'log', 'sidekiq.log') }
9
-
10
- _cset(:sidekiq_config) { "#{current_path}/config/sidekiq.yml" }
11
- _cset(:sidekiq_options) { nil }
12
- _cset(:sidekiq_queue) { nil }
13
- _cset(:sidekiq_concurrency) { nil }
14
-
15
- _cset(:sidekiq_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec sidekiq" }
16
- _cset(:sidekiqctl_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec sidekiqctl" }
17
-
18
- _cset(:sidekiq_timeout) { 10 }
19
- _cset(:sidekiq_role) { :app }
20
-
21
- _cset(:sidekiq_processes) { 1 }
22
- _cset(:sidekiq_options_per_process) { nil }
23
-
24
- _cset(:sidekiq_user) { nil }
25
-
26
- if fetch(:sidekiq_default_hooks)
27
- before 'deploy:update_code', 'sidekiq:quiet'
28
- after 'deploy:stop', 'sidekiq:stop'
29
- after 'deploy:start', 'sidekiq:start'
30
- before 'deploy:restart', 'sidekiq:restart'
31
- end
32
-
33
- namespace :sidekiq do
34
- def for_each_process(sidekiq_role, &block)
35
- sidekiq_processes = fetch(:"#{ sidekiq_role }_processes") rescue 1
36
- sidekiq_processes.times do |idx|
37
- pid_file = fetch(:sidekiq_pid).gsub(/\.pid$/, "-#{idx}.pid")
38
- yield(pid_file, idx)
39
- end
40
- end
41
-
42
- def for_each_role
43
- sidekiq_roles = fetch(:sidekiq_role)
44
-
45
- sidekiq_roles = if sidekiq_roles.respond_to?(:to_ary)
46
- sidekiq_roles.to_ary
47
- else
48
- [sidekiq_roles]
49
- end
50
-
51
- sidekiq_roles.to_ary.each do |sidekiq_role|
52
- puts "executing on ##{ sidekiq_role }" if sidekiq_roles.size > 1
53
- yield(sidekiq_role)
54
- end
55
- end
56
-
57
- def run_as(cmd)
58
- opts = {
59
- roles: sidekiq_role
60
- }
61
- su_user = fetch(:sidekiq_user)
62
- opts[:shell] = "su - #{su_user}" if su_user
63
- run cmd, opts
64
- end
65
-
66
- def quiet_process(pid_file, idx, sidekiq_role)
67
- run_as "if [ -d #{current_path} ] && [ -f #{pid_file} ] && kill -0 `cat #{pid_file}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} quiet #{pid_file} ; else echo 'Sidekiq is not running'; fi"
68
- end
69
-
70
- def stop_process(pid_file, idx, sidekiq_role)
71
- run_as "if [ -d #{current_path} ] && [ -f #{pid_file} ] && kill -0 `cat #{pid_file}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} stop #{pid_file} #{fetch :sidekiq_timeout} ; else echo 'Sidekiq is not running'; fi"
72
- end
73
-
74
- def start_process(pid_file, idx, sidekiq_role)
75
- args = []
76
- args.push "--index #{idx}"
77
- args.push "--pidfile #{pid_file}"
78
- args.push "--environment #{fetch(:sidekiq_env)}"
79
- args.push "--tag #{fetch(:sidekiq_tag)}" if fetch(:sidekiq_tag)
80
- args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
81
- args.push "--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
82
- args.push "--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
83
- fetch(:sidekiq_queue).each do |queue|
84
- args.push "--queue #{queue}"
85
- end if fetch(:sidekiq_queue)
86
-
87
- if process_options = fetch(:sidekiq_options_per_process)
88
- args.push process_options[idx]
89
- end
90
-
91
- args.push fetch(:sidekiq_options)
92
-
93
- if defined?(JRUBY_VERSION)
94
- args.push '>/dev/null 2>&1 &'
95
- logger.info 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
96
- else
97
- args.push '--daemon'
98
- end
99
-
100
- run_as "if [ -d #{current_path} ] && [ ! -f #{pid_file} ] || ! kill -0 `cat #{pid_file}` > /dev/null 2>&1; then cd #{current_path} ; #{fetch(:sidekiq_cmd)} #{args.compact.join(' ')} ; else echo 'Sidekiq is already running'; fi"
101
- end
102
-
103
- desc 'Quiet sidekiq (stop accepting new work)'
104
- task :quiet, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
105
- for_each_role do |sidekiq_role|
106
- for_each_process(sidekiq_role) do |pid_file, idx|
107
- quiet_process(pid_file, idx, sidekiq_role)
108
- end
109
- end
110
- end
111
-
112
- desc 'Stop sidekiq'
113
- task :stop, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
114
- for_each_role do |sidekiq_role|
115
- for_each_process(sidekiq_role) do |pid_file, idx|
116
- stop_process(pid_file, idx, sidekiq_role)
117
- end
118
- end
119
- end
120
-
121
- desc 'Start sidekiq'
122
- task :start, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
123
- for_each_role do |sidekiq_role|
124
- for_each_process(sidekiq_role) do |pid_file, idx|
125
- start_process(pid_file, idx, sidekiq_role)
126
- end
127
- end
128
- end
129
-
130
- desc 'Rolling-restart sidekiq'
131
- task :rolling_restart, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
132
- for_each_role do |sidekiq_role|
133
- for_each_process(sidekiq_role) do |pid_file, idx|
134
- stop_process(pid_file, idx, sidekiq_role)
135
- start_process(pid_file, idx, sidekiq_role)
136
- end
137
- end
138
- end
139
-
140
- desc 'Restart sidekiq'
141
- task :restart, roles: lambda { fetch(:sidekiq_role) }, on_no_matching_servers: :continue do
142
- stop
143
- start
144
- end
145
-
146
- end
147
- end