capistrano-sidekiq 0.1.3 → 0.2.5

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
  SHA1:
3
- metadata.gz: 78bd4deb68cc4de92a788222a9f5944a2c9ee1ca
4
- data.tar.gz: eaa42d248f4f7c78e251b47e1d197b2ea1ad725f
3
+ metadata.gz: 61231f557213995443b79c4d06ceaa5de8238bd6
4
+ data.tar.gz: 489cf3778f8e5f682a45a88537411d23da415604
5
5
  SHA512:
6
- metadata.gz: bfccd93b847b249ee2148378c5c2c43ed19bafd010a7d270c8493e23b96399f634fe545c4751e516451d6394e51b49e21b1b3ee80a824af6748f7c143f89828c
7
- data.tar.gz: a0473b5e050dbf37940ba96fa516e0f8e4107699342b02eaa0ad3f3af679b6bc3cf2dc3506c75234248980c40b8fe442f45b3838aeb713b267a179f355eed11d
6
+ metadata.gz: ebbf4e4d9511849571ffc5539c7c412791dbf3bda5c66ff703a624a58ab83310e336f7c4b26e27bb96c1091eceaad8b4ec84bfdf3878c6b00e44848e5277adf2
7
+ data.tar.gz: a02c3e44e841c492a1da7ecd7adefc5b8b18b68d2d851dfd8ddab46d6d404a1aaa9fc0f9ce5a53433b31feedd5ae3315cea2adcf31c3b8513a20ab5b13eea271
data/README.md CHANGED
@@ -22,7 +22,7 @@ And then execute:
22
22
  # Capfile
23
23
 
24
24
  require 'capistrano/sidekiq'
25
- require 'capistrano/sidekiq/monit #to require monit tasks (V0.2.0+)
25
+ require 'capistrano/sidekiq/monit' #to require monit tasks # Only for capistrano3
26
26
  ```
27
27
 
28
28
 
@@ -42,7 +42,12 @@ Configurable options, shown here with defaults:
42
42
  :sidekiq_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" # Only for capistrano2.5
43
43
  :sidekiqctl_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" # Only for capistrano2.5
44
44
  ```
45
+ ## Changelog
46
+ - 0.2.0: Added sidekiq:rolling_restart - @jlecour
45
47
 
