sidekiq-runner 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sidekiq-runner.rb +12 -24
- data/lib/sidekiq-runner/god_configuration.rb +31 -9
- data/lib/sidekiq-runner/sidekiq.god +76 -0
- data/lib/sidekiq-runner/sidekiq_configuration.rb +47 -55
- data/lib/sidekiq-runner/sidekiq_instance.rb +45 -13
- data/lib/sidekiq-runner/tasks.rb +4 -4
- data/lib/sidekiq-runner/version.rb +1 -1
- metadata +6 -7
- data/lib/sidekiq-runner/common_configuration.rb +0 -46
- data/lib/sidekiq-runner/sidekiq_command_builder.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a964d456a2836681b258bc3cc4052fbc26dce0dd
|
4
|
+
data.tar.gz: e931c16b0328eff55bcd3a09cba5de69e73e6e55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38bbf8146a5b13e4ab5c22891c5ccf49a206e3f148273c8d813ae6e87d3f290096fb2df3c4af9877e7af2e25c7f8e2891bf34e3b077a3aad16b2295858428476
|
7
|
+
data.tar.gz: b58ed792d28ce63e3ece4538a53a832b0cbef7ff9e2cc85c3f41ade78fdf3531df9e63f743e7e52301189f00c6254e9901c0f69141424a5de1c02616a7be53b4
|
data/lib/sidekiq-runner.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
+
require 'sidekiq-runner/sidekiq_instance'
|
1
2
|
require 'sidekiq-runner/sidekiq_configuration'
|
2
3
|
require 'sidekiq-runner/god_configuration'
|
3
|
-
require 'sidekiq-runner/sidekiq_instance'
|
4
4
|
require 'sidekiq-runner/version'
|
5
5
|
|
6
6
|
module SidekiqRunner
|
@@ -13,11 +13,9 @@ module SidekiqRunner
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.start
|
16
|
-
sidekiq_config, god_config =
|
17
|
-
|
18
|
-
fail 'No sidekiq instances defined. There is nothing to run.' if sidekiq_config.empty?
|
16
|
+
sidekiq_config, god_config = SidekiqConfiguration.get, GodConfiguration.get
|
19
17
|
|
20
|
-
abort 'God is
|
18
|
+
abort 'God is already running.' if god_alive?(god_config)
|
21
19
|
|
22
20
|
run(:start, sidekiq_config) do
|
23
21
|
puts 'Starting god.'
|
@@ -26,37 +24,27 @@ module SidekiqRunner
|
|
26
24
|
end
|
27
25
|
|
28
26
|
def self.stop
|
29
|
-
sidekiq_config, god_config =
|
27
|
+
sidekiq_config, god_config = SidekiqConfiguration.get, GodConfiguration.get
|
30
28
|
|
31
29
|
run(:stop, sidekiq_config) do
|
32
30
|
God::EventHandler.load
|
33
31
|
|
34
32
|
if god_alive?(god_config)
|
35
|
-
puts "Stopping process #{god_config.process_name}."
|
36
|
-
|
37
|
-
# Stop all the processes
|
38
33
|
sidekiq_config.each_key do |name|
|
34
|
+
puts "Stopping Sidekiq instance #{name}..."
|
39
35
|
God::CLI::Command.new('stop', god_config.options, ['', name])
|
40
36
|
end
|
41
37
|
|
42
|
-
puts
|
38
|
+
puts "Terminating god process #{god_config.process_name}..."
|
43
39
|
God::CLI::Command.new('terminate', god_config.options, [])
|
44
40
|
else
|
45
|
-
|
41
|
+
abort 'God is not running, so no need to stop it.'
|
46
42
|
end
|
47
43
|
end
|
48
44
|
end
|
49
45
|
|
50
|
-
def self.settings
|
51
|
-
SidekiqConfiguration.get.to_hash
|
52
|
-
end
|
53
|
-
|
54
46
|
private
|
55
47
|
|
56
|
-
def self.get_all_settings
|
57
|
-
[SidekiqConfiguration.get, GodConfiguration.get]
|
58
|
-
end
|
59
|
-
|
60
48
|
def self.god_alive?(god_config)
|
61
49
|
puts 'Checking whether god is alive...'
|
62
50
|
|
@@ -65,7 +53,7 @@ module SidekiqRunner
|
|
65
53
|
DRb.start_service('druby://127.0.0.1:0')
|
66
54
|
server = DRbObject.new(nil, God::Socket.socket(god_config.port))
|
67
55
|
|
68
|
-
#
|
56
|
+
# Ping server to ensure that it is responsive.
|
69
57
|
begin
|
70
58
|
server.ping
|
71
59
|
rescue DRb::DRbConnError
|
@@ -76,14 +64,15 @@ module SidekiqRunner
|
|
76
64
|
|
77
65
|
def self.run(action, sidekiq_config)
|
78
66
|
begin
|
79
|
-
|
67
|
+
|
68
|
+
# Use this flag to actually load all of the god infrastructure.
|
80
69
|
$load_god = true
|
81
70
|
require 'god'
|
82
71
|
require 'god/cli/run'
|
83
72
|
|
84
|
-
# Peform the action
|
73
|
+
# Peform the action.
|
85
74
|
yield if block_given?
|
86
|
-
|
75
|
+
|
87
76
|
rescue SystemExit => e
|
88
77
|
cb = e.success? ? "#{action}_success_cb" : "#{action}_error_cb"
|
89
78
|
ensure
|
@@ -94,5 +83,4 @@ module SidekiqRunner
|
|
94
83
|
end
|
95
84
|
end
|
96
85
|
end
|
97
|
-
|
98
86
|
end
|
@@ -1,12 +1,18 @@
|
|
1
|
-
require '
|
1
|
+
require 'yaml'
|
2
2
|
|
3
3
|
module SidekiqRunner
|
4
|
-
class GodConfiguration
|
4
|
+
class GodConfiguration
|
5
5
|
def self.default
|
6
6
|
@default ||= GodConfiguration.new
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
def self.get
|
10
|
+
config = default.dup
|
11
|
+
config.send :merge_config_file!
|
12
|
+
config
|
13
|
+
end
|
14
|
+
|
15
|
+
RUNNER_ATTRIBUTES = [:config_file, :daemonize, :port, :syslog, :events]
|
10
16
|
RUNNER_ATTRIBUTES.each { |att| attr_accessor att }
|
11
17
|
|
12
18
|
CONFIG_FILE_ATTRIBUTES = [:process_name, :interval, :stop_timeout, :log_file]
|
@@ -16,24 +22,40 @@ module SidekiqRunner
|
|
16
22
|
@process_name = 'sidekiq'
|
17
23
|
@interval = 30
|
18
24
|
@stop_timeout = 30
|
19
|
-
@log_file = File.join(Dir.pwd, 'log', 'god.log')
|
20
25
|
|
26
|
+
@log_file = File.join(Dir.pwd, 'log', 'god.log')
|
21
27
|
@config_file = File.join(Dir.pwd, 'config', 'god.yml')
|
28
|
+
|
22
29
|
@daemonize = true
|
23
|
-
# This is going to be a part of the .sock file name e.g. "/tmp/god.17165.sock"
|
24
|
-
# Change this in the configuration file to be able to run multiple instances of god
|
25
|
-
@port = 17165
|
26
30
|
@syslog = true
|
27
31
|
@events = true
|
28
|
-
|
32
|
+
|
33
|
+
# This is going to be a part of the .sock file name e.g. "/tmp/god.17165.sock"
|
34
|
+
# Change this in the configuration file to be able to run multiple instances of god.
|
35
|
+
@port = 17165
|
36
|
+
end
|
37
|
+
|
38
|
+
def options
|
39
|
+
{
|
29
40
|
daemonize: @daemonize,
|
30
41
|
port: @port,
|
31
42
|
syslog: @syslog,
|
32
43
|
events: @events,
|
33
|
-
config: File.expand_path("
|
44
|
+
config: File.expand_path("../sidekiq.god", __FILE__),
|
34
45
|
log: @log_file
|
35
46
|
}
|
36
47
|
end
|
37
48
|
|
49
|
+
private
|
50
|
+
|
51
|
+
def merge_config_file!
|
52
|
+
if File.exist?(config_file)
|
53
|
+
yml = YAML.load_file(config_file)
|
54
|
+
CONFIG_FILE_ATTRIBUTES.each do |k|
|
55
|
+
v = yml[k] || yml[k.to_s]
|
56
|
+
send("#{k}=", v) unless v.nil?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
38
60
|
end
|
39
61
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
$LOAD_PATH.unshift "#{File.expand_path('../..', __FILE__)}"
|
2
|
+
require 'sidekiq-runner'
|
3
|
+
|
4
|
+
sidekiq_config = SidekiqRunner::SidekiqConfiguration.get
|
5
|
+
god_config = SidekiqRunner::GodConfiguration.get
|
6
|
+
|
7
|
+
God.terminate_timeout = god_config.stop_timeout + 10
|
8
|
+
|
9
|
+
sidekiq_config.each do |name, skiq|
|
10
|
+
God.watch do |w|
|
11
|
+
w.name = name
|
12
|
+
|
13
|
+
# Set start command.
|
14
|
+
w.start = skiq.build_start_command
|
15
|
+
|
16
|
+
# Set stop command.
|
17
|
+
w.stop = skiq.build_stop_command(god_config.stop_timeout)
|
18
|
+
w.stop_timeout = god_config.stop_timeout
|
19
|
+
|
20
|
+
# Make sure the pidfile is deleted as sidekiqctl does not delete stale pidfiles.
|
21
|
+
w.pid_file = skiq.pidfile
|
22
|
+
w.behavior(:clean_pid_file)
|
23
|
+
|
24
|
+
# Working directory has to be set properly.
|
25
|
+
# Be aware that by default, God sets the working directory to / (root dir).
|
26
|
+
w.dir = skiq.chdir || Rails.root || Dir.pwd
|
27
|
+
|
28
|
+
# Determine the state on startup.
|
29
|
+
# If process is running move to 'up' state, otherwise move to 'start' state.
|
30
|
+
# States transitions: http://godrb.com/
|
31
|
+
w.transition(:init, { true => :up, false => :start }) do |on|
|
32
|
+
on.condition(:process_running) do |c|
|
33
|
+
c.running = true
|
34
|
+
c.interval = 5
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Determine when process has finished starting.
|
39
|
+
# If process is running move to 'up' state.
|
40
|
+
w.transition([:start, :restart], :up) do |on|
|
41
|
+
on.condition(:process_running) do |c|
|
42
|
+
c.running = true
|
43
|
+
c.interval = 5
|
44
|
+
end
|
45
|
+
|
46
|
+
# If the process went down during state change, try 5 times, on failure move to 'start' state again.
|
47
|
+
on.condition(:tries) do |c|
|
48
|
+
c.times = 3
|
49
|
+
c.interval = 5
|
50
|
+
c.transition = :start
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Start if process is not running.
|
55
|
+
w.transition(:up, :start) do |on|
|
56
|
+
on.condition(:process_running) do |c|
|
57
|
+
c.running = false
|
58
|
+
# Set poll interval in case kqueue/netlink events won't work (you have to
|
59
|
+
# trigger god with root privileges for events to work).
|
60
|
+
c.interval = god_config.interval
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
w.lifecycle do |on|
|
65
|
+
on.condition(:flapping) do |c|
|
66
|
+
c.to_state = [:start, :restart] # If this watch is started or restarted...
|
67
|
+
c.times = 5 # 5 times
|
68
|
+
c.within = 5.minutes # within 5 minutes
|
69
|
+
c.transition = :unmonitored # then unmonitor it.
|
70
|
+
c.retry_in = 10.minutes # Then after 10 minutes monitor it again to see if it was just a temporary problem.
|
71
|
+
c.retry_times = 5 # If the process is seen to be flapping 5 times
|
72
|
+
c.retry_within = 2.hours # within 2 hours, then give up completely.
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -1,18 +1,21 @@
|
|
1
|
-
require '
|
2
|
-
require 'fileutils'
|
1
|
+
require 'yaml'
|
3
2
|
|
4
3
|
module SidekiqRunner
|
5
|
-
class SidekiqConfiguration
|
4
|
+
class SidekiqConfiguration
|
6
5
|
include Enumerable
|
7
6
|
|
8
|
-
RUNNER_ATTRIBUTES = [:config_file
|
7
|
+
RUNNER_ATTRIBUTES = [:config_file]
|
9
8
|
RUNNER_ATTRIBUTES.each { |att| attr_accessor att }
|
10
9
|
|
11
10
|
attr_reader :sidekiqs
|
12
11
|
|
13
12
|
def initialize
|
14
|
-
@config_file =
|
15
|
-
|
13
|
+
@config_file =
|
14
|
+
if defined?(Rails)
|
15
|
+
File.join(Rails.root, 'config', 'sidekiq.yml')
|
16
|
+
else
|
17
|
+
File.join(Dir.pwd, 'config', 'sidekiq.yml')
|
18
|
+
end
|
16
19
|
|
17
20
|
@sidekiqs = {}
|
18
21
|
end
|
@@ -21,6 +24,13 @@ module SidekiqRunner
|
|
21
24
|
@default ||= SidekiqConfiguration.new
|
22
25
|
end
|
23
26
|
|
27
|
+
def self.get
|
28
|
+
config = default.dup
|
29
|
+
config.send :merge_config_file!
|
30
|
+
config.send :sane?
|
31
|
+
config
|
32
|
+
end
|
33
|
+
|
24
34
|
def each(&block)
|
25
35
|
@sidekiqs.each(&block)
|
26
36
|
end
|
@@ -33,33 +43,34 @@ module SidekiqRunner
|
|
33
43
|
@sidekiqs.empty?
|
34
44
|
end
|
35
45
|
|
36
|
-
|
37
|
-
|
38
|
-
def queue(name, weight = 1)
|
39
|
-
# Create a default sidekiq instance when no instances were created
|
40
|
-
fail 'Sidekiq instances hash does not seem to be empty.
|
41
|
-
It means you are using the newer syntax in the initializer to create at least one instance.
|
42
|
-
Therefore you should not be using the old queue() function.' unless @sidekiqs.empty?
|
46
|
+
def add_instance(name)
|
47
|
+
fail "Sidekiq instance with the name '#{name}' already exists! No duplicates please." if @sidekiqs.key?(name)
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
end
|
49
|
+
@sidekiqs[name] = SidekiqInstance.new(name)
|
50
|
+
yield @sidekiqs[name] if block_given?
|
47
51
|
end
|
48
52
|
|
49
|
-
|
50
|
-
skiq = SidekiqInstance.new(name)
|
51
|
-
yield skiq if block_given?
|
52
|
-
|
53
|
-
fail "Sidekick instance with the name of #{name} already exists! No duplicates please." if @sidekiqs.has_key?(name)
|
53
|
+
# Top-level single instance configuration methods, partially for backward compatibility.
|
54
54
|
|
55
|
-
|
56
|
-
|
55
|
+
SidekiqInstance::CONFIG_FILE_ATTRIBUTES.each do |meth|
|
56
|
+
define_method("#{meth}=") do |val|
|
57
|
+
ensure_default_sidekiq!
|
58
|
+
@sidekiqs.each { |_, skiq| skiq.send("#{meth}=", val) }
|
59
|
+
end
|
60
|
+
end
|
57
61
|
|
58
|
-
|
62
|
+
def queue(name, weight = 1)
|
63
|
+
fail 'Multiple Sidekiq instances defined and queue() outside of instance block called.' if @sidekiqs.size > 1
|
59
64
|
|
60
|
-
|
65
|
+
ensure_default_sidekiq!
|
66
|
+
@sidekiqs.values.first.add_queue(name, weight)
|
61
67
|
end
|
62
68
|
|
69
|
+
alias_method :add_queue, :queue
|
70
|
+
alias_method :configfile=, :config_file=
|
71
|
+
|
72
|
+
# Callbacks.
|
73
|
+
|
63
74
|
%w(start stop).each do |action|
|
64
75
|
%w(success error).each do |state|
|
65
76
|
attr_reader "#{action}_#{state}_cb".to_sym
|
@@ -72,44 +83,25 @@ module SidekiqRunner
|
|
72
83
|
|
73
84
|
private
|
74
85
|
|
86
|
+
def ensure_default_sidekiq!
|
87
|
+
add_instance('sidekiq_default') if empty?
|
88
|
+
end
|
89
|
+
|
75
90
|
def merge_config_file!
|
76
91
|
sidekiqs_common_config = {}
|
77
|
-
yml = {}
|
78
|
-
|
79
|
-
if File.exist?(config_file)
|
80
|
-
yml = YAML.load_file(config_file)
|
81
|
-
# Get sidekiq config common for all instances
|
82
|
-
SidekiqInstance::CONFIG_FILE_ATTRIBUTES.each do |k|
|
83
|
-
v = yml[k] || yml[k.to_s]
|
84
|
-
sidekiqs_common_config[k] = v if v
|
85
|
-
end
|
86
|
-
end
|
87
92
|
|
88
|
-
|
89
|
-
|
90
|
-
SidekiqInstance::INDIVIDUAL_FILE_ATTRIBUTES.each do |k|
|
91
|
-
v = yml[k] || yml[k.to_s]
|
92
|
-
sidekiqs_common_config[k] = v if v
|
93
|
-
end
|
93
|
+
yml = File.exist?(config_file) ? YAML.load_file(config_file) : {}
|
94
|
+
yml = Hash[yml.map { |k, v| [k.to_sym, v] }]
|
94
95
|
|
95
|
-
@sidekiqs.
|
96
|
-
# Symbolize keys in yml hash
|
97
|
-
if yml[name] && yml[name].is_a?(Hash)
|
98
|
-
yml_config = Hash[yml[name].map { |k, v| [k.to_sym, v] }]
|
99
|
-
end
|
100
|
-
# Merge common and specific sidekiq instance configs
|
101
|
-
# Sidekiq instances not defined in the initializer but present in yml will be ignored
|
102
|
-
final_skiq_config = yml_config ? sidekiqs_common_config.merge(yml_config) : sidekiqs_common_config
|
103
|
-
skiq.merge_config!(final_skiq_config)
|
104
|
-
skiq.sane?
|
105
|
-
end
|
106
|
-
|
107
|
-
self
|
96
|
+
@sidekiqs.each_value { |skiq| skiq.merge_config_file!(yml) }
|
108
97
|
end
|
109
98
|
|
110
99
|
def sane?
|
111
|
-
fail 'No requirefile given and not in Rails env.' if !defined?(Rails) && !requirefile
|
112
100
|
fail 'No sidekiq instances defined. Nothing to run.' if @sidekiqs.empty?
|
101
|
+
fail 'Sidekiq instances with the same pidfile found.' if @sidekiqs.values.map(&:pidfile).uniq.size < @sidekiqs.size
|
102
|
+
fail 'Sidekiq instances with the same logfile found.' if @sidekiqs.values.map(&:logfile).uniq.size < @sidekiqs.size
|
103
|
+
|
104
|
+
@sidekiqs.each_value { |skiq| skiq.sane? }
|
113
105
|
end
|
114
106
|
end
|
115
107
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
module SidekiqRunner
|
2
2
|
class SidekiqInstance
|
3
3
|
|
4
|
-
CONFIG_FILE_ATTRIBUTES = [:bundle_env, :chdir, :requirefile, :concurrency, :verbose]
|
5
|
-
|
6
|
-
CONFIG_FILE_ATTRIBUTES.concat(INDIVIDUAL_FILE_ATTRIBUTES).each { |att| attr_accessor att }
|
4
|
+
CONFIG_FILE_ATTRIBUTES = [:bundle_env, :chdir, :requirefile, :concurrency, :verbose, :pidfile, :logfile]
|
5
|
+
CONFIG_FILE_ATTRIBUTES.each { |att| attr_accessor att }
|
7
6
|
|
8
7
|
attr_reader :name, :queues
|
9
8
|
|
@@ -14,35 +13,68 @@ module SidekiqRunner
|
|
14
13
|
@queues = []
|
15
14
|
|
16
15
|
@bundle_env = true
|
17
|
-
@daemonize = true
|
18
16
|
@chdir = nil
|
19
17
|
@requirefile = nil
|
20
18
|
@pidfile = File.join(Dir.pwd, 'tmp', 'pids', "#{@name}.pid")
|
21
19
|
@logfile = File.join(Dir.pwd, 'log', "#{@name}.log")
|
22
20
|
@concurrency = 4
|
23
21
|
@verbose = false
|
24
|
-
|
25
22
|
end
|
26
23
|
|
27
24
|
def add_queue(queue_name, weight = 1)
|
28
25
|
fail "Cannot add the queue. The name is empty!" if queue_name.empty?
|
29
26
|
fail "Cannot add the queue. The weight is not an integer!" unless weight.is_a? Integer
|
30
|
-
fail "Cannot add the queue. The queue with \"#{queue_name}\" name already exist" if @queues.any?{|
|
27
|
+
fail "Cannot add the queue. The queue with \"#{queue_name}\" name already exist" if @queues.any? { |q| q.first == queue_name }
|
31
28
|
@queues << [queue_name, weight]
|
32
29
|
end
|
33
30
|
|
31
|
+
def merge_config_file!(yml)
|
32
|
+
# Get global configuration options.
|
33
|
+
SidekiqInstance::CONFIG_FILE_ATTRIBUTES.each do |k|
|
34
|
+
send("#{k}=", yml[k]) unless yml[k].nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
# Override with instance-specific options.
|
38
|
+
if (syml = yml[@name.to_sym]) && (syml.is_a?(Hash))
|
39
|
+
syml = Hash[syml.map { |k, v| [k.to_sym, v] }]
|
40
|
+
|
41
|
+
SidekiqInstance::CONFIG_FILE_ATTRIBUTES.each do |k|
|
42
|
+
send("#{k}=", syml[k]) unless syml[k].nil?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
34
47
|
def sane?
|
35
48
|
fail "No queues given for #{@name}!" if @queues.empty?
|
49
|
+
fail "No requirefile given for #{@name} and not in Rails environment!" if !defined?(Rails) && !requirefile
|
36
50
|
end
|
37
51
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
52
|
+
def build_start_command
|
53
|
+
cmd = []
|
54
|
+
cmd << (bundle_env ? 'bundle exec sidekiq' : 'sidekiq')
|
55
|
+
cmd << '-d'
|
56
|
+
cmd << "-c #{concurrency}"
|
57
|
+
cmd << '-v' if verbose
|
58
|
+
cmd << "-L #{logfile}"
|
59
|
+
cmd << "-P #{pidfile}"
|
60
|
+
cmd << "-e #{Rails.env}" if defined?(Rails)
|
61
|
+
cmd << "-r #{requirefile}" if requirefile
|
62
|
+
|
63
|
+
queues.each do |q, w|
|
64
|
+
cmd << "-q #{q},#{w.to_s}"
|
65
|
+
end
|
43
66
|
|
44
|
-
|
67
|
+
cmd.join(' ')
|
45
68
|
end
|
46
69
|
|
70
|
+
def build_stop_command(timeout)
|
71
|
+
cmd = []
|
72
|
+
cmd << (bundle_env ? 'bundle exec sidekiqctl' : 'sidekiqctl')
|
73
|
+
cmd << 'stop'
|
74
|
+
cmd << pidfile
|
75
|
+
cmd << timeout
|
76
|
+
|
77
|
+
cmd.join(' ')
|
78
|
+
end
|
47
79
|
end
|
48
|
-
end
|
80
|
+
end
|
data/lib/sidekiq-runner/tasks.rb
CHANGED
@@ -3,18 +3,18 @@ require 'sidekiq-runner'
|
|
3
3
|
rails_env = Rake::Task.task_defined?(:environment) ? [:environment] : []
|
4
4
|
|
5
5
|
namespace :sidekiqrunner do
|
6
|
-
desc 'Start
|
6
|
+
desc 'Start Sidekiq instances'
|
7
7
|
task start: rails_env do
|
8
8
|
puts 'Starting sidekiq instances...'
|
9
9
|
SidekiqRunner.start
|
10
10
|
end
|
11
11
|
|
12
|
-
desc 'Stop
|
12
|
+
desc 'Stop Sidekiq instances'
|
13
13
|
task stop: rails_env do
|
14
14
|
puts 'Gracefully shutting down sidekiq instances...'
|
15
15
|
SidekiqRunner.stop
|
16
16
|
end
|
17
17
|
|
18
|
-
desc 'Restart
|
19
|
-
task restart: ['
|
18
|
+
desc 'Restart Sidekiq instances'
|
19
|
+
task restart: ['sidekiqrunner:stop', 'sidekiqrunner:start']
|
20
20
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- FlavourSys Technology GmbH
|
@@ -38,22 +38,21 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.13'
|
41
|
-
description:
|
42
|
-
|
41
|
+
description: Provide an easy way to configure, start, and monitor all your Sidekiq
|
42
|
+
processes
|
43
43
|
email: technology@flavoursys.com
|
44
44
|
executables: []
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- lib/sidekiq-runner.rb
|
49
|
-
- lib/sidekiq-runner/common_configuration.rb
|
50
49
|
- lib/sidekiq-runner/god_configuration.rb
|
51
|
-
- lib/sidekiq-runner/
|
50
|
+
- lib/sidekiq-runner/sidekiq.god
|
52
51
|
- lib/sidekiq-runner/sidekiq_configuration.rb
|
53
52
|
- lib/sidekiq-runner/sidekiq_instance.rb
|
54
53
|
- lib/sidekiq-runner/tasks.rb
|
55
54
|
- lib/sidekiq-runner/version.rb
|
56
|
-
homepage:
|
55
|
+
homepage: https://github.com/FlavourSys/sidekiq-runner
|
57
56
|
licenses:
|
58
57
|
- MIT
|
59
58
|
metadata: {}
|
@@ -76,5 +75,5 @@ rubyforge_project:
|
|
76
75
|
rubygems_version: 2.2.2
|
77
76
|
signing_key:
|
78
77
|
specification_version: 4
|
79
|
-
summary: Sidekiq rake
|
78
|
+
summary: Sidekiq configuration and rake tasks
|
80
79
|
test_files: []
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
module SidekiqRunner
|
4
|
-
|
5
|
-
# common functions for GodConfiguration and Configuration classes
|
6
|
-
class CommonConfiguration
|
7
|
-
# this method MUST be reimplemented
|
8
|
-
def self.default
|
9
|
-
fail(NotImplementedError, "Method \"#{__method__}\" is not implemented in \"#{name}\" class. Please DO implement this method to be able to derive from CommonConfiguration class.")
|
10
|
-
end
|
11
|
-
|
12
|
-
RUNNER_ATTRIBUTES = []
|
13
|
-
CONFIG_FILE_ATTRIBUTES = []
|
14
|
-
|
15
|
-
@config_file = ''
|
16
|
-
|
17
|
-
def to_hash
|
18
|
-
Hash[CONFIG_FILE_ATTRIBUTES.map { |att| [att, send(att)] }]
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.get
|
22
|
-
config = default.dup
|
23
|
-
config.send :merge_config_file!
|
24
|
-
config.send :sane?
|
25
|
-
config
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def merge_config_file!
|
31
|
-
if File.exist?(config_file)
|
32
|
-
yml = YAML.load_file(config_file)
|
33
|
-
CONFIG_FILE_ATTRIBUTES.each do |k|
|
34
|
-
v = yml[k] || yml[k.to_s]
|
35
|
-
send("#{k}=", v) unless v.nil?
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
self
|
40
|
-
end
|
41
|
-
|
42
|
-
def sane?
|
43
|
-
end
|
44
|
-
|
45
|
-
end # class
|
46
|
-
end # module
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module SidekiqCommandBuilder
|
2
|
-
|
3
|
-
def self.build_start_command(sidekiq_config, skiq)
|
4
|
-
cmd = []
|
5
|
-
cmd << (skiq.bundle_env ? 'bundle exec sidekiq' : 'sidekiq')
|
6
|
-
cmd << '-d' if sidekiq_config.daemonize
|
7
|
-
cmd << "-c #{skiq.concurrency}"
|
8
|
-
cmd << "-e #{Rails.env}" if defined?(Rails)
|
9
|
-
cmd << '-v' if skiq.verbose
|
10
|
-
cmd << "-L #{skiq.logfile}"
|
11
|
-
cmd << "-P #{skiq.pidfile}"
|
12
|
-
cmd << "-r #{skiq.requirefile}" if skiq.requirefile
|
13
|
-
|
14
|
-
skiq.queues.each do |q, w|
|
15
|
-
cmd << "-q #{q},#{w.to_s}"
|
16
|
-
end
|
17
|
-
|
18
|
-
cmd.join(' ')
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.build_stop_command(skiq, timeout)
|
22
|
-
cmd = []
|
23
|
-
cmd << (skiq.bundle_env ? 'bundle exec sidekiqctl' : 'sidekiqctl')
|
24
|
-
cmd << 'stop'
|
25
|
-
cmd << skiq.pidfile
|
26
|
-
cmd << timeout
|
27
|
-
|
28
|
-
cmd.join(' ')
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|