Skip to content

Commit

Permalink
fix: Atlantis Apply Fails on GitLab v16.10 When the Merge Request Bra…
Browse files Browse the repository at this point in the history
…nch Needs Rebasing (runatlantis#4402)
  • Loading branch information
X-Guardian authored and terakoya76 committed Dec 31, 2024
1 parent 5b0eae7 commit 7ee79cc
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 1 deletion.
12 changes: 11 additions & 1 deletion server/events/vcs/gitlab_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -355,18 +355,28 @@ func (g *GitlabClient) PullIsMergeable(logger logging.SimpleLogging, repo models
return false, err
}

if supportsDetailedMergeStatus {
logger.Debug("Detailed merge status: '%s'", mr.DetailedMergeStatus)
} else {
logger.Debug("Merge status: '%s'", mr.MergeStatus) //nolint:staticcheck // Need to reference deprecated field for backwards compatibility
}

if ((supportsDetailedMergeStatus &&
(mr.DetailedMergeStatus == "mergeable" ||
mr.DetailedMergeStatus == "ci_still_running" ||
mr.DetailedMergeStatus == "ci_must_pass")) ||
mr.DetailedMergeStatus == "ci_must_pass" ||
mr.DetailedMergeStatus == "need_rebase")) ||
(!supportsDetailedMergeStatus &&
mr.MergeStatus == "can_be_merged")) && //nolint:staticcheck // Need to reference deprecated field for backwards compatibility
mr.ApprovalsBeforeMerge <= 0 &&
mr.BlockingDiscussionsResolved &&
!mr.WorkInProgress &&
(allowSkippedPipeline || !isPipelineSkipped) {

logger.Debug("Merge request is mergeable")
return true, nil
}
logger.Debug("Merge request is not mergeable")
return false, nil
}

