Commit 79ea01bf authored by Grzegorz Bizon's avatar Grzegorz Bizon

Refactor code related to pipeline blocking actions

parent f9a18143
...@@ -64,7 +64,7 @@ module Ci ...@@ -64,7 +64,7 @@ module Ci
state_machine :status do state_machine :status do
event :block do event :block do
transition :created => :manual, if: ->() { self.when == 'manual' } transition :created => :blocked
end end
after_transition any => [:pending] do |build| after_transition any => [:pending] do |build|
...@@ -103,11 +103,20 @@ module Ci ...@@ -103,11 +103,20 @@ module Ci
end end
def playable? def playable?
project.builds_enabled? && commands.present? && manual? project.builds_enabled? && has_commands? && manual? &&
(skipped? || blocked?)
end end
def is_blocking? def manual?
playable? && !allow_failure? self.when == 'manual'
end
def barrier?
manual? && !allow_failure?
end
def has_commands?
commands.present?
end end
def play(current_user) def play(current_user)
...@@ -126,7 +135,7 @@ module Ci ...@@ -126,7 +135,7 @@ module Ci
end end
def retryable? def retryable?
project.builds_enabled? && commands.present? && project.builds_enabled? && has_commands? &&
(success? || failed? || canceled?) (success? || failed? || canceled?)
end end
......
...@@ -25,13 +25,13 @@ class CommitStatus < ActiveRecord::Base ...@@ -25,13 +25,13 @@ class CommitStatus < ActiveRecord::Base
end end
scope :failed_but_allowed, -> do scope :failed_but_allowed, -> do
where(allow_failure: true, status: [:failed, :canceled, :manual]) where(allow_failure: true, status: [:failed, :canceled, :blocked])
end end
scope :exclude_ignored, -> do scope :exclude_ignored, -> do
# We want to ignore failed_but_allowed jobs # We want to ignore failed_but_allowed jobs
where("allow_failure = ? OR status IN (?)", where("allow_failure = ? OR status IN (?)",
false, all_state_names - [:failed, :canceled, :manual]) false, all_state_names - [:failed, :canceled, :blocked])
end end
scope :retried, -> { where.not(id: latest) } scope :retried, -> { where.not(id: latest) }
...@@ -42,11 +42,11 @@ class CommitStatus < ActiveRecord::Base ...@@ -42,11 +42,11 @@ class CommitStatus < ActiveRecord::Base
state_machine :status do state_machine :status do
event :enqueue do event :enqueue do
transition [:created, :skipped, :manual] => :pending transition [:created, :skipped, :blocked] => :pending
end end
event :process do event :process do
transition [:skipped, :manual] => :created transition [:skipped, :blocked] => :created
end end
event :run do event :run do
...@@ -66,7 +66,7 @@ class CommitStatus < ActiveRecord::Base ...@@ -66,7 +66,7 @@ class CommitStatus < ActiveRecord::Base
end end
event :cancel do event :cancel do
transition [:created, :pending, :running, :manual] => :canceled transition [:created, :pending, :running, :blocked] => :canceled
end end
before_transition created: [:pending, :running] do |commit_status| before_transition created: [:pending, :running] do |commit_status|
......
...@@ -2,23 +2,20 @@ module HasStatus ...@@ -2,23 +2,20 @@ module HasStatus
extend ActiveSupport::Concern extend ActiveSupport::Concern
DEFAULT_STATUS = 'created'.freeze DEFAULT_STATUS = 'created'.freeze
AVAILABLE_STATUSES = %w[created pending running success failed canceled skipped manual].freeze AVAILABLE_STATUSES = %w[created pending running success failed canceled skipped blocked].freeze
STARTED_STATUSES = %w[running success failed skipped].freeze STARTED_STATUSES = %w[running success failed skipped].freeze
ACTIVE_STATUSES = %w[pending running manual].freeze ACTIVE_STATUSES = %w[pending running blocked].freeze
COMPLETED_STATUSES = %w[success failed canceled skipped].freeze COMPLETED_STATUSES = %w[success failed canceled skipped].freeze
ORDERED_STATUSES = %w[failed pending running canceled success skipped].freeze ORDERED_STATUSES = %w[failed pending running canceled success skipped].freeze
class_methods do class_methods do
def status_sql def status_sql
scope = if respond_to?(:exclude_ignored) scope = respond_to?(:exclude_ignored) ? exclude_ignored : all
exclude_ignored
else
all
end
builds = scope.select('count(*)').to_sql builds = scope.select('count(*)').to_sql
created = scope.created.select('count(*)').to_sql created = scope.created.select('count(*)').to_sql
success = scope.success.select('count(*)').to_sql success = scope.success.select('count(*)').to_sql
manual = scope.manual.select('count(*)').to_sql blocked = scope.blocked.select('count(*)').to_sql
pending = scope.pending.select('count(*)').to_sql pending = scope.pending.select('count(*)').to_sql
running = scope.running.select('count(*)').to_sql running = scope.running.select('count(*)').to_sql
skipped = scope.skipped.select('count(*)').to_sql skipped = scope.skipped.select('count(*)').to_sql
...@@ -32,7 +29,7 @@ module HasStatus ...@@ -32,7 +29,7 @@ module HasStatus
WHEN (#{builds})=(#{success})+(#{skipped})+(#{canceled}) THEN 'canceled' WHEN (#{builds})=(#{success})+(#{skipped})+(#{canceled}) THEN 'canceled'
WHEN (#{builds})=(#{created})+(#{skipped})+(#{pending}) THEN 'pending' WHEN (#{builds})=(#{created})+(#{skipped})+(#{pending}) THEN 'pending'
WHEN (#{running})+(#{pending})+(#{created})>0 THEN 'running' WHEN (#{running})+(#{pending})+(#{created})>0 THEN 'running'
WHEN (#{manual})>0 THEN 'manual' WHEN (#{blocked})>0 THEN 'blocked'
ELSE 'failed' ELSE 'failed'
END)" END)"
end end
...@@ -65,7 +62,7 @@ module HasStatus ...@@ -65,7 +62,7 @@ module HasStatus
state :success, value: 'success' state :success, value: 'success'
state :canceled, value: 'canceled' state :canceled, value: 'canceled'
state :skipped, value: 'skipped' state :skipped, value: 'skipped'
state :manual, value: 'manual' state :blocked, value: 'blocked'
end end
scope :created, -> { where(status: 'created') } scope :created, -> { where(status: 'created') }
...@@ -76,13 +73,13 @@ module HasStatus ...@@ -76,13 +73,13 @@ module HasStatus
scope :failed, -> { where(status: 'failed') } scope :failed, -> { where(status: 'failed') }
scope :canceled, -> { where(status: 'canceled') } scope :canceled, -> { where(status: 'canceled') }
scope :skipped, -> { where(status: 'skipped') } scope :skipped, -> { where(status: 'skipped') }
scope :manual, -> { where(status: 'manual') } scope :blocked, -> { where(status: 'blocked') }
scope :running_or_pending, -> { where(status: [:running, :pending]) } scope :running_or_pending, -> { where(status: [:running, :pending]) }
scope :finished, -> { where(status: [:success, :failed, :canceled]) } scope :finished, -> { where(status: [:success, :failed, :canceled]) }
scope :failed_or_canceled, -> { where(status: [:failed, :canceled]) } scope :failed_or_canceled, -> { where(status: [:failed, :canceled]) }
scope :cancelable, -> do scope :cancelable, -> do
where(status: [:running, :pending, :created, :manual]) where(status: [:running, :pending, :created, :blocked])
end end
end end
......
...@@ -35,9 +35,9 @@ module Ci ...@@ -35,9 +35,9 @@ module Ci
if valid_statuses_for_when(build.when).include?(current_status) if valid_statuses_for_when(build.when).include?(current_status)
build.enqueue build.enqueue
true true
elsif build.can_block? elsif build.barrier?
build.block build.block
build.is_blocking? false
else else
build.skip build.skip
false false
......
...@@ -104,10 +104,6 @@ module Gitlab ...@@ -104,10 +104,6 @@ module Gitlab
(before_script_value.to_a + script_value.to_a).join("\n") (before_script_value.to_a + script_value.to_a).join("\n")
end end
def allow_failure
super || self.when == 'manual'
end
private private
def inherit!(deps) def inherit!(deps)
......
...@@ -71,6 +71,10 @@ FactoryGirl.define do ...@@ -71,6 +71,10 @@ FactoryGirl.define do
allow_failure true allow_failure true
end end
trait :ignored do
allowed_to_fail
end
trait :playable do trait :playable do
skipped skipped
manual manual
......
...@@ -68,9 +68,9 @@ describe Ci::ProcessPipelineService, :services do ...@@ -68,9 +68,9 @@ describe Ci::ProcessPipelineService, :services do
create(:ci_build, :created, pipeline: pipeline, name: 'test', stage_idx: 1) create(:ci_build, :created, pipeline: pipeline, name: 'test', stage_idx: 1)
create(:ci_build, :created, pipeline: pipeline, name: 'test_failure', stage_idx: 2, when: 'on_failure') create(:ci_build, :created, pipeline: pipeline, name: 'test_failure', stage_idx: 2, when: 'on_failure')
create(:ci_build, :created, pipeline: pipeline, name: 'deploy', stage_idx: 3) create(:ci_build, :created, pipeline: pipeline, name: 'deploy', stage_idx: 3)
create(:ci_build, :created, pipeline: pipeline, name: 'production', stage_idx: 3, when: 'manual') create(:ci_build, :created, pipeline: pipeline, name: 'production', stage_idx: 3, when: 'manual', allow_failure: true)
create(:ci_build, :created, pipeline: pipeline, name: 'cleanup', stage_idx: 4, when: 'always') create(:ci_build, :created, pipeline: pipeline, name: 'cleanup', stage_idx: 4, when: 'always')
create(:ci_build, :created, pipeline: pipeline, name: 'clear cache', stage_idx: 4, when: 'manual') create(:ci_build, :created, pipeline: pipeline, name: 'clear cache', stage_idx: 4, when: 'manual', allow_failure: true)
end end
context 'when builds are successful' do context 'when builds are successful' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment