Skip to content

Commit

Permalink
Adding a ScheduledBuildTrigger that allows more fine-grained control …
Browse files Browse the repository at this point in the history
…over build scheduling.
  • Loading branch information
bguthrie committed Jan 12, 2010
1 parent 6597927 commit cff2f95
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 2 deletions.
24 changes: 24 additions & 0 deletions app/models/scheduled_build_trigger.rb
@@ -0,0 +1,24 @@
class ScheduledBuildTrigger
attr_accessor :build_interval

def initialize(triggered_project, opts={})
@triggered_project = triggered_project
@build_interval = opts[:build_interval] || 24.hours
@next_build_time = opts[:start_time] || calculate_next_build_time
end

def build_necessary?(reasons)
if @triggered_project.build_requested? || time_for_new_build?
@next_build_time = calculate_next_build_time
true
end
end

def calculate_next_build_time
Time.now + @build_interval
end

def time_for_new_build?
Time.now >= @next_build_time
end
end
7 changes: 5 additions & 2 deletions config/cruise_config.rb.example
@@ -1,7 +1,7 @@
# Project-specific configuration for CruiseControl.rb

Project.configure do |project|

# Send email notifications about broken and fixed builds to email1@your.site, email2@your.site (default: send to nobody)
# project.email_notifier.emails = ['email1@your.site', 'email2@your.site']

Expand All @@ -18,5 +18,8 @@ Project.configure do |project|

# Ping Subversion for new revisions every 5 minutes (default: 30 seconds)
# project.scheduler.polling_interval = 5.minutes


# Force the project to build once in every given time interval
# project.triggered_by ScheduledBuildTrigger.new(project, :build_interval => 5.minutes, :start_time => 2.minutes.from_now)

end
61 changes: 61 additions & 0 deletions test/unit/scheduled_build_trigger_test.rb
@@ -0,0 +1,61 @@
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')

class ScheduledBuildTriggerTest < Test::Unit::TestCase
include FileSandbox
include BuildFactory

def setup
setup_sandbox
end

def teardown
teardown_sandbox
end

def test_build_should_be_necessary_if_build_triggered
project = mock(:build_requested? => true)
assert ScheduledBuildTrigger.new(project).build_necessary?([])
end

def test_build_should_be_necessary_if_time_exceeds_next_build_time
default_project = stub("Project", :build_requested? => false)

assert !(ScheduledBuildTrigger.new(default_project, :start_time => 1.minute.from_now).build_necessary?([]))
assert ScheduledBuildTrigger.new(default_project, :start_time => 1.minute.ago).build_necessary?([])

trigger = ScheduledBuildTrigger.new(default_project, :start_time => 1.minute.from_now)
future = 2.minutes.from_now
Time.stubs(:now).returns(future)
assert trigger.build_necessary?([])
end

def test_build_should_be_necessary_if_time_exceeds_build_interval
default_project = stub("Project", :build_requested? => false)

trigger = ScheduledBuildTrigger.new(default_project, :build_interval => 1.minute)
future = 2.minutes.from_now
Time.stubs(:now).returns(future)
assert trigger.build_necessary?([])
end

def test_build_necessary_should_handle_the_passage_of_time
default_project = stub("Project", :build_requested? => false)

should_build = 2.minutes.from_now
should_not_build = 3.minutes.from_now
should_build_again = 5.minutes.from_now

trigger = ScheduledBuildTrigger.new(default_project, :start_time => 1.minute.from_now, :build_interval => 3.minutes)

assert !trigger.build_necessary?([])

Time.stubs(:now).returns should_build
assert trigger.build_necessary?([])

Time.stubs(:now).returns should_not_build
assert !trigger.build_necessary?([])

Time.stubs(:now).returns should_build_again
assert trigger.build_necessary?([])
end
end

0 comments on commit cff2f95

Please sign in to comment.