created a new :job_template to wrap all commands with. using 'bash -l -c' by default now to load the entire enviroment which should help with RVM issues.
This commit is contained in:
parent
2effe0b32d
commit
e66226e3ae
59
README.rdoc
59
README.rdoc
@ -1,15 +1,15 @@
|
|||||||
== Introduction
|
== Introduction
|
||||||
|
|
||||||
Whenever is a Ruby gem that provides a clear syntax for defining cron jobs. It outputs valid cron syntax and can even write your crontab file for you. It is designed to work well with Rails applications and can be deployed with Capistrano. Whenever works fine independently as well.
|
Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
|
||||||
|
|
||||||
Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
|
|
||||||
|
|
||||||
Discussion: http://groups.google.com/group/whenever-gem
|
|
||||||
|
|
||||||
== Installation
|
== Installation
|
||||||
|
|
||||||
$ sudo gem install whenever
|
$ gem install whenever
|
||||||
|
|
||||||
|
Or with Bundler in your Gemfile.
|
||||||
|
|
||||||
|
gem 'whenever', :require => false
|
||||||
|
|
||||||
== Getting started
|
== Getting started
|
||||||
|
|
||||||
$ cd /my/rails/app
|
$ cd /my/rails/app
|
||||||
@ -41,7 +41,7 @@ More examples on the wiki: http://wiki.github.com/javan/whenever/instructions-an
|
|||||||
|
|
||||||
== Define your own job types
|
== Define your own job types
|
||||||
|
|
||||||
Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with <code>job_type</code>.
|
Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with `job_type`.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
@ -51,15 +51,29 @@ For example:
|
|||||||
awesome "party", :fun_level => "extreme"
|
awesome "party", :fun_level => "extreme"
|
||||||
end
|
end
|
||||||
|
|
||||||
Would run <code>/usr/local/bin/awesome party extreme</code> every two hours. <code>:task</code> is always replaced with the first argument, and any additional <code>:whatevers</code> are replaced with the options passed in or by variables that have been defined with <code>set</code>.
|
Would run `/usr/local/bin/awesome party extreme` every two hours. `:task` is always replaced with the first argument, and any additional `:whatevers` are replaced with the options passed in or by variables that have been defined with `set`.
|
||||||
|
|
||||||
The default job types that ship with Whenever are defined like so:
|
The default job types that ship with Whenever are defined like so:
|
||||||
|
|
||||||
job_type :command, ":task"
|
job_type :command, ":task :output"
|
||||||
job_type :runner, "cd :path && script/runner -e :environment ':task'"
|
job_type :rake, "cd :path && RAILS_ENV=:environment rake :task :output"
|
||||||
job_type :rake, "cd :path && RAILS_ENV=:environment /usr/bin/env rake :task"
|
job_type :runner, "cd :path && script/runner -e :environment ':task' :output"
|
||||||
|
|
||||||
|
If a script/rails file is detected (like in a Rails 3 app), runner will be defined to fit:
|
||||||
|
|
||||||
If a <code>:path</code> is not set it will default to the directory in which <code>whenever</code> was executed. <code>:environment</code> will default to 'production'.
|
job_type :runner, "cd :path && script/rails runner -e :environment ':task' :output"
|
||||||
|
|
||||||
|
If a `:path` is not set it will default to the directory in which `whenever` was executed. `:environment` will default to 'production'. `:output` will be replaced with your output redirection settings which you can read more about here: http://github.com/javan/whenever/wiki/Output-redirection-(logging-your-cron-jobs)
|
||||||
|
|
||||||
|
All jobs are by default run with `bash -l -c 'command...'`. Among other things, this allows your cron jobs to play nice with RVM by loading the entire environment instead of cron's somewhat limited environment. Read more: http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production
|
||||||
|
|
||||||
|
You can change this by setting your own job_template.
|
||||||
|
|
||||||
|
set :job_template, "bash -l -c ':job'"
|
||||||
|
|
||||||
|
Or set the job_template to nil to have your jobs execute normally.
|
||||||
|
|
||||||
|
set :job_template, nil
|
||||||
|
|
||||||
== Cron output
|
== Cron output
|
||||||
|
|
||||||
@ -81,19 +95,13 @@ In your "config/deploy.rb" file do something like:
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
This will update your crontab file, leaving any existing entries unharmed. When using the <code>--update-crontab</code> option, Whenever will only update the entries in your crontab file related to the current schedule.rb file. You can replace the <code>#{application}</code> with any identifying string you'd like. You can have any number of apps deploy to the same crontab file peacefully given they each use a different identifier.
|
This will update your crontab file, leaving any existing entries unharmed. When using the `--update-crontab` option, Whenever will only update the entries in your crontab file related to the current schedule.rb file. You can replace the `#{application}` with any identifying string you'd like. You can have any number of apps deploy to the same crontab file peacefully given they each use a different identifier.
|
||||||
|
|
||||||
If you wish to simply overwrite your crontab file each time you deploy, use the <code>--write-crontab</code> option. This is ideal if you are only working with one app and every crontab entry is contained in a single schedule.rb file.
|
If you wish to simply overwrite your crontab file each time you deploy, use the `--write-crontab` option. This is ideal if you are only working with one app and every crontab entry is contained in a single schedule.rb file.
|
||||||
|
|
||||||
By mixing and matching the <code>--load-file</code> and <code>--user</code> options with your various :roles in Capistrano it is entirely possible to deploy different crontab schedules under different users to all your various servers. Get creative!
|
By mixing and matching the `--load-file` and `--user` options with your various :roles in Capistrano it is entirely possible to deploy different crontab schedules under different users to all your various servers. Get creative!
|
||||||
|
|
||||||
If you want to override a variable (like your environment) at the time of deployment you can do so with the <code>--set</code> option: http://wiki.github.com/javan/whenever/setting-variables-on-the-fly
|
If you want to override a variable (like your environment) at the time of deployment you can do so with the `--set` option: http://wiki.github.com/javan/whenever/setting-variables-on-the-fly
|
||||||
|
|
||||||
== Credit
|
|
||||||
|
|
||||||
Whenever was created for use at Inkling (http://inklingmarkets.com) where I work. Their take on it: http://blog.inklingmarkets.com/2009/02/whenever-easy-way-to-do-cron-jobs-from.html
|
|
||||||
|
|
||||||
While building Whenever, I learned a lot by digging through the source code of Capistrano - http://github.com/jamis/capistrano
|
|
||||||
|
|
||||||
== Discussion / Feedback / Issues / Bugs
|
== Discussion / Feedback / Issues / Bugs
|
||||||
|
|
||||||
@ -101,6 +109,13 @@ For general discussion and questions, please use the google group: http://groups
|
|||||||
|
|
||||||
If you've found a genuine bug or issue, please use the Issues section on github: http://github.com/javan/whenever/issues
|
If you've found a genuine bug or issue, please use the Issues section on github: http://github.com/javan/whenever/issues
|
||||||
|
|
||||||
|
Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
|
||||||
|
It's a little bit dated now, but remains a good introduction.
|
||||||
|
|
||||||
|
== Credit
|
||||||
|
|
||||||
|
Whenever was created for use at Inkling (http://inklingmarkets.com) where I work. Their take on it: http://blog.inklingmarkets.com/2009/02/whenever-easy-way-to-do-cron-jobs-from.html
|
||||||
|
|
||||||
== License
|
== License
|
||||||
|
|
||||||
Copyright (c) 2009+ Javan Makhmali
|
Copyright (c) 2009+ Javan Makhmali
|
||||||
|
@ -5,17 +5,25 @@ module Whenever
|
|||||||
|
|
||||||
def initialize(options = {})
|
def initialize(options = {})
|
||||||
@options = options
|
@options = options
|
||||||
|
@at = options.delete(:at)
|
||||||
@at = options[:at]
|
@template = options.delete(:template)
|
||||||
|
@job_template = options.delete(:job_template) || ":job"
|
||||||
@options[:output] = Whenever::Output::Redirection.new(options[:output]).to_s if options.has_key?(:output)
|
@options[:output] = Whenever::Output::Redirection.new(options[:output]).to_s if options.has_key?(:output)
|
||||||
@options[:environment] ||= :production
|
@options[:environment] ||= :production
|
||||||
@options[:path] ||= Whenever.path
|
@options[:path] ||= Whenever.path
|
||||||
end
|
end
|
||||||
|
|
||||||
def output
|
def output
|
||||||
@options[:template].dup.gsub(/:\w+/) do |key|
|
job = process_template(@template, @options).strip
|
||||||
|
process_template(@job_template, { :job => job }).strip
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def process_template(template, options)
|
||||||
|
template.gsub(/:\w+/) do |key|
|
||||||
before_and_after = [$`[-1..-1], $'[0..0]]
|
before_and_after = [$`[-1..-1], $'[0..0]]
|
||||||
option = @options[key.sub(':', '').to_sym]
|
option = options[key.sub(':', '').to_sym]
|
||||||
|
|
||||||
if before_and_after.all? { |c| c == "'" }
|
if before_and_after.all? { |c| c == "'" }
|
||||||
escape_single_quotes(option)
|
escape_single_quotes(option)
|
||||||
@ -26,8 +34,6 @@ module Whenever
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def escape_single_quotes(str)
|
def escape_single_quotes(str)
|
||||||
str.gsub(/'/) { "'\\''" }
|
str.gsub(/'/) { "'\\''" }
|
||||||
|
@ -2,7 +2,7 @@ module Whenever
|
|||||||
class JobList
|
class JobList
|
||||||
|
|
||||||
def initialize(options)
|
def initialize(options)
|
||||||
@jobs, @env, @set_variables = {}, {}, {}
|
@jobs, @env, @set_variables, @pre_set_variables = {}, {}, {}, {}
|
||||||
|
|
||||||
case options
|
case options
|
||||||
when String
|
when String
|
||||||
@ -25,7 +25,8 @@ module Whenever
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set(variable, value)
|
def set(variable, value)
|
||||||
return if instance_variable_defined?("@#{variable}".to_sym)
|
variable = variable.to_sym
|
||||||
|
return if @pre_set_variables[variable]
|
||||||
|
|
||||||
instance_variable_set("@#{variable}".to_sym, value)
|
instance_variable_set("@#{variable}".to_sym, value)
|
||||||
self.class.send(:attr_reader, variable.to_sym)
|
self.class.send(:attr_reader, variable.to_sym)
|
||||||
@ -59,9 +60,7 @@ module Whenever
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_cron_output
|
def generate_cron_output
|
||||||
set_path_environment_variable
|
|
||||||
|
|
||||||
[environment_variables, cron_jobs].compact.join
|
[environment_variables, cron_jobs].compact.join
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -79,22 +78,13 @@ module Whenever
|
|||||||
pairs.each do |pair|
|
pairs.each do |pair|
|
||||||
next unless pair.index('=')
|
next unless pair.index('=')
|
||||||
variable, value = *pair.split('=')
|
variable, value = *pair.split('=')
|
||||||
set(variable.strip.to_sym, value.strip) unless variable.blank? || value.blank?
|
unless variable.blank? || value.blank?
|
||||||
|
variable = variable.strip.to_sym
|
||||||
|
set(variable, value.strip)
|
||||||
|
@pre_set_variables[variable] = value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_path_environment_variable
|
|
||||||
return if path_should_not_be_set_automatically?
|
|
||||||
@env[:PATH] = read_path unless read_path.blank?
|
|
||||||
end
|
|
||||||
|
|
||||||
def read_path
|
|
||||||
ENV['PATH'] if ENV
|
|
||||||
end
|
|
||||||
|
|
||||||
def path_should_not_be_set_automatically?
|
|
||||||
@set_path_automatically === false || @env[:PATH] || @env["PATH"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def environment_variables
|
def environment_variables
|
||||||
return if @env.empty?
|
return if @env.empty?
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
# http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production
|
||||||
|
set :job_template, "/bin/bash -l -c ':job'"
|
||||||
|
|
||||||
job_type :command, ":task :output"
|
job_type :command, ":task :output"
|
||||||
job_type :rake, "cd :path && RAILS_ENV=:environment rake :task --silent :output"
|
job_type :rake, "cd :path && RAILS_ENV=:environment rake :task --silent :output"
|
||||||
|
|
||||||
|
@ -217,6 +217,7 @@ NEW_CRON
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron :set => 'environment=serious', :string => \
|
@output = Whenever.cron :set => 'environment=serious', :string => \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :environment, :silly
|
set :environment, :silly
|
||||||
set :path, '/my/path'
|
set :path, '/my/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
@ -234,6 +235,7 @@ NEW_CRON
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron :set => 'environment=serious&path=/serious/path', :string => \
|
@output = Whenever.cron :set => 'environment=serious&path=/serious/path', :string => \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :environment, :silly
|
set :environment, :silly
|
||||||
set :path, '/silly/path'
|
set :path, '/silly/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
@ -251,6 +253,7 @@ NEW_CRON
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron :set => ' environment = serious& path =/serious/path', :string => \
|
@output = Whenever.cron :set => ' environment = serious& path =/serious/path', :string => \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :environment, :silly
|
set :environment, :silly
|
||||||
set :path, '/silly/path'
|
set :path, '/silly/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
@ -268,6 +271,7 @@ NEW_CRON
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron :set => ' environment=', :string => \
|
@output = Whenever.cron :set => ' environment=', :string => \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :environment, :silly
|
set :environment, :silly
|
||||||
set :path, '/silly/path'
|
set :path, '/silly/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
|
@ -6,6 +6,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every "weekday", :at => '5:02am' do
|
every "weekday", :at => '5:02am' do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -21,6 +22,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every "weekday", :at => %w(5:02am 3:52pm) do
|
every "weekday", :at => %w(5:02am 3:52pm) do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -37,6 +39,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every "weekday", :at => '5:02am, 3:52pm' do
|
every "weekday", :at => '5:02am, 3:52pm' do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -53,6 +56,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every "weekday", :at => '5:02am, 3:02pm' do
|
every "weekday", :at => '5:02am, 3:02pm' do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -68,6 +72,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -83,6 +88,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/your/path'
|
set :path, '/your/path'
|
||||||
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
||||||
runner "blahblah"
|
runner "blahblah"
|
||||||
@ -99,6 +105,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/your/path'
|
set :path, '/your/path'
|
||||||
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
||||||
rake "blah:blah"
|
rake "blah:blah"
|
||||||
@ -115,6 +122,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
|
every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -138,6 +146,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every :reboot do
|
every :reboot do
|
||||||
command "command_1"
|
command "command_1"
|
||||||
command "command_2"
|
command "command_2"
|
||||||
@ -155,6 +164,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/your/path'
|
set :path, '/your/path'
|
||||||
every :day do
|
every :day do
|
||||||
rake "blah:blah"
|
rake "blah:blah"
|
||||||
@ -179,6 +189,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 5.minutes, :at => 1 do
|
every 5.minutes, :at => 1 do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -194,6 +205,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 4.minutes, :at => 2 do
|
every 4.minutes, :at => 2 do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -209,6 +221,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 3.minutes, :at => 7 do
|
every 3.minutes, :at => 7 do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -224,6 +237,7 @@ class OutputAtTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.minutes, :at => 27 do
|
every 2.minutes, :at => 27 do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
|
@ -4,10 +4,11 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
|||||||
|
|
||||||
# command
|
# command
|
||||||
|
|
||||||
context "A plain command" do
|
context "A plain command with the job template set to nil" do
|
||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
end
|
end
|
||||||
@ -19,12 +20,45 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "A plain command with no job template set" do
|
||||||
|
setup do
|
||||||
|
@output = Whenever.cron \
|
||||||
|
<<-file
|
||||||
|
every 2.hours do
|
||||||
|
command "blahblah"
|
||||||
|
end
|
||||||
|
file
|
||||||
|
end
|
||||||
|
|
||||||
|
should "output the command with the default job template" do
|
||||||
|
assert_match /^.+ .+ .+ .+ \/bin\/bash -l -c 'blahblah'$/, @output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "A plain command that overrides the job_template set" do
|
||||||
|
setup do
|
||||||
|
@output = Whenever.cron \
|
||||||
|
<<-file
|
||||||
|
set :job_template, "/bin/bash -l -c ':job'"
|
||||||
|
every 2.hours do
|
||||||
|
command "blahblah", :job_template => "/bin/sh -l -c ':job'"
|
||||||
|
end
|
||||||
|
file
|
||||||
|
end
|
||||||
|
|
||||||
|
should "output the command using that job_template" do
|
||||||
|
assert_match /^.+ .+ .+ .+ \/bin\/sh -l -c 'blahblah'$/, @output
|
||||||
|
assert_no_match /bash/, @output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# runner
|
# runner
|
||||||
|
|
||||||
context "A runner with path set" do
|
context "A runner with path set" do
|
||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/my/path'
|
set :path, '/my/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
runner 'blahblah'
|
runner 'blahblah'
|
||||||
@ -41,6 +75,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/my/path'
|
set :path, '/my/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
runner "blahblah", :path => '/some/other/path'
|
runner "blahblah", :path => '/some/other/path'
|
||||||
@ -59,6 +94,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
|||||||
File.expects(:exists?).with('/my/path/script/rails').returns(true)
|
File.expects(:exists?).with('/my/path/script/rails').returns(true)
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
runner 'blahblah'
|
runner 'blahblah'
|
||||||
end
|
end
|
||||||
@ -76,6 +112,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/my/path'
|
set :path, '/my/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
rake "blahblah"
|
rake "blahblah"
|
||||||
@ -92,6 +129,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :path, '/my/path'
|
set :path, '/my/path'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
rake "blahblah", :path => '/some/other/path'
|
rake "blahblah", :path => '/some/other/path'
|
||||||
|
@ -6,6 +6,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
job_type :some_job, "before :task after"
|
job_type :some_job, "before :task after"
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
some_job "during"
|
some_job "during"
|
||||||
@ -22,6 +23,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
job_type :some_job, "before :task after :option1 :option2"
|
job_type :some_job, "before :task after :option1 :option2"
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
some_job "during", :option1 => 'happy', :option2 => 'birthday'
|
some_job "during", :option1 => 'happy', :option2 => 'birthday'
|
||||||
@ -38,6 +40,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
job_type :some_job, "before :task after :option1"
|
job_type :some_job, "before :task after :option1"
|
||||||
set :option1, 'happy'
|
set :option1, 'happy'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
@ -55,6 +58,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
job_type :some_job, "before :task after :option1"
|
job_type :some_job, "before :task after :option1"
|
||||||
set :option1, 'global'
|
set :option1, 'global'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
@ -72,6 +76,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
job_type :some_job, "before :task after :option1"
|
job_type :some_job, "before :task after :option1"
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
some_job "during", :option2 => 'happy'
|
some_job "during", :option2 => 'happy'
|
||||||
@ -90,6 +95,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
|
|||||||
|
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
job_type :some_job, "cd :path && :task"
|
job_type :some_job, "cd :path && :task"
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
some_job 'blahblah'
|
some_job 'blahblah'
|
||||||
|
@ -19,38 +19,5 @@ class OutputEnvTest < Test::Unit::TestCase
|
|||||||
assert_match "MAILTO=someone@example.com", @output
|
assert_match "MAILTO=someone@example.com", @output
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "No PATH environment variable set" do
|
|
||||||
setup do
|
|
||||||
Whenever::JobList.any_instance.expects(:read_path).at_least_once.returns('/usr/local/bin')
|
|
||||||
@output = Whenever.cron ""
|
|
||||||
end
|
|
||||||
|
|
||||||
should "add a PATH variable based on the user's PATH" do
|
|
||||||
assert_match "PATH=/usr/local/bin", @output
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "A PATH environment variable set" do
|
|
||||||
setup do
|
|
||||||
Whenever::JobList.stubs(:read_path).returns('/usr/local/bin')
|
|
||||||
@output = Whenever.cron "env :PATH, '/my/path'"
|
|
||||||
end
|
|
||||||
|
|
||||||
should "use that path and the user's PATH" do
|
|
||||||
assert_match "PATH=/my/path", @output
|
|
||||||
assert_no_match /local/, @output
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "No PATH set and instructed not to automatically load the user's path" do
|
|
||||||
setup do
|
|
||||||
@output = Whenever.cron "set :set_path_automatically, false"
|
|
||||||
end
|
|
||||||
|
|
||||||
should "not have a PATH set" do
|
|
||||||
assert_no_match /PATH/, @output
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
@ -6,6 +6,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, nil
|
set :output, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
@ -23,6 +24,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, 'logfile.log'
|
set :output, 'logfile.log'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
@ -39,6 +41,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'}
|
command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'}
|
||||||
end
|
end
|
||||||
@ -54,6 +57,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, 'logfile.log'
|
set :output, 'logfile.log'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => 'otherlog.log'
|
command "blahblah", :output => 'otherlog.log'
|
||||||
@ -71,6 +75,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, 'logfile.log'
|
set :output, 'logfile.log'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' }
|
command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' }
|
||||||
@ -88,6 +93,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, 'logfile.log'
|
set :output, 'logfile.log'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => false
|
command "blahblah", :output => false
|
||||||
@ -105,6 +111,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron :set => 'output=otherlog.log', :string => \
|
@output = Whenever.cron :set => 'output=otherlog.log', :string => \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, 'logfile.log'
|
set :output, 'logfile.log'
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
@ -122,6 +129,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, {:error => 'dev_err', :standard => 'dev_null' }
|
set :output, {:error => 'dev_err', :standard => 'dev_null' }
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
@ -138,6 +146,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, {:error => 'dev_null'}
|
set :output, {:error => 'dev_null'}
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
@ -154,6 +163,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :output, {:standard => 'dev_out'}
|
set :output, {:standard => 'dev_out'}
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
@ -170,6 +180,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:error => 'dev_err'}
|
command "blahblah", :output => {:error => 'dev_err'}
|
||||||
end
|
end
|
||||||
@ -185,6 +196,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:standard => 'dev_out'}
|
command "blahblah", :output => {:standard => 'dev_out'}
|
||||||
end
|
end
|
||||||
@ -200,6 +212,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:standard => nil}
|
command "blahblah", :output => {:standard => nil}
|
||||||
end
|
end
|
||||||
@ -215,6 +228,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:error => nil}
|
command "blahblah", :output => {:error => nil}
|
||||||
end
|
end
|
||||||
@ -230,6 +244,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:error => nil, :standard => nil}
|
command "blahblah", :output => {:error => nil, :standard => nil}
|
||||||
end
|
end
|
||||||
@ -245,6 +260,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:error => nil, :standard => 'my.log'}
|
command "blahblah", :output => {:error => nil, :standard => 'my.log'}
|
||||||
end
|
end
|
||||||
@ -260,6 +276,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah", :output => {:error => 'my_error.log', :standard => nil}
|
command "blahblah", :output => {:error => 'my_error.log', :standard => nil}
|
||||||
end
|
end
|
||||||
@ -275,6 +292,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
|
|||||||
setup do
|
setup do
|
||||||
@output = Whenever.cron \
|
@output = Whenever.cron \
|
||||||
<<-file
|
<<-file
|
||||||
|
set :job_template, nil
|
||||||
set :cron_log, "cron.log"
|
set :cron_log, "cron.log"
|
||||||
every 2.hours do
|
every 2.hours do
|
||||||
command "blahblah"
|
command "blahblah"
|
||||||
|
@ -24,7 +24,6 @@ class JobTest < Test::Unit::TestCase
|
|||||||
|
|
||||||
|
|
||||||
context "A Job with quotes" do
|
context "A Job with quotes" do
|
||||||
|
|
||||||
should "output the :task if it's in single quotes" do
|
should "output the :task if it's in single quotes" do
|
||||||
job = new_job(:template => "':task'", :task => 'abc123')
|
job = new_job(:template => "':task'", :task => 'abc123')
|
||||||
assert_equal %q('abc123'), job.output
|
assert_equal %q('abc123'), job.output
|
||||||
@ -51,6 +50,23 @@ class JobTest < Test::Unit::TestCase
|
|||||||
assert_equal %q(before "quote -> \" <- quote" after), job.output
|
assert_equal %q(before "quote -> \" <- quote" after), job.output
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "A Job with a job_template" do
|
||||||
|
should "use the job template" do
|
||||||
|
job = new_job(:template => ':task', :task => 'abc123', :job_template => 'left :job right')
|
||||||
|
assert_equal 'left abc123 right', job.output
|
||||||
|
end
|
||||||
|
|
||||||
|
should "escape single quotes" do
|
||||||
|
job = new_job(:template => "before ':task' after", :task => "quote -> ' <- quote", :job_template => "left ':job' right")
|
||||||
|
assert_equal %q(left 'before '\''quote -> '\\''\\'\\'''\\'' <- quote'\'' after' right), job.output
|
||||||
|
end
|
||||||
|
|
||||||
|
should "escape double quotes" do
|
||||||
|
job = new_job(:template => 'before ":task" after', :task => 'quote -> " <- quote', :job_template => 'left ":job" right')
|
||||||
|
assert_equal %q(left "before \"quote -> \\\" <- quote\" after" right), job.output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user