Implement method that updates a stage status
This commit is contained in:
parent
e389507650
commit
bbdc35717c
|
@ -3,6 +3,7 @@ module Ci
|
||||||
extend Ci::Model
|
extend Ci::Model
|
||||||
include Importable
|
include Importable
|
||||||
include HasStatus
|
include HasStatus
|
||||||
|
include Gitlab::OptimisticLocking
|
||||||
|
|
||||||
enumerate_status!
|
enumerate_status!
|
||||||
|
|
||||||
|
@ -15,5 +16,51 @@ module Ci
|
||||||
validates :project, presence: true, unless: :importing?
|
validates :project, presence: true, unless: :importing?
|
||||||
validates :pipeline, presence: true, unless: :importing?
|
validates :pipeline, presence: true, unless: :importing?
|
||||||
validates :name, presence: true, unless: :importing?
|
validates :name, presence: true, unless: :importing?
|
||||||
|
|
||||||
|
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!
|
||||||
|
retry_optimistic_lock(self) do
|
||||||
|
case commit_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
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Ci::Stage, :models do
|
describe Ci::Stage, :models do
|
||||||
describe 'associations' do
|
let(:stage) { create(:ci_stage_entity) }
|
||||||
let(:stage) { create(:ci_stage_entity) }
|
|
||||||
|
|
||||||
|
describe 'associations' do
|
||||||
before do
|
before do
|
||||||
create(:ci_build, stage_id: stage.id)
|
create(:ci_build, stage_id: stage.id)
|
||||||
create(:commit_status, stage_id: stage.id)
|
create(:commit_status, stage_id: stage.id)
|
||||||
|
@ -39,4 +39,22 @@ describe Ci::Stage, :models do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'update!' do
|
||||||
|
context 'when stage objects needs to be updated' do
|
||||||
|
before do
|
||||||
|
create(:ci_build, :success, stage_id: stage.id)
|
||||||
|
create(:ci_build, :running, stage_id: stage.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'updates stage status correctly' do
|
||||||
|
expect { stage.update! }
|
||||||
|
.to change { stage.reload.status }
|
||||||
|
.to 'running'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when stage object is locked' do
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue