summaryrefslogtreecommitdiff
path: root/app/services/releases/create_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/releases/create_service.rb')
-rw-r--r--app/services/releases/create_service.rb33
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