summaryrefslogtreecommitdiff
path: root/app/services/deployments/link_merge_requests_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/deployments/link_merge_requests_service.rb')
-rw-r--r--app/services/deployments/link_merge_requests_service.rb28
1 files changed, 25 insertions, 3 deletions
diff --git a/app/services/deployments/link_merge_requests_service.rb b/app/services/deployments/link_merge_requests_service.rb
index eba5082e6c3..39fbef5dee2 100644
--- a/app/services/deployments/link_merge_requests_service.rb
+++ b/app/services/deployments/link_merge_requests_service.rb
@@ -18,7 +18,22 @@ module Deployments
# app deployments, as this is not useful.
return if deployment.environment.environment_type
- if (prev = deployment.previous_environment_deployment)
+ # This service is triggered by a Sidekiq worker, which only runs when a
+ # deployment is successful. We add an extra check here in case we ever
+ # call this service elsewhere and forget to check the status there.
+ #
+ # The reason we only want to link successful deployments is as follows:
+ # when we link a merge request, we don't link it to future deployments for
+ # the same environment. If we were to link an MR to a failed deploy, we
+ # wouldn't be able to later on link it to a successful deploy (e.g. after
+ # the deploy is retried).
+ #
+ # In addition, showing failed deploys in the UI of a merge request isn't
+ # useful to users, as they can't act upon the information in any
+ # meaningful way (i.e. they can't just retry the deploy themselves).
+ return unless deployment.success?
+
+ if (prev = deployment.previous_deployment)
link_merge_requests_for_range(prev.sha, deployment.sha)
else
# When no previous deployment is found we fall back to linking all merge
@@ -51,8 +66,15 @@ module Deployments
deployment.link_merge_requests(merge_requests)
- picked_merge_requests =
- project.merge_requests.by_cherry_pick_sha(slice)
+ # The cherry picked commits are tracked via `notes.commit_id`
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22209
+ #
+ # NOTE: cross-joining `merge_requests` table and `notes` table could
+ # result in very poor performance because PG planner often uses an
+ # inappropriate index.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/321032.
+ mr_ids = project.notes.cherry_picked_merge_requests(slice)
+ picked_merge_requests = project.merge_requests.id_in(mr_ids)
deployment.link_merge_requests(picked_merge_requests)
end