From 892d5a81a74efb5a5fe15394080d91eb88addb7e Mon Sep 17 00:00:00 2001 From: Laura Montemayor Date: Thu, 18 Sep 2025 12:46:43 +0200 Subject: [PATCH] Check job options for expire_in in artifacts --- .../ci/job_artifacts/create_service.rb | 4 +- doc/ci/yaml/_index.md | 2 +- .../ci/job_artifacts/create_service_spec.rb | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/services/ci/job_artifacts/create_service.rb b/app/services/ci/job_artifacts/create_service.rb index ae131462e0906d..509787a31cd658 100644 --- a/app/services/ci/job_artifacts/create_service.rb +++ b/app/services/ci/job_artifacts/create_service.rb @@ -127,7 +127,9 @@ def build_metadata_artifact(job_artifact, metadata_file) end def expire_in(params) - params['expire_in'] || Gitlab::CurrentSettings.current_application_settings.default_artifacts_expire_in + params['expire_in'] || + job.options.dig(:artifacts, :expire_in) || + Gitlab::CurrentSettings.current_application_settings.default_artifacts_expire_in end def accessibility(params) diff --git a/doc/ci/yaml/_index.md b/doc/ci/yaml/_index.md index 59e73b3a310df0..1c32de35f845de 100644 --- a/doc/ci/yaml/_index.md +++ b/doc/ci/yaml/_index.md @@ -121,7 +121,7 @@ is not used. **Supported values**: These keywords can have custom defaults: - [`after_script`](#after_script) -- [`artifacts`](#artifacts), though due to [issue 404563](https://gitlab.com/gitlab-org/gitlab/-/issues/404563), the nested keyword `artifacts:expire_in` has no effect. +- [`artifacts`](#artifacts) - [`before_script`](#before_script) - [`cache`](#cache) - [`hooks`](#hooks) diff --git a/spec/services/ci/job_artifacts/create_service_spec.rb b/spec/services/ci/job_artifacts/create_service_spec.rb index 3912835ffd3912..70b1f5a4779cd1 100644 --- a/spec/services/ci/job_artifacts/create_service_spec.rb +++ b/spec/services/ci/job_artifacts/create_service_spec.rb @@ -287,6 +287,46 @@ expect(metadata_artifact.expire_at).to eq(expected_expire_at) end end + + context 'when expire_in is set in job options' do + let_it_be(:job) do + create(:ci_build, project: project, + options: { artifacts: { expire_in: '3 hours', paths: ['path1'] } }) + end + + it 'sets expiration date according to the job options' do + expected_expire_at = 3.hours.from_now + + expect(execute).to match(a_hash_including(status: :success, artifact: anything)) + archive_artifact, metadata_artifact = job.job_artifacts.last(2) + + expect(job.artifacts_expire_at).to be_within(1.minute).of(expected_expire_at) + expect(archive_artifact.expire_at).to be_within(1.minute).of(expected_expire_at) + expect(metadata_artifact.expire_at).to be_within(1.minute).of(expected_expire_at) + end + end + + context 'when `expire_in` is set in both params and job options' do + let(:job) do + create(:ci_build, project: project, + options: { artifacts: { expire_in: '3 hours', paths: ['path1'] } }) + end + + before do + params.merge!('expire_in' => '1 day') + end + + it 'prioritizes params `expire_in` over job options `expire_in`' do + expected_expire_at = 1.day.from_now + + expect(execute).to match(a_hash_including(status: :success, artifact: anything)) + archive_artifact, metadata_artifact = job.job_artifacts.last(2) + + expect(job.artifacts_expire_at).to be_within(1.minute).of(expected_expire_at) + expect(archive_artifact.expire_at).to be_within(1.minute).of(expected_expire_at) + expect(metadata_artifact.expire_at).to be_within(1.minute).of(expected_expire_at) + end + end end end -- GitLab