diff options
Diffstat (limited to 'app/services/deployments/link_merge_requests_service.rb')
-rw-r--r-- | app/services/deployments/link_merge_requests_service.rb | 28 |
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 |