Skip to content
Snippets Groups Projects
Commit 79ea01bf authored by Grzegorz Bizon's avatar Grzegorz Bizon
Browse files

Refactor code related to pipeline blocking actions

parent f9a18143
No related branches found
No related tags found
1 merge request!9585Make manual actions blocking
Loading
@@ -64,7 +64,7 @@ module Ci
Loading
@@ -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|
Loading
@@ -103,11 +103,20 @@ module Ci
Loading
@@ -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)
Loading
@@ -126,7 +135,7 @@ module Ci
Loading
@@ -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
   
Loading
Loading
Loading
@@ -25,13 +25,13 @@ class CommitStatus < ActiveRecord::Base
Loading
@@ -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) }
Loading
@@ -42,11 +42,11 @@ class CommitStatus < ActiveRecord::Base
Loading
@@ -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
Loading
@@ -66,7 +66,7 @@ class CommitStatus < ActiveRecord::Base
Loading
@@ -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|
Loading
Loading
Loading
@@ -2,23 +2,20 @@ module HasStatus
Loading
@@ -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
Loading
@@ -32,7 +29,7 @@ module HasStatus
Loading
@@ -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
Loading
@@ -65,7 +62,7 @@ module HasStatus
Loading
@@ -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') }
Loading
@@ -76,13 +73,13 @@ module HasStatus
Loading
@@ -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
   
Loading
Loading
Loading
@@ -35,9 +35,9 @@ module Ci
Loading
@@ -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
Loading
Loading
Loading
@@ -104,10 +104,6 @@ module Gitlab
Loading
@@ -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)
Loading
Loading
Loading
@@ -71,6 +71,10 @@ FactoryGirl.define do
Loading
@@ -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
Loading
Loading
Loading
@@ -68,9 +68,9 @@ describe Ci::ProcessPipelineService, :services do
Loading
@@ -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
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment