summaryrefslogtreecommitdiff
path: root/app/services/ci/retry_build_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/ci/retry_build_service.rb')
-rw-r--r--app/services/ci/retry_build_service.rb43
1 files changed, 43 insertions, 0 deletions
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
new file mode 100644
index 00000000000..92006cb331c
--- /dev/null
+++ b/app/services/ci/retry_build_service.rb
@@ -0,0 +1,43 @@
+module Ci
+ class RetryBuildService
+ def initialize(build, user)
+ @build = build
+ @user = user
+ @pipeline = build.pipeline
+ end
+
+ def retry!
+ clone_build.tap do |new_build|
+ new_build.enqueue!
+
+ MergeRequests::AddTodoWhenBuildFailsService
+ .new(@build.project, @user)
+ .close(new_build)
+
+ @pipeline.mark_as_processable_after_stage(@build.stage_idx)
+ end
+ end
+
+ private
+
+ def clone_build
+ Ci::Build.create(
+ ref: @build.ref,
+ tag: @build.tag,
+ options: @build.options,
+ commands: @build.commands,
+ tag_list: @build.tag_list,
+ project: @build.project,
+ pipeline: @build.pipeline,
+ name: @build.name,
+ allow_failure: @build.allow_failure,
+ stage: @build.stage,
+ stage_idx: @build.stage_idx,
+ trigger_request: @build.trigger_request,
+ yaml_variables: @build.yaml_variables,
+ when: @build.when,
+ environment: @build.environment,
+ user: @user)
+ end
+ end
+end