48
+ ## Contributors
49
+
50
+ - [Jérémy Lecour] (https://github.com/jlecour)
46
51
 
47
52
  ## Contributing
48
53
 
@@ -0,0 +1,2 @@
1
+ #load monit tasks
2
+ load File.expand_path('../../tasks/monit.cap', __FILE__)
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Sidekiq
3
- VERSION = '0.1.3'
3
+ VERSION = '0.2.5'
4
4
  end
5
5
  end
@@ -3,13 +3,13 @@ Capistrano::Configuration.instance.load do
3
3
  _cset(:sidekiq_default_hooks) { true }
4
4
 
5
5
  _cset(:sidekiq_pid) { File.join(shared_path, 'pids', 'sidekiq.pid') }
6
- _cset(:sidekiq_env) { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
6
+ _cset(:sidekiq_env) { fetch(:rack_env, fetch(:rails_env, 'production')) }
7
7
  _cset(:sidekiq_log) { File.join(shared_path, 'log', 'sidekiq.log') }
8
8
 
9
9
  _cset(:sidekiq_options) { nil }
10
10
 
11
- _cset(:sidekiq_cmd) { "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" }
12
- _cset(:sidekiqctl_cmd) { "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" }
11
+ _cset(:sidekiq_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec sidekiq" }
12
+ _cset(:sidekiqctl_cmd) { "#{fetch(:bundle_cmd, 'bundle')} exec sidekiqctl" }
13
13
 
14
14
  _cset(:sidekiq_timeout) { 10 }
15
15
  _cset(:sidekiq_role) { :app }
@@ -34,38 +34,58 @@ Capistrano::Configuration.instance.load do
34
34
  end
35
35
  end
36
36
 
37
+ def quiet_process(pid_file, idx)
38
+ run "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"
39
+ end
40
+
41
+ def stop_process(pid_file, idx)
42
+ run "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"
43
+ end
44
+
45
+ def start_process(pid_file, idx)
46
+ args = []
47
+ args.push "--index #{idx}"
48
+ args.push "--pidfile #{pid_file}"
49
+ args.push "--environment #{fetch(:sidekiq_env)}"
50
+ args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
51
+ args.push fetch(:sidekiq_options)
52
+
53
+ if defined?(JRUBY_VERSION)
54
+ args.push '>/dev/null 2>&1 &'
55
+ logger.info 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
56
+ else
57
+ args.push '--daemon'
58
+ end
59
+
60
+ run "cd #{current_path} ; #{fetch(:sidekiq_cmd)} #{args.compact.join(' ')} ", :pty => false
61
+ end
62
+
37
63
  desc 'Quiet sidekiq (stop accepting new work)'
38
64
  task :quiet, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
39
65
  for_each_process do |pid_file, idx|
40
- run "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"
66
+ quiet_process(pid_file, idx)
41
67
  end
42
68
  end
43
69
 
44
70
  desc 'Stop sidekiq'
45
71
  task :stop, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
46
72
  for_each_process do |pid_file, idx|
47
- run "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"
73
+ stop_process(pid_file, idx)
48
74
  end
49
75
  end
50
76
 
51
77
  desc 'Start sidekiq'
52
78
  task :start, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
53
79
  for_each_process do |pid_file, idx|
54
- args = []
55
- args.push "--index #{idx}"
56
- args.push "--pidfile #{pid_file}"
57
- args.push "--environment #{fetch(:sidekiq_env)}"
58
- args.push "--logfile #{fetch(:sidekiq_log)}" if fetch(:sidekiq_log)
59
- args.push fetch(:sidekiq_options)
60
-
61
- if defined?(JRUBY_VERSION)
62
- args.push ">/dev/null 2>&1 &"
63
- logger.info 'Since JRuby doesn\'t support Process.daemon, Sidekiq will not be running as a daemon.'
64
- else
65
- args.push "--daemon"
66
- end
80
+ start_process(pid_file, idx)
81
+ end
82
+ end
67
83
 
68
- run "cd #{current_path} ; #{fetch(:sidekiq_cmd)} #{args.compact.join(' ')} ", :pty => false
84
+ desc 'Rolling-restart sidekiq'
85
+ task :rolling_restart, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
86
+ for_each_process do |pid_file, idx|
87
+ stop_process(pid_file, idx)
88
+ start_process(pid_file, idx)
69
89
  end
70
90
  end
71
91
 
@@ -0,0 +1,60 @@
1
+ namespace :load do
2
+ task :defaults do
3
+ set :sidekiq_monit_conf_dir, -> { '/etc/monit/conf.d' }
4
+ set :monit_bin, -> { '/usr/bin/monit' }
5
+ end
6
+ end
7
+
8
+
9
+ namespace :sidekiq do
10
+ namespace :monit do
11
+ desc 'Config Sidekiq monit-service'
12
+ task :config do
13
+ on roles(fetch(:sidekiq_role)) do |role|
14
+ @role = role
15
+ template_sidekiq 'sidekiq_monit.conf', "#{fetch(:tmp_dir)}/monit.conf", @role
16
+ sudo "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{sidekiq_service_name}.conf"
17
+ end
18
+ end
19
+
20
+ desc 'Monitor Sidekiq monit-service'
21
+ task :monitor do
22
+ on roles(fetch(:sidekiq_role)) do
23
+ sudo "#{fetch(:monit_bin)} monitor #{sidekiq_service_name(index)}"
24
+ end
25
+ end
26
+
27
+ desc 'Unmonitor Sidekiq monit-service'
28
+ task :unmonitor do
29
+ on roles(fetch(:sidekiq_role)) do
30
+ sudo "#{fetch(:monit_bin)} unmonitor #{sidekiq_service_name(index)}"
31
+ end
32
+ end
33
+
34
+ desc 'Disable Sidekiq monit-service'
35
+ task :start do
36
+ on roles(fetch(:sidekiq_role)) do
37
+ sudo "#{fetch(:monit_bin)} start #{sidekiq_service_name(index)}"
38
+ end
39
+ end
40
+
41
+ desc 'Disable Sidekiq monit-service'
42
+ task :stop do
43
+ on roles(fetch(:sidekiq_role)) do
44
+ sudo "#{fetch(:monit_bin)} stop #{sidekiq_service_name(index)}"
45
+ end
46
+ end
47
+
48
+ desc 'Disable Sidekiq monit-service'
49
+ task :restart do
50
+ on roles(fetch(:sidekiq_role)) do
51
+ sudo "#{fetch(:monit_bin)} restart #{sidekiq_service_name(index)}"
52
+ end
53
+ end
54
+
55
+ def sidekiq_service_name(index=nil)
56
+ fetch(:sidekiq_service_name, "sidekiq_#{fetch(:application)}") + index.to_s
57
+ end
58
+
59
+ end
60
+ end
@@ -26,7 +26,9 @@ namespace :sidekiq do
26
26
  pids = processes_pids
27
27
  pids.reverse! if reverse
28
28
  pids.each_with_index do |pid_file, idx|
29
- yield(pid_file, idx)
29
+ within current_path do
30
+ yield(pid_file, idx)
31
+ end
30
32
  end
31
33
  end
32
34
 
@@ -41,8 +43,20 @@ namespace :sidekiq do
41
43
  pids
42
44
  end
43
45
 
46
+ def pid_process_exists?(pid_file)
47
+ pid_file_exists?(pid_file) and test("kill -0 $( cat #{pid_file} )")
48
+ end
49
+
50
+ def pid_file_exists?(pid_file)
51
+ test("[ -f #{pid_file} ]")
52
+ end
53
+
44
54
  def stop_sidekiq(pid_file)
45
- execute :bundle, :exec, :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
55
+ if fetch(:stop_sidekiq_in_background, fetch(:sidekiq_run_in_background))
56
+ background :bundle, :exec, :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
57
+ else
58
+ execute :bundle, :exec, :sidekiqctl, 'stop', "#{pid_file}", fetch(:sidekiq_timeout)
59
+ end
46
60
  end
47
61
 
48
62
  def quit_sidekiq(pid_file)
@@ -71,7 +85,11 @@ namespace :sidekiq do
71
85
  args.push "--daemon"
72
86
  end
73
87
 
74
- execute :bundle, :exec, :sidekiq, args.compact.join(' ')
88
+ if fetch(:start_sidekiq_in_background, fetch(:sidekiq_run_in_background))
89
+ background :bundle, :exec, :sidekiq, args.compact.join(' ')
90
+ else
91
+ execute :bundle, :exec, :sidekiq, args.compact.join(' ')
92
+ end
75
93
  end
76
94
 
77
95
  task :add_default_hooks do
@@ -84,9 +102,9 @@ namespace :sidekiq do
84
102
  desc 'Quiet sidekiq (stop processing new tasks)'
85
103
  task :quiet do
86
104
  on roles fetch(:sidekiq_role) do
87
- for_each_process(true) do |pid_file, idx|
88
- if test("[ -f #{pid_file} ]") and test("kill -0 $( cat #{pid_file} )")
89
- within current_path do
105
+ if test("[ -d #{current_path} ]") #fixes #11
106
+ for_each_process(true) do |pid_file, idx|
107
+ if pid_process_exists?(pid_file)
90
108
  quit_sidekiq(pid_file)
91
109
  end
92
110
  end
@@ -98,10 +116,8 @@ namespace :sidekiq do
98
116
  task :stop do
99
117
  on roles fetch(:sidekiq_role) do
100
118
  for_each_process(true) do |pid_file, idx|
101
- if test("[ -f #{pid_file} ]") and test("kill -0 $( cat #{pid_file} )")
102
- within current_path do
103
- stop_sidekiq(pid_file)
104
- end
119
+ if pid_process_exists?(pid_file)
120
+ stop_sidekiq(pid_file)
105
121
  end
106
122
  end
107
123
  end
@@ -110,10 +126,8 @@ namespace :sidekiq do
110
126
  desc 'Start sidekiq'
111
127
  task :start do
112
128
  on roles fetch(:sidekiq_role) do
113
- within current_path do
114
- for_each_process do |pid_file, idx|
115
- start_sidekiq(pid_file)
116
- end
129
+ for_each_process do |pid_file, idx|
130
+ start_sidekiq(pid_file, idx)
117
131
  end
118
132
  end
119
133
  end
@@ -124,12 +138,24 @@ namespace :sidekiq do
124
138
  invoke 'sidekiq:start'
125
139
  end
126
140
 
141
+ desc 'Rolling-restart sidekiq'
142
+ task :rolling_restart do
143
+ on roles fetch(:sidekiq_role) do
144
+ for_each_process(true) do |pid_file, idx|
145
+ if pid_process_exists?(pid_file)
146
+ stop_sidekiq(pid_file)
147
+ end
148
+ start_sidekiq(pid_file, idx)
149
+ end
150
+ end
151
+ end
152
+
127
153
  #delete any pid file not in use
128
154
  task :cleanup do
129
155
  on roles fetch(:sidekiq_role) do
130
156
  for_each_process do |pid_file, idx|
131
- if test("[ -f #{pid_file} ]")
132
- execute "rm #{pid_file}" unless test("kill -0 $( cat #{pid_file} )")
157
+ if pid_file_exists?(pid_file)
158
+ execute "rm #{pid_file}" unless pid_process_exists?(pid_file)
133
159
  end
134
160
  end
135
161
  end
@@ -140,14 +166,32 @@ namespace :sidekiq do
140
166
  task :respawn do
141
167
  invoke 'sidekiq:cleanup'
142
168
  on roles fetch(:sidekiq_role) do
143
- within current_path do
144
- for_each_process do |pid_file, idx|
145
- unless test("[ -f #{pid_file} ]")
146
- start_sidekiq(pid_file, idx)
147
- end
169
+ for_each_process do |pid_file, idx|
170
+ unless pid_file_exists?(pid_file)
171
+ start_sidekiq(pid_file, idx)
148
172
  end
149
173
  end
150
174
  end
151
175
  end
152
176
 
177
+
178
+ def template_sidekiq(from, to, role)
179
+ [
180
+ File.join('lib','capistrano','templates',"#{from}-#{role.hostname}-#{fetch(:stage)}.rb"),
181
+ File.join('lib','capistrano','templates',"#{from}-#{role.hostname}.rb"),
182
+ File.join('lib','capistrano','templates',"#{from}-#{fetch(:stage)}.rb"),
183
+ File.join('lib','capistrano','templates',"#{from}.rb.erb"),
184
+ File.join('lib','capistrano','templates',"#{from}.rb"),
185
+ File.join('lib','capistrano','templates',"#{from}.erb"),
186
+ File.expand_path("../../templates/#{from}.rb.erb", __FILE__),
187
+ File.expand_path("../../templates/#{from}.erb", __FILE__)
188
+ ].each do |path|
189
+ if File.file?(path)
190
+ erb = File.read(path)
191
+ upload! StringIO.new(ERB.new(erb).result(binding)), to
192
+ break
193
+ end
194
+ end
195
+ end
196
+
153
197
  end
@@ -0,0 +1,9 @@
1
+ # Monit configuration for Sidekiq : <%= fetch(:application) %>
2
+ <% processes_pids.each_with_index do |pid_file, idx| %>
3
+ check process <%= sidekiq_service_name(idx) %>
4
+ with pidfile "<%= pid_file %>"
5
+ start program = "/usr/bin/sudo -u <%= @role.user %> /bin/bash -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:bundle] %> exec sidekiq -P <%= pid_file %>'" with timeout 30 seconds
6
+ stop program = "/usr/bin/sudo -u <%= @role.user %> /bin/bash -c 'cd <%= current_path %> && <%= SSHKit.config.command_map[:bundle] %> exec sidekiqctl stop <%= pid_file %>'" with timeout <%= fetch(:sidekiq_timeout).to_i + 10 %> seconds
7
+ group <%= fetch(:sidekiq_monit_group, fetch(:application)) %>-sidekiq
8
+
9
+ <% end %>
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.1.3
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-25 00:00:00.000000000 Z
11
+ date: 2014-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -53,9 +53,12 @@ files:
53
53
  - capistrano-sidekiq.gemspec
54
54
  - lib/capistrano-sidekiq.rb
55
55
  - lib/capistrano/sidekiq.rb
56
+ - lib/capistrano/sidekiq/monit.rb
56
57
  - lib/capistrano/sidekiq/version.rb
57
58
  - lib/capistrano/tasks/capistrano2.rb
59
+ - lib/capistrano/tasks/monit.cap
58
60
  - lib/capistrano/tasks/sidekiq.cap
61
+ - lib/capistrano/templates/sidekiq_monit.conf.erb
59
62
  homepage: https://github.com/seuros/capistrano-sidekiq
60
63
  licenses:
61
64
  - LGPL-3.0