diff options
Diffstat (limited to 'app/services/releases/create_service.rb')
-rw-r--r-- | app/services/releases/create_service.rb | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/app/services/releases/create_service.rb b/app/services/releases/create_service.rb index 81ca9d6d123..92a0b875dd4 100644 --- a/app/services/releases/create_service.rb +++ b/app/services/releases/create_service.rb @@ -9,11 +9,16 @@ module Releases return error('Release already exists', 409) if release return error("Milestone(s) not found: #{inexistent_milestones.join(', ')}", 400) if inexistent_milestones.any? + # should be found before the creation of new tag + # because tag creation can spawn new pipeline + # which won't have any data for evidence yet + evidence_pipeline = find_evidence_pipeline + tag = ensure_tag return tag unless tag.is_a?(Gitlab::Git::Tag) - create_release(tag) + create_release(tag, evidence_pipeline) end def find_or_build_release @@ -42,13 +47,15 @@ module Releases Ability.allowed?(current_user, :create_release, project) end - def create_release(tag) + def create_release(tag, evidence_pipeline) release = build_release(tag) release.save! notify_create_release(release) + create_evidence!(release, evidence_pipeline) + success(tag: tag, release: release) rescue => e error(e.message, 400) @@ -70,5 +77,27 @@ module Releases milestones: milestones ) end + + def find_evidence_pipeline + # TODO: remove this with the release creation moved to it's own form https://gitlab.com/gitlab-org/gitlab/-/issues/214245 + return params[:evidence_pipeline] if params[:evidence_pipeline] + + sha = existing_tag&.dereferenced_target&.sha + sha ||= repository.commit(ref)&.sha + + return unless sha + + project.ci_pipelines.for_sha(sha).last + end + + def create_evidence!(release, pipeline) + return if release.historical_release? + + if release.upcoming_release? + CreateEvidenceWorker.perform_at(release.released_at, release.id, pipeline&.id) + else + CreateEvidenceWorker.perform_async(release.id, pipeline&.id) + end + end end end |