capistrano-sidekiq 0.20.0 → 2.3.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.
@@ -1,12 +1,4 @@
1
- namespace :load do
2
- task :defaults do
3
- set :sidekiq_monit_conf_dir, '/etc/monit/conf.d'
4
- set :sidekiq_monit_use_sudo, true
5
- set :monit_bin, '/usr/bin/monit'
6
- set :sidekiq_monit_default_hooks, true
7
- set :sidekiq_monit_templates_path, 'config/deploy/templates'
8
- end
9
- end
1
+ git_plugin = self
10
2
 
11
3
  namespace :deploy do
12
4
  before :starting, :check_sidekiq_monit_hooks do
@@ -18,7 +10,6 @@ end
18
10
 
19
11
  namespace :sidekiq do
20
12
  namespace :monit do
21
-
22
13
  task :add_default_hooks do
23
14
  before 'deploy:updating', 'sidekiq:monit:unmonitor'
24
15
  after 'deploy:published', 'sidekiq:monit:monitor'
@@ -26,26 +17,28 @@ namespace :sidekiq do
26
17
 
27
18
  desc 'Config Sidekiq monit-service'
28
19
  task :config do
29
- on roles(fetch(:sidekiq_role)) do |role|
20
+ on roles(fetch(:sidekiq_roles)) do |role|
30
21
  @role = role
31
- upload_sidekiq_template 'sidekiq_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
22
+ git_plugin.upload_sidekiq_template 'sidekiq_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
32
23
 
33
- mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{sidekiq_service_name}.conf"
34
- sudo_if_needed mv_command
24
+ git_plugin.switch_user(role) do
25
+ mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{fetch(:sidekiq_monit_conf_file)}"
35
26
 
36
- sudo_if_needed "#{fetch(:monit_bin)} reload"
27
+ git_plugin.sudo_if_needed mv_command
28
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} reload"
29
+ end
37
30
  end
38
31
  end
39
32
 
40
33
  desc 'Monitor Sidekiq monit-service'
41
34
  task :monitor do
42
- on roles(fetch(:sidekiq_role)) do
43
- fetch(:sidekiq_processes).times do |idx|
35
+ on roles(fetch(:sidekiq_roles)) do |role|
36
+ git_plugin.switch_user(role) do
44
37
  begin
45
- sudo_if_needed "#{fetch(:monit_bin)} monitor #{sidekiq_service_name(idx)}"
38
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} monitor #{git_plugin.sidekiq_service_name}"
46
39
  rescue
47
40
  invoke 'sidekiq:monit:config'
48
- sudo_if_needed "#{fetch(:monit_bin)} monitor #{sidekiq_service_name(idx)}"
41
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} monitor #{git_plugin.sidekiq_service_name}"
49
42
  end
50
43
  end
51
44
  end
@@ -53,89 +46,82 @@ namespace :sidekiq do
53
46
 
54
47
  desc 'Unmonitor Sidekiq monit-service'
55
48
  task :unmonitor do
56
- on roles(fetch(:sidekiq_role)) do
57
- fetch(:sidekiq_processes).times do |idx|
49
+ on roles(fetch(:sidekiq_roles)) do |role|
50
+ git_plugin.switch_user(role) do
58
51
  begin
59
- sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{sidekiq_service_name(idx)}"
52
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{git_plugin.sidekiq_service_name}"
60
53
  rescue
61
54
  # no worries here
62
55
  end
63
56
  end
64
57
  end
65
58
  end
59
+ end
66
60
 
67
- desc 'Start Sidekiq monit-service'
68
- task :start do
69
- on roles(fetch(:sidekiq_role)) do
70
- fetch(:sidekiq_processes).times do |idx|
71
- sudo_if_needed "#{fetch(:monit_bin)} start #{sidekiq_service_name(idx)}"
72
- end
73
- end
74
- end
75
-
76
- desc 'Stop Sidekiq monit-service'
77
- task :stop do
78
- on roles(fetch(:sidekiq_role)) do
79
- fetch(:sidekiq_processes).times do |idx|
80
- sudo_if_needed "#{fetch(:monit_bin)} stop #{sidekiq_service_name(idx)}"
81
- end
61
+ desc 'Start Sidekiq monit-service'
62
+ task :start do
63
+ on roles(fetch(:sidekiq_roles)) do |role|
64
+ git_plugin.switch_user(role) do
65
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} start #{git_plugin.sidekiq_service_name}"
82
66
  end
