diff options
Diffstat (limited to 'spec/models/ci/build_spec.rb')
-rw-r--r-- | spec/models/ci/build_spec.rb | 132 |
1 files changed, 96 insertions, 36 deletions
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 813b4b3faa6..c978e33bf54 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Build do +RSpec.describe Ci::Build, feature_category: :continuous_integration do include Ci::TemplateHelpers include AfterNextHelpers @@ -1754,8 +1754,8 @@ RSpec.describe Ci::Build do end end - describe '#starts_environment?' do - subject { build.starts_environment? } + describe '#deployment_job?' do + subject { build.deployment_job? } context 'when environment is defined' do before do @@ -2528,20 +2528,24 @@ RSpec.describe Ci::Build do end describe '#ref_slug' do - { - 'master' => 'master', - '1-foo' => '1-foo', - 'fix/1-foo' => 'fix-1-foo', - 'fix-1-foo' => 'fix-1-foo', - 'a' * 63 => 'a' * 63, - 'a' * 64 => 'a' * 63, - 'FOO' => 'foo', - '-' + 'a' * 61 + '-' => 'a' * 61, - '-' + 'a' * 62 + '-' => 'a' * 62, - '-' + 'a' * 63 + '-' => 'a' * 62, - 'a' * 62 + ' ' => 'a' * 62 - }.each do |ref, slug| - it "transforms #{ref} to #{slug}" do + using RSpec::Parameterized::TableSyntax + + where(:ref, :slug) do + 'master' | 'master' + '1-foo' | '1-foo' + 'fix/1-foo' | 'fix-1-foo' + 'fix-1-foo' | 'fix-1-foo' + 'a' * 63 | 'a' * 63 + 'a' * 64 | 'a' * 63 + 'FOO' | 'foo' + '-' + 'a' * 61 + '-' | 'a' * 61 + '-' + 'a' * 62 + '-' | 'a' * 62 + '-' + 'a' * 63 + '-' | 'a' * 62 + 'a' * 62 + ' ' | 'a' * 62 + end + + with_them do + it "transforms ref to slug" do build.ref = ref expect(build.ref_slug).to eq(slug) @@ -2737,6 +2741,7 @@ RSpec.describe Ci::Build do { key: 'CI_PROJECT_PATH', value: project.full_path, public: true, masked: false }, { key: 'CI_PROJECT_PATH_SLUG', value: project.full_path_slug, public: true, masked: false }, { key: 'CI_PROJECT_NAMESPACE', value: project.namespace.full_path, public: true, masked: false }, + { key: 'CI_PROJECT_NAMESPACE_ID', value: project.namespace.id.to_s, public: true, masked: false }, { key: 'CI_PROJECT_ROOT_NAMESPACE', value: project.namespace.root_ancestor.path, public: true, masked: false }, { key: 'CI_PROJECT_URL', value: project.web_url, public: true, masked: false }, { key: 'CI_PROJECT_VISIBILITY', value: 'private', public: true, masked: false }, @@ -2883,6 +2888,9 @@ RSpec.describe Ci::Build do value: 'var', public: true }] build.environment = 'staging' + + # CI_ENVIRONMENT_NAME is set in predefined_variables when job environment is provided + predefined_variables.insert(20, { key: 'CI_ENVIRONMENT_NAME', value: 'staging', public: true, masked: false }) end it 'matches explicit variables ordering' do @@ -3539,8 +3547,8 @@ RSpec.describe Ci::Build do rsa_key = OpenSSL::PKey::RSA.generate(3072).to_s stub_application_setting(ci_jwt_signing_key: rsa_key) build.metadata.update!(id_tokens: { - 'ID_TOKEN_1' => { id_token: { aud: 'developers' } }, - 'ID_TOKEN_2' => { id_token: { aud: 'maintainers' } } + 'ID_TOKEN_1' => { aud: 'developers' }, + 'ID_TOKEN_2' => { aud: 'maintainers' } }) end @@ -3817,22 +3825,6 @@ RSpec.describe Ci::Build do it 'assigns the token' do expect { build.enqueue }.to change(build, :token).from(nil).to(an_instance_of(String)) end - - context 'with ci_assign_job_token_on_scheduling disabled' do - before do - stub_feature_flags(ci_assign_job_token_on_scheduling: false) - end - - it 'assigns the token on creation' do - expect(build.token).to be_present - end - - it 'does not change the token when enqueuing' do - expect { build.enqueue }.not_to change(build, :token) - - expect(build).to be_pending - end - end end describe 'state transition: pending: :running' do @@ -5442,7 +5434,7 @@ RSpec.describe Ci::Build do it 'delegates to Ci::BuildTraceMetadata' do expect(Ci::BuildTraceMetadata) .to receive(:find_or_upsert_for!) - .with(build.id) + .with(build.id, build.partition_id) build.ensure_trace_metadata! end @@ -5617,4 +5609,72 @@ RSpec.describe Ci::Build do end end end + + describe '#runtime_hooks' do + let(:build1) do + FactoryBot.build(:ci_build, + options: { hooks: { pre_get_sources_script: ["echo 'hello pre_get_sources_script'"] } }) + end + + subject(:runtime_hooks) { build1.runtime_hooks } + + it 'returns an array of hook objects' do + expect(runtime_hooks.size).to eq(1) + expect(runtime_hooks[0].name).to eq('pre_get_sources_script') + expect(runtime_hooks[0].script).to eq(["echo 'hello pre_get_sources_script'"]) + end + end + + describe 'partitioning', :ci_partitionable do + include Ci::PartitioningHelpers + + let(:new_pipeline) { create(:ci_pipeline) } + let(:ci_build) { FactoryBot.build(:ci_build, pipeline: new_pipeline) } + + before do + stub_current_partition_id + end + + it 'assigns partition_id to job variables successfully', :aggregate_failures do + ci_build.job_variables_attributes = [ + { key: 'TEST_KEY', value: 'new value' }, + { key: 'NEW_KEY', value: 'exciting new value' } + ] + + ci_build.save! + + expect(ci_build.job_variables.count).to eq(2) + expect(ci_build.job_variables.first.partition_id).to eq(ci_testing_partition_id) + expect(ci_build.job_variables.second.partition_id).to eq(ci_testing_partition_id) + end + end + + describe 'assigning token', :ci_partitionable do + include Ci::PartitioningHelpers + + let(:new_pipeline) { create(:ci_pipeline) } + let(:ci_build) { create(:ci_build, pipeline: new_pipeline) } + + before do + stub_current_partition_id + end + + it 'includes partition_id as a token prefix' do + prefix = ci_build.token.split('_').first.to_i(16) + + expect(prefix).to eq(ci_testing_partition_id) + end + + context 'when ci_build_partition_id_token_prefix is disabled' do + before do + stub_feature_flags(ci_build_partition_id_token_prefix: false) + end + + it 'does not include partition_id as a token prefix' do + prefix = ci_build.token.split('_').first.to_i(16) + + expect(prefix).not_to eq(ci_testing_partition_id) + end + end + end end |