Use new pipeline retry service with optimistic locking

This commit is contained in:
Grzegorz Bizon 2017-02-14 12:20:02 +01:00
parent 346a7c696a
commit 94495f984c
3 changed files with 39 additions and 27 deletions

View file

@ -224,13 +224,9 @@ module Ci
end
end
def retry_failed(user)
Gitlab::OptimisticLocking.retry_lock(
builds.latest.failed_or_canceled) do |failed_or_canceled|
failed_or_canceled.select(&:retryable?).each do |build|
Ci::Build.retry(build, user)
end
end
def retry_failed(current_user)
Ci::RetryPipelineService.new(project, current_user)
.execute(self)
end
def mark_as_processable_after_stage(stage_idx)

View file

@ -1,6 +1,8 @@
module Ci
class RetryBuildService < ::BaseService
def execute(build)
# return unless build.retryable?
self.retry(build).tap do |new_build|
MergeRequests::AddTodoWhenBuildFailsService
.new(build.project, current_user)

View file

@ -7,34 +7,48 @@ module Ci
raise Gitlab::Access::AccessDeniedError
end
##
# Reprocess builds in subsequent stages
#
pipeline.builds
.after_stage(resume_stage.index)
.failed_or_canceled.find_each do |build|
Ci::RetryBuildService
.new(project, current_user)
pipeline.mark_as_processable_after_stage(resume_stage.index)
retryable_builds_in_subsequent_stages do |build|
Ci::RetryBuildService.new(project, current_user)
.reprocess(build)
end
##
# Mark skipped builds as processable again
#
pipeline.mark_as_processable_after_stage(resume_stage.index)
##
# Retry builds in the first unsuccessful stage
#
resume_stage.builds.failed_or_canceled.find_each do |build|
Ci::RetryBuildService
.new(project, current_user)
retryable_builds_in_first_unsuccessful_stage do |build|
Ci::RetryBuildService.new(project, current_user)
.retry(build)
end
end
private
def retryable_builds_in_subsequent_stages
relation = @pipeline.builds
.after_stage(resume_stage.index)
.failed_or_canceled
each_retryable_build_with_locking(relation) do |build|
yield build
end
end
def retryable_builds_in_first_unsuccessful_stage
relation = resume_stage.builds.failed_or_canceled
each_retryable_build_with_locking(relation) do |build|
yield build
end
end
def each_retryable_build_with_locking(relation)
Gitlab::OptimisticLocking.retry_lock(relation) do |builds|
builds.find_each do |build|
next unless build.retryable?
yield build
end
end
end
def resume_stage
@resume_stage ||= @pipeline.stages.find do |stage|
stage.failed? || stage.canceled?