diff options
Diffstat (limited to 'app/services/ci/retry_build_service.rb')
-rw-r--r-- | app/services/ci/retry_build_service.rb | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb index ea76771b80a..08520c9514c 100644 --- a/app/services/ci/retry_build_service.rb +++ b/app/services/ci/retry_build_service.rb @@ -10,10 +10,17 @@ module Ci resource_group scheduling_type].freeze end + def self.extra_accessors + [] + end + def execute(build) build.ensure_scheduling_type! reprocess!(build).tap do |new_build| + check_assignable_runners!(new_build) + next if new_build.failed? + Gitlab::OptimisticLocking.retry_lock(new_build, name: 'retry_build', &:enqueue) AfterRequeueJobService.new(project, current_user).execute(build) @@ -27,18 +34,15 @@ module Ci def reprocess!(build) check_access!(build) - attributes = self.class.clone_accessors.to_h do |attribute| - [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend - end - - attributes[:user] = current_user - - Ci::Build.transaction do - create_build!(attributes).tap do |new_build| - new_build.update_older_statuses_retried! - build.reset # refresh the data to get new values of `retried` and `processed`. + new_build = clone_build(build) + ::Ci::Pipelines::AddJobService.new(build.pipeline).execute!(new_build) do |job| + BulkInsertableAssociations.with_bulk_insert do + job.save! end end + build.reset # refresh the data to get new values of `retried` and `processed`. + + new_build end # rubocop: enable CodeReuse/ActiveRecord @@ -50,13 +54,21 @@ module Ci end end - def create_build!(attributes) - build = project.builds.new(attributes) - build.assign_attributes(::Gitlab::Ci::Pipeline::Seed::Build.environment_attributes_for(build)) - BulkInsertableAssociations.with_bulk_insert do - build.save! + def check_assignable_runners!(build); end + + def clone_build(build) + project.builds.new(build_attributes(build)).tap do |new_build| + new_build.assign_attributes(::Gitlab::Ci::Pipeline::Seed::Build.environment_attributes_for(new_build)) end - build + end + + def build_attributes(build) + attributes = self.class.clone_accessors.to_h do |attribute| + [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend + end + + attributes[:user] = current_user + attributes end end end |