capistrano-runit-resque 0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 910c0b0ff2895723c1f8d69eaca76f37ddb2bdab
4
+ data.tar.gz: 66c43f285ae599b3779fcdc5b19192d19f0d4252
5
+ SHA512:
6
+ metadata.gz: b12ff4bc2593fa4896ce6ffc9ab6bbd5d355e5fd025051e473b60eaeb1bd2dc6f361e3b47e858d146df4e44de7b1e8b78f4d81274792c60f3637569b3eac7104
7
+ data.tar.gz: 79aeff58c71440924712fc0719e263ad3c662428153279a5dbe665392fd2c01be2f4a468bd5b87ba8550c456fe96bac598a748609d5fb04d118905557dbb1407
@@ -0,0 +1,15 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in capistrano-runit-resque.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Alexander Simonov
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,64 @@
1
+ # capistrano-runit-resque
2
+
3
+ Capistrano3 tasks for manage resque and resque-scheduler via runit supervisor.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'capistrano-runit-resque'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install capistrano-runit-resque
20
+
21
+ Add this line in `Capfile`:
22
+ ```ruby
23
+ require 'capistrano/runit/resque' # Resque support
24
+ require 'capistrano/runit/resque_scheduler' # Resque Scheduler support
25
+ ```
26
+
27
+ ## Variables
28
+
29
+ ### General
30
+
31
+ * `runit_resque_log_file` -- Path to log file. Default value: `shared/log/resque.production.log`
32
+ * `runit_resque_interval` -- Interval in seconds for checking new jobs/scheduled jobs. Default value: `5`
33
+ * `runit_resque_environment_task` -- Load Rails environment task or not. Default value: `true`
34
+ * `runit_resque_verbose` -- Verbose logging into log file. Default value: `true`
35
+
36
+ ### Resque
37
+
38
+ * `runit_resque_default_hooks` -- run default hooks for runit resque or not. Default value: `true`.
39
+ * `runit_resque_role` -- Role on where resque will be running. Default value: `:app`
40
+
41
+ ### Resque scheduler
42
+
43
+ * `runit_resque_scheduler_default_hooks` -- run default hooks for runit resque or not. Default value: `true`.
44
+ * `runit_resque_scheduler_role` -- Role on where resque-scheduler will be running. Default value: `:app`
45
+ * `runit_resque_scheduler_dynamic` -- Enables dynamic scheduling if non-empty. Default value: `false`
46
+
47
+ ## Tasks
48
+
49
+ * `runit:resque:setup` -- setup resque runit service.
50
+ * `runit:resque:general:enable` -- enable and autostart service for all jobs.
51
+ * `runit:resque:general:disable` -- stop and disable service for all jobs.
52
+ * `runit:resque:general:start` -- start service for all jobs.
53
+ * `runit:resque:general:stop` -- stop service for all jobs.
54
+ * `runit:resque:general:restart` -- restart service for all jobs.
55
+
56
+ And there is a list of tasks what is depend on your workers.
57
+
58
+ ## Contributing
59
+
60
+ 1. Fork it ( https://github.com/capistrano-runit/resque/fork )
61
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
62
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
63
+ 4. Push to the branch (`git push origin my-new-feature`)
64
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "capistrano-runit-resque"
7
+ spec.version = '0.2.0'
8
+ spec.authors = ["Alexander Simonov"]
9
+ spec.email = ["alex@simonov.me"]
10
+ spec.summary = %q{Capistrano3 tasks for manage resque via runit supervisor.}
11
+ spec.description = %q{Capistrano3 tasks for manage resque via runit supervisor.}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.7"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_runtime_dependency 'capistrano-runit-core', '~> 0.2.0'
23
+ end
File without changes
@@ -0,0 +1,4 @@
1
+ require 'capistrano/runit'
2
+ require 'erb'
3
+ require 'capistrano/runit/resque_helper'
4
+ load File.expand_path('../../tasks/resque.rake', __FILE__)
@@ -0,0 +1,13 @@
1
+ module Capistrano
2
+ module Runit
3
+ module ResqueHelper
4
+ def resque_environment
5
+ @resque_environment ||= fetch(:rack_env, fetch(:rails_env, 'production'))
6
+ end
7
+
8
+ def output_redirection
9
+ ">> #{fetch(:runit_resque_log_file)} 2>> #{fetch(:runit_resque_log_file)}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ require 'capistrano/runit'
2
+ require 'erb'
3
+ require 'capistrano/runit/resque_helper'
4
+ load File.expand_path('../../tasks/resque_scheduler.rake', __FILE__)
@@ -0,0 +1,163 @@
1
+ include ::Capistrano::Runit
2
+ include ::Capistrano::Runit::ResqueHelper
3
+
4
+ namespace :load do
5
+ task :defaults do
6
+ set :runit_resque_run_template, nil
7
+ set :runit_resque_default_hooks, -> { true }
8
+ set :runit_resque_role, -> { :app }
9
+ set :runit_resque_workers, -> { {'*' => 1} }
10
+ set :runit_resque_interval, "5"
11
+ set :runit_resque_environment_task, true
12
+ set :runit_resque_kill_signal, -> { 'QUIT' }
13
+ set :runit_resque_verbose, -> { true }
14
+ set :runit_resque_log_file, -> { ::File.join(shared_path, 'log', "resque.#{resque_environment}.log") }
15
+ end
16
+ end
17
+
18
+ namespace :deploy do
19
+ before :starting, :runit_check_resque_hooks do
20
+ invoke 'runit:resque:add_default_hooks' if fetch(:runit_resque_default_hooks)
21
+ end
22
+ end
23
+
24
+ namespace :runit do
25
+ namespace :resque do
26
+ # Helpers
27
+ def collect_resque_run_command(queue)
28
+ array = []
29
+ array << env_variables
30
+ array << "RAILS_ENV=#{resque_environment}"
31
+ array << "INTERVAL=#{fetch(:runit_resque_interval)}"
32
+ array << "QUEUE=#{queue}"
33
+ array << "VERBOSE=1" if fetch(:runit_resque_verbose)
34
+ array << "exec #{SSHKit.config.command_map[:rake]} #{"environment" if fetch(:runit_resque_environment_task)} resque:work"
35
+ array << output_redirection
36
+ array.compact.join(' ')
37
+ end
38
+
39
+ def resque_runit_stop_commamd
40
+ @resque_runit_stop_command ||= case fetch(:runit_resque_kill_signal)
41
+ when 'QUIT', 'TERM', 'KILL', 'CONT'
42
+ fetch(:runit_resque_kill_signal).downcase
43
+ when 'USR1'
44
+ '1'
45
+ when 'USR2'
46
+ '2'
47
+ when 'INT'
48
+ 'interrupt'
49
+ end
50
+ end
51
+
52
+ def generate_namespace_for_resque_task(name, queue, count, parent_task)
53
+ my_namespace = "runit:resque:#{name}"
54
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:setup" do
55
+ count.times.each do |i|
56
+ setup_service("resque_#{name}_#{i}", collect_resque_run_command(queue))
57
+ end
58
+ end
59
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:enable" do
60
+ count.times.each do |i|
61
+ enable_service("resque_#{name}_#{i}")
62
+ end
63
+ end
64
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:disable" do
65
+ count.times.each do |i|
66
+ disable_service("resque_#{name}_#{i}")
67
+ end
68
+ end
69
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:start" do
70
+ count.times.each do |i|
71
+ start_service("resque_#{name}_#{i}")
72
+ end
73
+ end
74
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:stop" do
75
+ on roles fetch("runit_resque_#{name}_role".to_sym) do
76
+ count.times.each do |i|
77
+ stop_service("resque_#{name}_#{i}", false)
78
+ end
79
+ end
80
+ end
81
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:quiet" do
82
+ on roles fetch("runit_resque_#{name}_role".to_sym) do
83
+ count.times.each do |i|
84
+ runit_execute_command("resque_#{name}_#{i}", '2')
85
+ end
86
+ end
87
+ end
88
+ parent_task.application.define_task Rake::Task, "#{my_namespace}:restart" do
89
+ count.times.each do |i|
90
+ restart_service("resque_#{name}_#{i}")
91
+ end
92
+ end
93
+ end
94
+
95
+ task :add_default_hooks do
96
+ after 'deploy:check', 'runit:resque:check'
97
+ after 'deploy:starting', 'runit:resque:quiet'
98
+ after 'deploy:updated', 'runit:resque:stop'
99
+ after 'deploy:reverted', 'runit:resque:stop'
100
+ after 'deploy:published', 'runit:resque:start'
101
+ end
102
+
103
+ task :hook do |task|
104
+ fetch(:runit_resque_workers).each do |key, count|
105
+ name = if key == '*'
106
+ 'general'
107
+ else
108
+ key.gsub(/\s*[^A-Za-z0-9\.\-]\s*/, '_')
109
+ end
110
+ set "runit_resque_#{name}_role".to_sym, -> { fetch(:runit_resque_role) }
111
+ count.times do |i|
112
+ set "runit_resque_#{name}_#{i}_role".to_sym, -> { fetch(:runit_resque_role) }
113
+ end
114
+ generate_namespace_for_resque_task(name, key, count, task)
115
+ end
116
+ end
117
+
118
+ task :check do
119
+ fetch(:runit_resque_workers).each do |key, value|
120
+ key = 'general' if key == '*'
121
+ name = key.gsub(/\s*[^A-Za-z0-9\.\-]\s*/, '_')
122
+ check_service('resque', name)
123
+ end
124
+ end
125
+
126
+ task :stop do
127
+ fetch(:runit_resque_workers).each do |key, value|
128
+ key = 'general' if key == '*'
129
+ name = key.gsub(/\s*[^A-Za-z0-9\.\-]\s*/, '_')
130
+ ::Rake::Task["runit:resque:#{name}:stop"].invoke
131
+ end
132
+ end
133
+
134
+ task :quiet do
135
+ fetch(:runit_resque_workers).each do |key, value|
136
+ key = 'general' if key == '*'
137
+ name = key.gsub(/\s*[^A-Za-z0-9\.\-]\s*/, '_')
138
+ ::Rake::Task["runit:resque:#{name}:quiet"].invoke
139
+ end
140
+ end
141
+
142
+ task :start do
143
+ fetch(:runit_resque_workers).each do |key, value|
144
+ key = 'general' if key == '*'
145
+ name = key.gsub(/\s*[^A-Za-z0-9\.\-]\s*/, '_')
146
+ ::Rake::Task["runit:resque:#{name}:start"].invoke
147
+ end
148
+ end
149
+
150
+ task :restart do
151
+ fetch(:runit_resque_workers).each do |key, value|
152
+ key = 'general' if key == '*'
153
+ name = key.gsub(/\s*[^A-Za-z0-9\.\-]\s*/, '_')
154
+ ::Rake::Task["runit:resque:#{name}:restart"].invoke
155
+ end
156
+ end
157
+
158
+ end
159
+ end
160
+
161
+ Capistrano::DSL.stages.each do |stage|
162
+ after stage, 'runit:resque:hook'
163
+ end
@@ -0,0 +1,90 @@
1
+ include ::Capistrano::Runit
2
+ include ::Capistrano::Runit::ResqueHelper
3
+
4
+ namespace :load do
5
+ task :defaults do
6
+ set :runit_resque_scheduler_default_hooks, -> { true }
7
+ set :runit_resque_scheduler_role, -> { :app }
8
+ set :runit_resque_scheduler_dynamic, -> { false }
9
+ end
10
+ end
11
+
12
+ namespace :deploy do
13
+ before :starting, :runit_check_resque_schduler_hooks do
14
+ invoke 'runit:resque_scheduler:add_default_hooks' if fetch(:runit_resque_scheduler_default_hooks)
15
+ end
16
+ end
17
+
18
+ namespace :deploy do
19
+ before :starting, :runit_check_resque_scheduler_hooks do
20
+ invoke 'runit:resque_scheduler:add_default_hooks' if fetch(:runit_resque_scheduler_default_hooks)
21
+ end
22
+ end
23
+
24
+ namespace :runit do
25
+ namespace :resque_scheduler do
26
+ # Helpers
27
+
28
+ def resque_scheduler_enabled_service_dir
29
+ enabled_service_dir_for('resque_scheduler')
30
+ end
31
+
32
+ def resque_scheduler_service_dir
33
+ service_dir_for('resque_scheduler')
34
+ end
35
+
36
+ def collect_resque_scheduler_run_command
37
+ array = []
38
+ array << env_variables
39
+ array << "RAILS_ENV=#{resque_environment}"
40
+ array << "INTERVAL=#{fetch(:runit_resque_interval)}"
41
+ array << 'VERBOSE=1' if fetch(:runit_resque_verbose)
42
+ array << 'DYNAMIC_SCHEDULE=yes' if fetch(:runit_resque_scheduler_dynamic)
43
+ array << "exec #{SSHKit.config.command_map[:rake]} #{"environment" if fetch(:runit_resque_environment_task)} resque:scheduler"
44
+ array << output_redirection
45
+ array.compact.join(' ')
46
+ end
47
+
48
+ task :add_default_hooks do
49
+ after 'deploy:check', 'runit:resque_scheduler:check'
50
+ after 'deploy:updated', 'runit:resque_scheduler:stop'
51
+ after 'deploy:reverted', 'runit:resque_scheduler:stop'
52
+ after 'deploy:published', 'runit:resque_scheduler:start'
53
+ end
54
+
55
+ task :check do
56
+ check_service('resque_scheduler')
57
+ end
58
+
59
+ desc 'Setup resque_scheduler runit service'
60
+ task :setup do
61
+ setup_service('resque_scheduler', collect_resque_scheduler_run_command)
62
+ end
63
+
64
+ desc 'Enable resque_scheduler runit service'
65
+ task :enable do
66
+ enable_service('resque_scheduler')
67
+ end
68
+
69
+ desc 'Disable resque_scheduler runit service'
70
+ task :disable do
71
+ disable_service('resque_scheduler')
72
+ end
73
+
74
+ desc 'Start resque_scheduler runit service'
75
+ task :start do
76
+ start_service('resque_scheduler')
77
+ end
78
+
79
+ desc 'Stop resque_scheduler runit service'
80
+ task :stop do
81
+ stop_service('resque_scheduler', false)
82
+ end
83
+
84
+ desc 'Restart resque_scheduler runit service'
85
+ task :restart do
86
+ restart_service('resque_scheduler')
87
+ end
88
+
89
+ end
90
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capistrano-runit-resque
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Simonov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: capistrano-runit-core
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.0
55
+ description: Capistrano3 tasks for manage resque via runit supervisor.
56
+ email:
57
+ - alex@simonov.me
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - capistrano-runit-resque.gemspec
68
+ - lib/capistrano-runit-resque.rb
69
+ - lib/capistrano/runit/resque.rb
70
+ - lib/capistrano/runit/resque_helper.rb
71
+ - lib/capistrano/runit/resque_scheduler.rb
72
+ - lib/capistrano/tasks/resque.rake
73
+ - lib/capistrano/tasks/resque_scheduler.rake
74
+ homepage: ''
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.4.6
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: Capistrano3 tasks for manage resque via runit supervisor.
98
+ test_files: []
99
+ has_rdoc: