diff options
Diffstat (limited to 'app/models/ci/pipeline.rb')
-rw-r--r-- | app/models/ci/pipeline.rb | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 8aad149519e..e03def25755 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -11,6 +11,8 @@ module Ci belongs_to :auto_canceled_by, class_name: 'Ci::Pipeline' has_many :auto_canceled_pipelines, class_name: 'Ci::Pipeline', foreign_key: 'auto_canceled_by_id' + has_many :auto_canceled_jobs, class_name: 'CommitStatus', foreign_key: 'auto_canceled_by_id' + has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id has_many :builds, foreign_key: :commit_id has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id @@ -93,6 +95,10 @@ module Ci PipelineNotificationWorker.perform_async(pipeline.id) end end + + after_transition :canceled => any - [:canceled] do |pipeline| + pipeline.update(auto_canceled_by: nil) + end end # ref can't be HEAD or SHA, can only be branch/tag name @@ -226,10 +232,21 @@ module Ci def cancel_running Gitlab::OptimisticLocking.retry_lock( statuses.cancelable) do |cancelable| - cancelable.find_each(&:cancel) + cancelable.find_each do |job| + yield(job) if block_given? + job.cancel + end end end + def auto_cancel_running(pipeline) + update(auto_canceled_by: pipeline) + + cancel_running do |job| + job.auto_canceled_by = pipeline + end + end + def retry_failed(current_user) Ci::RetryPipelineService.new(project, current_user) .execute(self) |