Commit f0654595 authored by Mayra Cabrera's avatar Mayra Cabrera

Merge branch 'create-deployment-in-separate-transaction-retry-job' into 'master'

Create Deployment in a separate transaction for Job Retry

See merge request gitlab-org/gitlab!75842
parents 83b9fdb7 474f0643
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
module Ci module Ci
class RetryBuildService < ::BaseService class RetryBuildService < ::BaseService
include Gitlab::Utils::StrongMemoize
def self.clone_accessors def self.clone_accessors
%i[pipeline project ref tag options name %i[pipeline project ref tag options name
allow_failure stage stage_id stage_idx trigger_request allow_failure stage stage_id stage_idx trigger_request
...@@ -45,6 +47,11 @@ module Ci ...@@ -45,6 +47,11 @@ module Ci
job.save! job.save!
end end
end end
if create_deployment_in_separate_transaction?
clone_deployment!(new_build, build)
end
build.reset # refresh the data to get new values of `retried` and `processed`. build.reset # refresh the data to get new values of `retried` and `processed`.
new_build new_build
...@@ -63,7 +70,9 @@ module Ci ...@@ -63,7 +70,9 @@ module Ci
def clone_build(build) def clone_build(build)
project.builds.new(build_attributes(build)).tap do |new_build| project.builds.new(build_attributes(build)).tap do |new_build|
new_build.assign_attributes(deployment_attributes_for(new_build, build)) unless create_deployment_in_separate_transaction?
new_build.assign_attributes(deployment_attributes_for(new_build, build))
end
end end
end end
...@@ -72,6 +81,11 @@ module Ci ...@@ -72,6 +81,11 @@ module Ci
[attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
end end
if create_deployment_in_separate_transaction? && build.persisted_environment.present?
attributes[:metadata_attributes] ||= {}
attributes[:metadata_attributes][:expanded_environment_name] = build.expanded_environment_name
end
attributes[:user] = current_user attributes[:user] = current_user
attributes attributes
end end
...@@ -80,6 +94,26 @@ module Ci ...@@ -80,6 +94,26 @@ module Ci
::Gitlab::Ci::Pipeline::Seed::Build ::Gitlab::Ci::Pipeline::Seed::Build
.deployment_attributes_for(new_build, old_build.persisted_environment) .deployment_attributes_for(new_build, old_build.persisted_environment)
end end
def clone_deployment!(new_build, old_build)
return unless old_build.deployment.present?
# We should clone the previous deployment attributes instead of initializing
# new object with `Seed::Deployment`.
# See https://gitlab.com/gitlab-org/gitlab/-/issues/347206
deployment = ::Gitlab::Ci::Pipeline::Seed::Deployment
.new(new_build, old_build.persisted_environment).to_resource
return unless deployment
new_build.create_deployment!(deployment.attributes)
end
def create_deployment_in_separate_transaction?
strong_memoize(:create_deployment_in_separate_transaction) do
::Feature.enabled?(:create_deployment_in_separate_transaction, project, default_enabled: :yaml)
end
end
end end
end end
......
...@@ -317,7 +317,7 @@ RSpec.describe Ci::RetryBuildService do ...@@ -317,7 +317,7 @@ RSpec.describe Ci::RetryBuildService do
expect(build).to be_processed expect(build).to be_processed
end end
context 'when build with deployment is retried' do shared_examples_for 'when build with deployment is retried' do
let!(:build) do let!(:build) do
create(:ci_build, :with_deployment, :deploy_to_production, create(:ci_build, :with_deployment, :deploy_to_production,
pipeline: pipeline, stage_id: stage.id, project: project) pipeline: pipeline, stage_id: stage.id, project: project)
...@@ -336,7 +336,7 @@ RSpec.describe Ci::RetryBuildService do ...@@ -336,7 +336,7 @@ RSpec.describe Ci::RetryBuildService do
end end
end end
context 'when build with dynamic environment is retried' do shared_examples_for 'when build with dynamic environment is retried' do
let_it_be(:other_developer) { create(:user).tap { |u| project.add_developer(other_developer) } } let_it_be(:other_developer) { create(:user).tap { |u| project.add_developer(other_developer) } }
let(:environment_name) { 'review/$CI_COMMIT_REF_SLUG-$GITLAB_USER_ID' } let(:environment_name) { 'review/$CI_COMMIT_REF_SLUG-$GITLAB_USER_ID' }
...@@ -363,6 +363,18 @@ RSpec.describe Ci::RetryBuildService do ...@@ -363,6 +363,18 @@ RSpec.describe Ci::RetryBuildService do
end end
end end
it_behaves_like 'when build with deployment is retried'
it_behaves_like 'when build with dynamic environment is retried'
context 'when create_deployment_in_separate_transaction feature flag is disabled' do
before do
stub_feature_flags(create_deployment_in_separate_transaction: false)
end
it_behaves_like 'when build with deployment is retried'
it_behaves_like 'when build with dynamic environment is retried'
end
context 'when build has needs' do context 'when build has needs' do
before do before do
create(:ci_build_need, build: build, name: 'build1') create(:ci_build_need, build: build, name: 'build1')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment