71 lines
1.7 KiB
Ruby
71 lines
1.7 KiB
Ruby
module Ci
|
|
class Stage < ActiveRecord::Base
|
|
extend Ci::Model
|
|
include Importable
|
|
include HasStatus
|
|
include Gitlab::OptimisticLocking
|
|
|
|
enum status: HasStatus::STATUSES_ENUM
|
|
|
|
belongs_to :project
|
|
belongs_to :pipeline
|
|
|
|
has_many :statuses, class_name: 'CommitStatus', foreign_key: :stage_id
|
|
has_many :builds, foreign_key: :stage_id
|
|
|
|
validates :project, presence: true, unless: :importing?
|
|
validates :pipeline, presence: true, unless: :importing?
|
|
validates :name, presence: true, unless: :importing?
|
|
|
|
after_initialize do |stage|
|
|
self.status = DEFAULT_STATUS if self.status.nil?
|
|
end
|
|
|
|
state_machine :status, initial: :created do
|
|
event :enqueue do
|
|
transition created: :pending
|
|
transition [:success, :failed, :canceled, :skipped] => :running
|
|
end
|
|
|
|
event :run do
|
|
transition any - [:running] => :running
|
|
end
|
|
|
|
event :skip do
|
|
transition any - [:skipped] => :skipped
|
|
end
|
|
|
|
event :drop do
|
|
transition any - [:failed] => :failed
|
|
end
|
|
|
|
event :succeed do
|
|
transition any - [:success] => :success
|
|
end
|
|
|
|
event :cancel do
|
|
transition any - [:canceled] => :canceled
|
|
end
|
|
|
|
event :block do
|
|
transition any - [:manual] => :manual
|
|
end
|
|
end
|
|
|
|
def update_status
|
|
retry_optimistic_lock(self) do
|
|
case statuses.latest.status
|
|
when 'pending' then enqueue
|
|
when 'running' then run
|
|
when 'success' then succeed
|
|
when 'failed' then drop
|
|
when 'canceled' then cancel
|
|
when 'manual' then block
|
|
when 'skipped' then skip
|
|
else skip
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|