Expand Down
14 changes: 14 additions & 0 deletions server/events/vcs/gitlab_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ func TestGitlabClient_PullIsMergeable(t *testing.T) {
noHeadPipelineMR := 2
ciMustPassSuccessMR := 3
ciMustPassFailureMR := 4
needRebaseMR := 5

pipelineSuccess, err := os.ReadFile("testdata/gitlab-pipeline-success.json")
Ok(t, err)
Expand All @@ -368,6 +369,9 @@ func TestGitlabClient_PullIsMergeable(t *testing.T) {
detailedMergeStatusCiMustPass, err := os.ReadFile("testdata/gitlab-detailed-merge-status-ci-must-pass.json")
Ok(t, err)

detailedMergeStatusNeedRebase, err := os.ReadFile("testdata/gitlab-detailed-merge-status-need-rebase.json")
Ok(t, err)

headPipelineNotAvailable, err := os.ReadFile("testdata/gitlab-head-pipeline-not-available.json")
Ok(t, err)

Expand Down Expand Up @@ -427,6 +431,13 @@ func TestGitlabClient_PullIsMergeable(t *testing.T) {
ciMustPassFailureMR,
false,
},
{
fmt.Sprintf("%s/apply", vcsStatusName),
models.FailedCommitStatus,
gitlabServerVersions,
needRebaseMR,
true,
},
{
fmt.Sprintf("%s/apply: resource/default", vcsStatusName),
models.FailedCommitStatus,
Expand Down Expand Up @@ -491,6 +502,9 @@ func TestGitlabClient_PullIsMergeable(t *testing.T) {
case fmt.Sprintf("/api/v4/projects/runatlantis%%2Fatlantis/merge_requests/%v", ciMustPassFailureMR):
w.WriteHeader(http.StatusOK)
w.Write(detailedMergeStatusCiMustPass) // nolint: errcheck
case fmt.Sprintf("/api/v4/projects/runatlantis%%2Fatlantis/merge_requests/%v", needRebaseMR):
w.WriteHeader(http.StatusOK)
w.Write(detailedMergeStatusNeedRebase) // nolint: errcheck
case fmt.Sprintf("/api/v4/projects/%v", projectID):
w.WriteHeader(http.StatusOK)
w.Write(projectSuccess) // nolint: errcheck
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
{
"id": 22461274,
"iid": 13,
"project_id": 4580910,
"title": "Update main.tf",
"description": "",
"state": "opened",
"created_at": "2019-01-15T18:27:29.375Z",
"updated_at": "2019-01-25T17:28:01.437Z",
"merged_by": null,
"merged_at": null,
"closed_by": null,
"closed_at": null,
"target_branch": "patch-1",
"source_branch": "patch-1-merger",
"user_notes_count": 0,
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1755902,
"name": "Luke Kysow",
"username": "lkysow",
"state": "active",
"avatar_url": "https://secure.gravatar.com/avatar/25fd57e71590fe28736624ff24d41c5f?s=80&d=identicon",
"web_url": "https://gitlab.com/lkysow"
},
"assignee": null,
"reviewers": [],
"source_project_id": 4580910,
"target_project_id": 4580910,
"labels": [],
"work_in_progress": false,
"milestone": null,
"merge_when_pipeline_succeeds": false,
"merge_status": "can_be_merged",
"detailed_merge_status": "need_rebase",
"sha": "cb86d70f464632bdfbe1bb9bc0f2f9d847a774a0",
"merge_commit_sha": null,
"squash_commit_sha": null,
"discussion_locked": null,
"should_remove_source_branch": null,
"force_remove_source_branch": true,
"reference": "!13",
"references": {
"short": "!13",
"relative": "!13",
"full": "lkysow/atlantis-example!13"
},
"web_url": "https://gitlab.com/lkysow/atlantis-example/merge_requests/13",
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": true,
"task_completion_status": {
"count": 0,
"completed_count": 0
},
"has_conflicts": false,
"blocking_discussions_resolved": true,
"approvals_before_merge": null,
"subscribed": false,
"changes_count": "1",
"latest_build_started_at": "2019-01-15T18:27:29.375Z",
"latest_build_finished_at": "2019-01-25T17:28:01.437Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 488598,
"sha": "67cb91d3f6198189f433c045154a885784ba6977",
"ref": "patch-1-merger",
"status": "success",
"created_at": "2019-01-15T18:27:29.375Z",
"updated_at": "2019-01-25T17:28:01.437Z",
"web_url": "https://gitlab.com/lkysow/atlantis-example/-/pipelines/488598"
},
"head_pipeline": {
"id": 488598,
"sha": "67cb91d3f6198189f433c045154a885784ba6977",
"ref": "patch-1-merger",
"status": "success",
"created_at": "2019-01-15T18:27:29.375Z",
"updated_at": "2019-01-25T17:28:01.437Z",
"web_url": "https://gitlab.com/lkysow/atlantis-example/-/pipelines/488598",
"before_sha": "0000000000000000000000000000000000000000",
"tag": false,
"yaml_errors": null,
"user": {
"id": 1755902,
"name": "Luke Kysow",
"username": "lkysow",
"state": "active",
"avatar_url": "https://secure.gravatar.com/avatar/25fd57e71590fe28736624ff24d41c5f?s=80&d=identicon",
"web_url": "https://gitlab.com/lkysow"
},
"started_at": "2019-01-15T18:27:29.375Z",
"finished_at": "2019-01-25T17:28:01.437Z",
"committed_at": null,
"duration": 31,
"coverage": null,
"detailed_status": {
"icon": "status_success",
"text": "passed",
"label": "passed",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/lkysow/atlantis-example/-/pipelines/488598",
"illustration": null,
"favicon": "/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png"
}
},
"diff_refs": {
"base_sha": "67cb91d3f6198189f433c045154a885784ba6977",
"head_sha": "cb86d70f464632bdfbe1bb9bc0f2f9d847a774a0",
"start_sha": "67cb91d3f6198189f433c045154a885784ba6977"
},
"merge_error": null,
"first_contribution": false,
"user": {
"can_merge": true
}
}

0 comments on commit 7ee79cc

Please sign in to comment.