Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/deployment_spec.rb')
-rw-r--r--spec/models/deployment_spec.rb572
1 files changed, 328 insertions, 244 deletions
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index 227ac69133b..639b149e2ae 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -648,163 +648,177 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
let!(:project) { create(:project, :repository) }
let!(:environment) { create(:environment, project: project) }
- context 'when there are no deployments and builds' do
- it do
- expect(subject_method(environment)).to eq(described_class.none)
+ shared_examples_for 'find last deployment group for environment' do
+ context 'when there are no deployments and jobs' do
+ it do
+ expect(subject_method(environment)).to eq(described_class.none)
+ end
end
- end
- context 'when there are no successful builds' do
- let(:pipeline) { create(:ci_pipeline, project: project) }
- let(:ci_build) { create(:ci_build, :running, project: project, pipeline: pipeline) }
+ context 'when there are no successful jobs' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:job) { create(factory_type, :created, project: project, pipeline: pipeline) }
- before do
- create(:deployment, :success, environment: environment, project: project, deployable: ci_build)
- end
+ before do
+ create(:deployment, :created, environment: environment, project: project, deployable: job)
+ end
- it do
- expect(subject_method(environment)).to eq(described_class.none)
+ it do
+ expect(subject_method(environment)).to eq(described_class.none)
+ end
end
- end
- context 'when there are deployments for multiple pipelines' do
- let(:pipeline_a) { create(:ci_pipeline, project: project) }
- let(:pipeline_b) { create(:ci_pipeline, project: project) }
- let(:ci_build_a) { create(:ci_build, :success, project: project, pipeline: pipeline_a) }
- let(:ci_build_b) { create(:ci_build, :failed, project: project, pipeline: pipeline_b) }
- let(:ci_build_c) { create(:ci_build, :success, project: project, pipeline: pipeline_a) }
- let(:ci_build_d) { create(:ci_build, :failed, project: project, pipeline: pipeline_a) }
+ context 'when there are deployments for multiple pipelines' do
+ let(:pipeline_a) { create(:ci_pipeline, project: project) }
+ let(:pipeline_b) { create(:ci_pipeline, project: project) }
+ let(:job_a) { create(factory_type, :success, project: project, pipeline: pipeline_a) }
+ let(:job_b) { create(factory_type, :failed, project: project, pipeline: pipeline_b) }
+ let(:job_c) { create(factory_type, :success, project: project, pipeline: pipeline_a) }
+ let(:job_d) { create(factory_type, :failed, project: project, pipeline: pipeline_a) }
+
+ # Successful deployments for pipeline_a
+ let!(:deployment_a) do
+ create(:deployment, :success, project: project, environment: environment, deployable: job_a)
+ end
- # Successful deployments for pipeline_a
- let!(:deployment_a) do
- create(:deployment, :success, project: project, environment: environment, deployable: ci_build_a)
- end
+ let!(:deployment_b) do
+ create(:deployment, :success, project: project, environment: environment, deployable: job_c)
+ end
- let!(:deployment_b) do
- create(:deployment, :success, project: project, environment: environment, deployable: ci_build_c)
- end
+ before do
+ # Failed deployment for pipeline_a
+ create(:deployment, :failed, project: project, environment: environment, deployable: job_d)
- before do
- # Failed deployment for pipeline_a
- create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_d)
+ # Failed deployment for pipeline_b
+ create(:deployment, :failed, project: project, environment: environment, deployable: job_b)
+ end
- # Failed deployment for pipeline_b
- create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_b)
+ it 'returns the successful deployment jobs for the last deployment pipeline' do
+ expect(subject_method(environment).pluck(:id)).to contain_exactly(deployment_a.id, deployment_b.id)
+ end
end
- it 'returns the successful deployment jobs for the last deployment pipeline' do
- expect(subject_method(environment).pluck(:id)).to contain_exactly(deployment_a.id, deployment_b.id)
- end
- end
+ context 'when there are many environments' do
+ let(:environment_b) { create(:environment, project: project) }
+
+ let(:pipeline_a) { create(:ci_pipeline, project: project) }
+ let(:pipeline_b) { create(:ci_pipeline, project: project) }
+ let(:pipeline_c) { create(:ci_pipeline, project: project) }
+ let(:pipeline_d) { create(:ci_pipeline, project: project) }
+
+ # Builds for first environment: 'environment' with pipeline_a and pipeline_b
+ let(:job_a) { create(factory_type, :success, project: project, pipeline: pipeline_a) }
+ let(:job_b) { create(factory_type, :failed, project: project, pipeline: pipeline_b) }
+ let(:job_c) { create(factory_type, :success, project: project, pipeline: pipeline_a) }
+ let(:job_d) { create(factory_type, :failed, project: project, pipeline: pipeline_a) }
+ let!(:stop_env_a) do
+ create(factory_type, :manual, project: project, pipeline: pipeline_a, name: 'stop_env_a')
+ end
- context 'when there are many environments' do
- let(:environment_b) { create(:environment, project: project) }
+ # Builds for second environment: 'environment_b' with pipeline_c and pipeline_d
+ let(:job_e) { create(factory_type, :success, project: project, pipeline: pipeline_c) }
+ let(:job_f) { create(factory_type, :failed, project: project, pipeline: pipeline_d) }
+ let(:job_g) { create(factory_type, :success, project: project, pipeline: pipeline_c) }
+ let(:job_h) { create(factory_type, :failed, project: project, pipeline: pipeline_c) }
+ let!(:stop_env_b) do
+ create(factory_type, :manual, project: project, pipeline: pipeline_c, name: 'stop_env_b')
+ end
- let(:pipeline_a) { create(:ci_pipeline, project: project) }
- let(:pipeline_b) { create(:ci_pipeline, project: project) }
- let(:pipeline_c) { create(:ci_pipeline, project: project) }
- let(:pipeline_d) { create(:ci_pipeline, project: project) }
+ # Successful deployments for 'environment' from pipeline_a
+ let!(:deployment_a) do
+ create(:deployment, :success, project: project, environment: environment, deployable: job_a)
+ end
- # Builds for first environment: 'environment' with pipeline_a and pipeline_b
- let(:ci_build_a) { create(:ci_build, :success, project: project, pipeline: pipeline_a) }
- let(:ci_build_b) { create(:ci_build, :failed, project: project, pipeline: pipeline_b) }
- let(:ci_build_c) { create(:ci_build, :success, project: project, pipeline: pipeline_a) }
- let(:ci_build_d) { create(:ci_build, :failed, project: project, pipeline: pipeline_a) }
- let!(:stop_env_a) { create(:ci_build, :manual, project: project, pipeline: pipeline_a, name: 'stop_env_a') }
+ let!(:deployment_b) do
+ create(:deployment, :success,
+ project: project, environment: environment, deployable: job_c, on_stop: 'stop_env_a')
+ end
- # Builds for second environment: 'environment_b' with pipeline_c and pipeline_d
- let(:ci_build_e) { create(:ci_build, :success, project: project, pipeline: pipeline_c) }
- let(:ci_build_f) { create(:ci_build, :failed, project: project, pipeline: pipeline_d) }
- let(:ci_build_g) { create(:ci_build, :success, project: project, pipeline: pipeline_c) }
- let(:ci_build_h) { create(:ci_build, :failed, project: project, pipeline: pipeline_c) }
- let!(:stop_env_b) { create(:ci_build, :manual, project: project, pipeline: pipeline_c, name: 'stop_env_b') }
+ # Successful deployments for 'environment_b' from pipeline_c
+ let!(:deployment_c) do
+ create(:deployment, :success, project: project, environment: environment_b, deployable: job_e)
+ end
- # Successful deployments for 'environment' from pipeline_a
- let!(:deployment_a) do
- create(:deployment, :success, project: project, environment: environment, deployable: ci_build_a)
- end
+ let!(:deployment_d) do
+ create(:deployment, :success,
+ project: project, environment: environment_b, deployable: job_g, on_stop: 'stop_env_b')
+ end
- let!(:deployment_b) do
- create(:deployment, :success,
- project: project, environment: environment, deployable: ci_build_c, on_stop: 'stop_env_a')
- end
+ before do
+ # Failed deployment for 'environment' from pipeline_a and pipeline_b
+ create(:deployment, :failed, project: project, environment: environment, deployable: job_d)
+ create(:deployment, :failed, project: project, environment: environment, deployable: job_b)
- # Successful deployments for 'environment_b' from pipeline_c
- let!(:deployment_c) do
- create(:deployment, :success, project: project, environment: environment_b, deployable: ci_build_e)
- end
+ # Failed deployment for 'environment_b' from pipeline_c and pipeline_d
+ create(:deployment, :failed, project: project, environment: environment_b, deployable: job_h)
+ create(:deployment, :failed, project: project, environment: environment_b, deployable: job_f)
+ end
- let!(:deployment_d) do
- create(:deployment, :success,
- project: project, environment: environment_b, deployable: ci_build_g, on_stop: 'stop_env_b')
- end
+ it 'batch loads for environments' do
+ environments = [environment, environment_b]
- before do
- # Failed deployment for 'environment' from pipeline_a and pipeline_b
- create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_d)
- create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_b)
+ # Loads Batch loader
+ environments.each do |env|
+ subject_method(env)
+ end
- # Failed deployment for 'environment_b' from pipeline_c and pipeline_d
- create(:deployment, :failed, project: project, environment: environment_b, deployable: ci_build_h)
- create(:deployment, :failed, project: project, environment: environment_b, deployable: ci_build_f)
- end
+ expect(subject_method(environments.first).pluck(:id))
+ .to contain_exactly(deployment_a.id, deployment_b.id)
- it 'batch loads for environments' do
- environments = [environment, environment_b]
+ expect { subject_method(environments.second).pluck(:id) }.not_to exceed_query_limit(0)
- # Loads Batch loader
- environments.each do |env|
- subject_method(env)
- end
+ expect(subject_method(environments.second).pluck(:id))
+ .to contain_exactly(deployment_c.id, deployment_d.id)
- expect(subject_method(environments.first).pluck(:id))
- .to contain_exactly(deployment_a.id, deployment_b.id)
+ expect(subject_method(environments.first).map(&:stop_action).compact)
+ .to contain_exactly(stop_env_a)
- expect { subject_method(environments.second).pluck(:id) }.not_to exceed_query_limit(0)
+ expect { subject_method(environments.second).map(&:stop_action) }
+ .not_to exceed_query_limit(0)
- expect(subject_method(environments.second).pluck(:id))
- .to contain_exactly(deployment_c.id, deployment_d.id)
+ expect(subject_method(environments.second).map(&:stop_action).compact)
+ .to contain_exactly(stop_env_b)
+ end
+ end
- expect(subject_method(environments.first).map(&:stop_action).compact)
- .to contain_exactly(stop_env_a)
+ context 'When last deployment for environment is a retried job' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:environment_b) { create(:environment, project: project) }
- expect { subject_method(environments.second).map(&:stop_action) }
- .not_to exceed_query_limit(0)
+ let(:job_a) do
+ create(factory_type, :success, project: project, pipeline: pipeline, environment: environment.name)
+ end
- expect(subject_method(environments.second).map(&:stop_action).compact)
- .to contain_exactly(stop_env_b)
- end
- end
+ let(:job_b) do
+ create(factory_type, :success, project: project, pipeline: pipeline, environment: environment_b.name)
+ end
- context 'When last deployment for environment is a retried build' do
- let(:pipeline) { create(:ci_pipeline, project: project) }
- let(:environment_b) { create(:environment, project: project) }
+ let!(:deployment_a) do
+ create(:deployment, :success, project: project, environment: environment, deployable: job_a)
+ end
- let(:build_a) do
- create(:ci_build, :success, project: project, pipeline: pipeline, environment: environment.name)
- end
+ let!(:deployment_b) do
+ create(:deployment, :success, project: project, environment: environment_b, deployable: job_b)
+ end
- let(:build_b) do
- create(:ci_build, :success, project: project, pipeline: pipeline, environment: environment_b.name)
- end
+ before do
+ # Retry job_b
+ job_b.update!(retried: true)
- let!(:deployment_a) do
- create(:deployment, :success, project: project, environment: environment, deployable: build_a)
- end
+ # New successful job after retry.
+ create(factory_type, :success, project: project, pipeline: pipeline, environment: environment_b.name)
+ end
- let!(:deployment_b) do
- create(:deployment, :success, project: project, environment: environment_b, deployable: build_b)
+ it { expect(subject_method(environment_b)).not_to be_nil }
end
+ end
- before do
- # Retry build_b
- build_b.update!(retried: true)
-
- # New successful build after retry.
- create(:ci_build, :success, project: project, pipeline: pipeline, environment: environment_b.name)
- end
+ it_behaves_like 'find last deployment group for environment' do
+ let(:factory_type) { :ci_build }
+ end
- it { expect(subject_method(environment_b)).not_to be_nil }
+ it_behaves_like 'find last deployment group for environment' do
+ let(:factory_type) { :ci_bridge }
end
end
end
@@ -873,31 +887,41 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
describe '#stop_action' do
- let(:build) { create(:ci_build) }
-
subject { deployment.stop_action }
- context 'when no other actions' do
- let(:deployment) { FactoryBot.build(:deployment, deployable: build) }
-
- it { is_expected.to be_nil }
- end
-
- context 'with other actions' do
- let!(:close_action) { create(:ci_build, :manual, pipeline: build.pipeline, name: 'close_app') }
+ shared_examples_for 'stop action for a job' do
+ let(:job) { create(factory_type) } # rubocop:disable Rails/SaveBang
- context 'when matching action is defined' do
- let(:deployment) { FactoryBot.build(:deployment, deployable: build, on_stop: 'close_other_app') }
+ context 'when no other actions' do
+ let(:deployment) { FactoryBot.build(:deployment, deployable: job) }
it { is_expected.to be_nil }
end
- context 'when no matching action is defined' do
- let(:deployment) { FactoryBot.build(:deployment, deployable: build, on_stop: 'close_app') }
+ context 'with other actions' do
+ let!(:close_action) { create(factory_type, :manual, pipeline: job.pipeline, name: 'close_app') }
- it { is_expected.to eq(close_action) }
+ context 'when matching action is defined' do
+ let(:deployment) { FactoryBot.build(:deployment, deployable: job, on_stop: 'close_other_app') }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when no matching action is defined' do
+ let(:deployment) { FactoryBot.build(:deployment, deployable: job, on_stop: 'close_app') }
+
+ it { is_expected.to eq(close_action) }
+ end
end
end
+
+ it_behaves_like 'stop action for a job' do
+ let(:factory_type) { :ci_build }
+ end
+
+ it_behaves_like 'stop action for a job' do
+ let(:factory_type) { :ci_bridge }
+ end
end
describe '#deployed_by' do
@@ -908,10 +932,18 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
expect(deployment.deployed_by).to eq(deployment_user)
end
- it 'returns the deployment user if the deployable have no user' do
+ it 'returns the deployment user if the deployable is build and have no user' do
deployment_user = create(:user)
- build = create(:ci_build, user: nil)
- deployment = create(:deployment, deployable: build, user: deployment_user)
+ job = create(:ci_build, user: nil)
+ deployment = create(:deployment, deployable: job, user: deployment_user)
+
+ expect(deployment.deployed_by).to eq(deployment_user)
+ end
+
+ it 'returns the deployment user if the deployable is bridge and have no user' do
+ deployment_user = create(:user)
+ job = create(:ci_bridge, user: nil)
+ deployment = create(:deployment, deployable: job, user: deployment_user)
expect(deployment.deployed_by).to eq(deployment_user)
end
@@ -919,8 +951,8 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
it 'returns the deployable user if there is one' do
build_user = create(:user)
deployment_user = create(:user)
- build = create(:ci_build, user: build_user)
- deployment = create(:deployment, deployable: build, user: deployment_user)
+ job = create(:ci_build, user: build_user)
+ deployment = create(:deployment, deployable: job, user: deployment_user)
expect(deployment.deployed_by).to eq(build_user)
end
@@ -954,14 +986,14 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
end
- describe '.builds' do
+ describe '.jobs' do
let!(:deployment1) { create(:deployment) }
let!(:deployment2) { create(:deployment) }
let!(:deployment3) { create(:deployment) }
- subject { described_class.builds }
+ subject { described_class.jobs }
- it 'retrieves builds for the deployments' do
+ it 'retrieves jobs for the deployments' do
is_expected.to match_array(
[deployment1.deployable, deployment2.deployable, deployment3.deployable])
end
@@ -974,16 +1006,16 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
end
- describe '#build' do
+ describe '#job' do
let!(:deployment) { create(:deployment) }
- subject { deployment.build }
+ subject { deployment.job }
- it 'retrieves build for the deployment' do
+ it 'retrieves job for the deployment' do
is_expected.to eq(deployment.deployable)
end
- it 'returns nil when the associated build is not found' do
+ it 'returns nil when the associated job is not found' do
deployment.update!(deployable_id: nil, deployable_type: nil)
is_expected.to be_nil
@@ -1088,22 +1120,30 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
end
- describe '#playable_build' do
- subject { deployment.playable_build }
+ describe '#playable_job' do
+ subject { deployment.playable_job }
+
+ context 'when there is a deployable job' do
+ let(:deployment) { create(:deployment, deployable: job) }
- context 'when there is a deployable build' do
- let(:deployment) { create(:deployment, deployable: build) }
+ context 'when the deployable job is build and playable' do
+ let(:job) { create(:ci_build, :playable) }
+
+ it 'returns that job' do
+ is_expected.to eq(job)
+ end
+ end
- context 'when the deployable build is playable' do
- let(:build) { create(:ci_build, :playable) }
+ context 'when the deployable job is bridge and playable' do
+ let(:job) { create(:ci_bridge, :playable) }
- it 'returns that build' do
- is_expected.to eq(build)
+ it 'returns that job' do
+ is_expected.to eq(job)
end
end
- context 'when the deployable build is not playable' do
- let(:build) { create(:ci_build) }
+ context 'when the deployable job is not playable' do
+ let(:job) { create(:ci_build) }
it 'returns nil' do
is_expected.to be_nil
@@ -1111,7 +1151,7 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
end
- context 'when there is no deployable build' do
+ context 'when there is no deployable job' do
let(:deployment) { create(:deployment) }
it 'returns nil' do
@@ -1207,144 +1247,180 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
describe '#sync_status_with' do
- subject { deployment.sync_status_with(ci_build) }
+ subject { deployment.sync_status_with(job) }
let_it_be(:project) { create(:project, :repository) }
- let(:deployment) { create(:deployment, project: project, status: deployment_status) }
- let(:ci_build) { create(:ci_build, project: project, status: build_status) }
+ shared_examples_for 'sync status with a job' do
+ let(:deployment) { create(:deployment, project: project, status: deployment_status) }
+ let(:job) { create(factory_type, project: project, status: job_status) }
+
+ shared_examples_for 'synchronizing deployment' do
+ let(:expected_deployment_status) { job_status.to_s }
- shared_examples_for 'synchronizing deployment' do
- it 'changes deployment status' do
- expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+ it 'changes deployment status' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
- is_expected.to eq(true)
+ is_expected.to eq(true)
- expect(deployment.status).to eq(build_status.to_s)
- expect(deployment.errors).to be_empty
+ expect(deployment.status).to eq(expected_deployment_status)
+ expect(deployment.errors).to be_empty
+ end
end
- end
- shared_examples_for 'gracefully handling error' do
- it 'tracks an exception' do
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
- instance_of(described_class::StatusSyncError),
- deployment_id: deployment.id,
- build_id: ci_build.id)
+ shared_examples_for 'gracefully handling error' do
+ it 'tracks an exception' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
+ instance_of(described_class::StatusSyncError),
+ deployment_id: deployment.id,
+ job_id: job.id)
- is_expected.to eq(false)
+ is_expected.to eq(false)
- expect(deployment.status).to eq(deployment_status.to_s)
- expect(deployment.errors.full_messages).to include(error_message)
+ expect(deployment.status).to eq(deployment_status.to_s)
+ expect(deployment.errors.full_messages).to include(error_message)
+ end
end
- end
- shared_examples_for 'ignoring build' do
- it 'does not change deployment status' do
- expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+ shared_examples_for 'ignoring job' do
+ it 'does not change deployment status' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
- is_expected.to eq(false)
+ is_expected.to eq(false)
- expect(deployment.status).to eq(deployment_status.to_s)
- expect(deployment.errors).to be_empty
+ expect(deployment.status).to eq(deployment_status.to_s)
+ expect(deployment.errors).to be_empty
+ end
end
- end
- context 'with created deployment' do
- let(:deployment_status) { :created }
+ context 'with created deployment' do
+ let(:deployment_status) { :created }
- context 'with created build' do
- let(:build_status) { :created }
+ context 'with created job' do
+ let(:job_status) { :created }
- it_behaves_like 'ignoring build'
- end
+ it_behaves_like 'ignoring job'
+ end
- context 'with running build' do
- let(:build_status) { :running }
+ context 'with manual job' do
+ let(:job_status) { :manual }
- it_behaves_like 'synchronizing deployment'
- end
+ it_behaves_like 'synchronizing deployment' do
+ let(:expected_deployment_status) { 'blocked' }
+ end
+ end
- context 'with finished build' do
- let(:build_status) { :success }
+ context 'with running job' do
+ let(:job_status) { :running }
- it_behaves_like 'synchronizing deployment'
- end
+ it_behaves_like 'synchronizing deployment'
+ end
- context 'with unrelated build' do
- let(:build_status) { :waiting_for_resource }
+ context 'with finished job' do
+ let(:job_status) { :success }
- it_behaves_like 'ignoring build'
+ it_behaves_like 'synchronizing deployment'
+ end
+
+ context 'with unrelated job' do
+ let(:job_status) { :waiting_for_resource }
+
+ it_behaves_like 'ignoring job'
+ end
end
- end
- context 'with running deployment' do
- let(:deployment_status) { :running }
+ context 'with running deployment' do
+ let(:deployment_status) { :running }
- context 'with created build' do
- let(:build_status) { :created }
+ context 'with created job' do
+ let(:job_status) { :created }
- it_behaves_like 'gracefully handling error' do
- let(:error_message) { %{Status cannot transition via \"create\"} }
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %{Status cannot transition via \"create\"} }
+ end
end
- end
- context 'with running build' do
- let(:build_status) { :running }
+ context 'with manual job' do
+ let(:job_status) { :manual }
- it_behaves_like 'ignoring build'
- end
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %{Status cannot transition via \"block\"} }
+ end
+ end
- context 'with finished build' do
- let(:build_status) { :success }
+ context 'with running job' do
+ let(:job_status) { :running }
- it_behaves_like 'synchronizing deployment'
- end
+ it_behaves_like 'ignoring job'
+ end
- context 'with unrelated build' do
- let(:build_status) { :waiting_for_resource }
+ context 'with finished job' do
+ let(:job_status) { :success }
- it_behaves_like 'ignoring build'
+ it_behaves_like 'synchronizing deployment'
+ end
+
+ context 'with unrelated job' do
+ let(:job_status) { :waiting_for_resource }
+
+ it_behaves_like 'ignoring job'
+ end
end
- end
- context 'with finished deployment' do
- let(:deployment_status) { :success }
+ context 'with finished deployment' do
+ let(:deployment_status) { :success }
- context 'with created build' do
- let(:build_status) { :created }
+ context 'with created job' do
+ let(:job_status) { :created }
- it_behaves_like 'gracefully handling error' do
- let(:error_message) { %{Status cannot transition via \"create\"} }
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %{Status cannot transition via \"create\"} }
+ end
end
- end
- context 'with running build' do
- let(:build_status) { :running }
+ context 'with manual job' do
+ let(:job_status) { :manual }
- it_behaves_like 'gracefully handling error' do
- let(:error_message) { %{Status cannot transition via \"run\"} }
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %{Status cannot transition via \"block\"} }
+ end
end
- end
- context 'with finished build' do
- let(:build_status) { :success }
+ context 'with running job' do
+ let(:job_status) { :running }
- it_behaves_like 'ignoring build'
- end
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %{Status cannot transition via \"run\"} }
+ end
+ end
- context 'with failed build' do
- let(:build_status) { :failed }
+ context 'with finished job' do
+ let(:job_status) { :success }
- it_behaves_like 'synchronizing deployment'
- end
+ it_behaves_like 'ignoring job'
+ end
+
+ context 'with failed job' do
+ let(:job_status) { :failed }
- context 'with unrelated build' do
- let(:build_status) { :waiting_for_resource }
+ it_behaves_like 'synchronizing deployment'
+ end
+
+ context 'with unrelated job' do
+ let(:job_status) { :waiting_for_resource }
- it_behaves_like 'ignoring build'
+ it_behaves_like 'ignoring job'
+ end
end
end
+
+ it_behaves_like 'sync status with a job' do
+ let(:factory_type) { :ci_build }
+ end
+
+ it_behaves_like 'sync status with a job' do
+ let(:factory_type) { :ci_bridge }
+ end
end
describe '#tags' do
@@ -1417,6 +1493,14 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
expect(subject.tier_in_yaml).to eq('testing')
end
+ context 'when deployable is a bridge job' do
+ let(:deployable) { create(:ci_bridge, :success, :environment_with_deployment_tier) }
+
+ it 'returns the tier' do
+ expect(subject.tier_in_yaml).to eq('testing')
+ end
+ end
+
context 'when tier is not specified' do
let(:deployable) { create(:ci_build, :success) }