83
67
  end
68
+ end
84
69
 
85
- desc 'Restart Sidekiq monit-service'
86
- task :restart do
87
- on roles(fetch(:sidekiq_role)) do
88
- fetch(:sidekiq_processes).times do |idx|
89
- sudo_if_needed"#{fetch(:monit_bin)} restart #{sidekiq_service_name(idx)}"
90
- end
70
+ desc 'Stop Sidekiq monit-service'
71
+ task :stop do
72
+ on roles(fetch(:sidekiq_roles)) do |role|
73
+ git_plugin.switch_user(role) do
74
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} stop #{git_plugin.sidekiq_service_name}"
91
75
  end
92
76
  end
77
+ end
93
78
 
94
- def sidekiq_service_name(index=nil)
95
- fetch(:sidekiq_service_name, "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}") + index.to_s
79
+ desc 'Restart Sidekiq monit-service'
80
+ task :restart do
81
+ on roles(fetch(:sidekiq_roles)) do |role|
82
+ git_plugin.sudo_if_needed "#{fetch(:monit_bin)} restart #{git_plugin.sidekiq_service_name}"
96
83
  end
84
+ end
97
85
 
98
- def sidekiq_config
99
- if fetch(:sidekiq_config)
100
- "--config #{fetch(:sidekiq_config)}"
101
- end
102
- end
86
+ def sidekiq_service_name
87
+ fetch(:sidekiq_service_name, "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}")
88
+ end
103
89
 
104
- def sidekiq_concurrency
105
- if fetch(:sidekiq_concurrency)
106
- "--concurrency #{fetch(:sidekiq_concurrency)}"
107
- end
90
+ def sudo_if_needed(command)
91
+ if use_sudo?
92
+ backend.execute :sudo, command
93
+ else
94
+ backend.execute command
108
95
  end
96
+ end
109
97
 
110
- def sidekiq_queues
111
- Array(fetch(:sidekiq_queue)).map do |queue|
112
- "--queue #{queue}"
113
- end.join(' ')
114
- end
98
+ def use_sudo?
99
+ fetch(:sidekiq_monit_use_sudo)
100
+ end
115
101
 
116
- def sidekiq_logfile
117
- if fetch(:sidekiq_log)
118
- "--logfile #{fetch(:sidekiq_log)}"
119
- end
120
- end
102
+ def upload_sidekiq_template(from, to, role)
103
+ template = sidekiq_template(from, role)
104
+ backend.upload!(StringIO.new(ERB.new(template).result(binding)), to)
105
+ end
121
106
 
122
- def sidekiq_require
123
- if fetch(:sidekiq_require)
124
- "--require #{fetch(:sidekiq_require)}"
125
- end
126
- end
107
+ def sidekiq_template(name, role)
108
+ local_template_directory = fetch(:sidekiq_monit_templates_path)
127
109
 
128
- def sidekiq_options_per_process
129
- fetch(:sidekiq_options_per_process) || []
130
- end
110
+ search_paths = [
111
+ "#{name}-#{role.hostname}-#{fetch(:stage)}.erb",
112
+ "#{name}-#{role.hostname}.erb",
113
+ "#{name}-#{fetch(:stage)}.erb",
114
+ "#{name}.erb"
115
+ ].map { |filename| File.join(local_template_directory, filename) }
131
116
 
132
- def sudo_if_needed(command)
133
- send(use_sudo? ? :sudo : :execute, command)
134
- end
117
+ global_search_path = File.expand_path(
118
+ File.join(*%w[.. .. .. generators capistrano sidekiq monit templates], "#{name}.conf.erb"),
119
+ __FILE__
120
+ )
135
121
 
136
- def use_sudo?
137
- fetch(:sidekiq_monit_use_sudo)
138
- end
122
+ search_paths << global_search_path
139
123
 
124
+ template_path = search_paths.detect { |path| File.file?(path) }
125
+ File.read(template_path)
140
126
  end
141
127
  end
@@ -1,262 +1,14 @@
1
- namespace :load do
2
- task :defaults do
3
- set :sidekiq_default_hooks, -> { true }
4
-
5
- set :sidekiq_pid, -> { File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') }
6
- set :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
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 }
13
- # Rbenv, Chruby, and RVM integration
14
- set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
15
- set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
16
- set :chruby_map_bins, fetch(:chruby_map_bins).to_a.concat(%w{ sidekiq sidekiqctl })
17
- # Bundler integration
18
- set :bundle_bins, fetch(:bundle_bins).to_a.concat(%w(sidekiq sidekiqctl))
19
- end
20
- end
21
-
22
1
  namespace :deploy do
23
2
  before :starting, :check_sidekiq_hooks do
24
3
  invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
25
4
  end
26
- after :publishing, :restart_sidekiq do
27
- invoke 'sidekiq:restart' if fetch(:sidekiq_default_hooks)
28
- end
29
5
  end
30
6
 
31
7
  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
8
  task :add_default_hooks do
123
- after 'deploy:starting', 'sidekiq:quiet'
9
+ after 'deploy:starting', 'sidekiq:quiet' if Rake::Task.task_defined?('sidekiq:quiet')
124
10
  after 'deploy:updated', 'sidekiq:stop'
125
- after 'deploy:reverted', 'sidekiq:stop'
126
11
  after 'deploy:published', 'sidekiq:start'
127
- end
128
-
129
- desc 'Quiet sidekiq (stop processing new tasks)'
130
- task :quiet do
131
- on roles fetch(:sidekiq_role) do |role|
132
- 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)
136
- quiet_sidekiq(pid_file)
137
- end
138
- end
139
- end
140
- end
141
- end
142
- end
143
-
144
- desc 'Stop sidekiq'
145
- task :stop do
146
- on roles fetch(:sidekiq_role) do |role|
147
- switch_user(role) do
148
- if test("[ -d #{release_path} ]")
149
- for_each_process(true) do |pid_file, idx|
150
- if pid_process_exists?(pid_file)
151
- stop_sidekiq(pid_file)
152
- end
153
- end
154
- end
155
- end
156
- end
157
- end
158
-
159
- desc 'Start sidekiq'
160
- task :start do
161
- on roles fetch(:sidekiq_role) do |role|
162
- switch_user(role) do
163
- for_each_process do |pid_file, idx|
164
- start_sidekiq(pid_file, idx) unless pid_process_exists?(pid_file)
165
- end
166
- end
167
- end
168
- end
169
-
170
- desc 'Restart sidekiq'
171
- task :restart do
172
- invoke! 'sidekiq:stop'
173
- invoke 'sidekiq:start'
174
- end
175
-
176
- desc 'Rolling-restart sidekiq'
177
- task :rolling_restart do
178
- on roles fetch(:sidekiq_role) do |role|
179
- switch_user(role) do
180
- for_each_process(true) do |pid_file, idx|
181
- if pid_process_exists?(pid_file)
182
- stop_sidekiq(pid_file)
183
- end
184
- start_sidekiq(pid_file, idx)
185
- end
186
- end
187
- end
188
- end
189
-
190
- # Delete any pid file not in use
191
- task :cleanup do
192
- on roles fetch(:sidekiq_role) do |role|
193
- 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)
197
- end
198
- end
199
- end
200
- end
201
- end
202
-
203
- # TODO : Don't start if all processes are off, raise warning.
204
- desc 'Respawn missing sidekiq processes'
205
- task :respawn do
206
- invoke 'sidekiq:cleanup'
207
- on roles fetch(:sidekiq_role) do |role|
208
- switch_user(role) do
209
- for_each_process do |pid_file, idx|
210
- unless pid_file_exists?(pid_file)
211
- start_sidekiq(pid_file, idx)
212
- end
213
- end
214
- end
215
- end
216
- end
217
-
218
- def switch_user(role, &block)
219
- su_user = sidekiq_user(role)
220
- if su_user == role.user
221
- block.call
222
- else
223
- as su_user do
224
- block.call
225
- end
226
- end
227
- end
228
-
229
- def sidekiq_user(role)
230
- properties = role.properties
231
- properties.fetch(:sidekiq_user) || # local property for sidekiq only
232
- fetch(:sidekiq_user) ||
233
- properties.fetch(:run_as) || # global property across multiple capistrano gems
234
- role.user
235
- 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)
12
+ after 'deploy:failed', 'sidekiq:restart'
261
13
  end
262
14
  end