diff --git a/app/services/ci/job_artifacts/create_service.rb b/app/services/ci/job_artifacts/create_service.rb index ae131462e0906dd3e37d4813b130c055aed4e096..509787a31cd6588abc5a4544044e205a07ee1c39 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 59e73b3a310df09264cea8a4887716c24d4de299..1c32de35f845ded688ace706d76edb8e4b88d6ed 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 3912835ffd3912cd8cfab4d1d22bd909c7c79fcf..70b1f5a4779cd173435920e3a6adb33b928e63c0 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