
- Re-factor - Remove code for notifications - Remove addons - Remove travis-core gem. - Ignore logs directory only - Move core tests to spec/lib
100 lines
2.5 KiB
Ruby
100 lines
2.5 KiB
Ruby
require 'active_support/core_ext/hash/slice'
|
|
require 'simple_states'
|
|
|
|
class Job
|
|
|
|
# Executes a test job (i.e. runs a test suite) remotely and keeps tabs about
|
|
# state changes throughout its lifecycle in the database.
|
|
#
|
|
# Job::Test belongs to a Build as part of the build matrix and will be
|
|
# created with the Build.
|
|
class Test < Job
|
|
FINISHED_STATES = [:passed, :failed, :errored, :canceled]
|
|
FAILED_STATES = [:failed, :errored, :canceled]
|
|
|
|
include SimpleStates, Travis::Event
|
|
|
|
states :created, :queued, :received, :started, :passed, :failed, :errored, :canceled
|
|
|
|
event :receive, to: :received
|
|
event :start, to: :started
|
|
event :finish, to: :finished
|
|
event :reset, to: :created, unless: :created?
|
|
event :cancel, to: :canceled, if: :cancelable?
|
|
event :all, after: [:propagate]
|
|
|
|
def enqueue # TODO rename to queue and make it an event, simple_states should support that now
|
|
update_attributes!(state: :queued, queued_at: Time.now.utc)
|
|
end
|
|
|
|
def receive(data = {})
|
|
log.update_attributes!(content: '', removed_at: nil, removed_by: nil) # TODO this should be in a restart method, right?
|
|
data = data.symbolize_keys.slice(:received_at, :worker)
|
|
data.each { |key, value| send(:"#{key}=", value) }
|
|
end
|
|
|
|
def start(data = {})
|
|
data = data.symbolize_keys.slice(:started_at)
|
|
data.each { |key, value| send(:"#{key}=", value) }
|
|
end
|
|
|
|
def finish(data = {})
|
|
data = data.symbolize_keys.slice(:state, :finished_at)
|
|
data.each { |key, value| send(:"#{key}=", value) }
|
|
end
|
|
|
|
def reset(*)
|
|
self.state = :created
|
|
attrs = %w(started_at queued_at finished_at worker)
|
|
attrs.each { |attr| write_attribute(attr, nil) }
|
|
if log
|
|
log.clear!
|
|
else
|
|
build_log
|
|
end
|
|
annotations.destroy_all
|
|
end
|
|
|
|
def cancel
|
|
self.canceled_at = Time.now
|
|
self.finished_at = Time.now
|
|
|
|
save!
|
|
end
|
|
|
|
def cancelable?
|
|
!finished?
|
|
end
|
|
|
|
def resetable?
|
|
finished? && !invalid_config?
|
|
end
|
|
|
|
def invalid_config?
|
|
config[:".result"] == "parse_error"
|
|
end
|
|
|
|
def finished?
|
|
FINISHED_STATES.include?(state.to_sym)
|
|
end
|
|
|
|
def finished_unsuccessfully?
|
|
FAILED_STATES.include?(state.to_sym)
|
|
end
|
|
|
|
def passed?
|
|
state.to_s == "passed"
|
|
end
|
|
|
|
def failed?
|
|
state.to_s == "failed"
|
|
end
|
|
|
|
def unknown?
|
|
state == nil
|
|
end
|
|
|
|
delegate :id, :content, :to => :log, :prefix => true, :allow_nil => true
|
|
end
|
|
end
|