Skip to content

Commit 8ac050c

Browse files
authored
fix gitlab pr event flow (#1655)
1 parent 1f40c8c commit 8ac050c

File tree

4 files changed

+100
-114
lines changed

4 files changed

+100
-114
lines changed

backend/utils/gitlab.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func GetGitlabService(gh GitlabProvider, projectId int, repoName string, repoFul
4545
service := orchestrator_gitlab.GitLabService{Client: client, Context: &context}
4646
return &service, nil
4747
}
48+
4849
func GetDiggerConfigForBranch(gh GitlabProvider, projectId int, repoFullName string, repoOwner string, repoName string, cloneUrl string, branch string, prNumber int, discussionId string) (string, *dg_configuration.DiggerConfig, graph.Graph[string, dg_configuration.Project], error) {
4950
token := os.Getenv("DIGGER_GITLAB_ACCESS_TOKEN")
5051

ee/backend/controllers/gitlab.go

Lines changed: 93 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -194,19 +194,30 @@ func handlePullRequestEvent(gitlabProvider utils.GitlabProvider, payload *gitlab
194194
prNumber := payload.ObjectAttributes.IID
195195
isDraft := payload.ObjectAttributes.WorkInProgress
196196
branch := payload.ObjectAttributes.SourceBranch
197-
//commitSha := payload.ObjectAttributes.MergeCommitSHA
197+
commitSha := payload.ObjectAttributes.LastCommit.ID
198198
//defaultBranch := payload.Repository.DefaultBranch
199199
//actor := payload.User.Username
200-
discussionId := ""
200+
//discussionId := ""
201201
//action := payload.ObjectAttributes.Action
202202

203-
glService, glerr := utils.GetGitlabService(gitlabProvider, projectId, repoName, repoFullName, prNumber, discussionId)
203+
// temp hack: we initialize glService to publish an initial comment and then use that as a discussionId onwards (
204+
glService, glerr := utils.GetGitlabService(gitlabProvider, projectId, repoName, repoFullName, prNumber, "")
204205
if glerr != nil {
205206
log.Printf("GetGithubService error: %v", glerr)
206207
return fmt.Errorf("error getting ghService to post error comment")
207208
}
209+
comment, err := glService.PublishComment(prNumber, fmt.Sprintf("Report for pull request (%v)", commitSha))
210+
discussionId := comment.DiscussionId
208211

209-
_, config, projectsGraph, err := utils.GetDiggerConfigForBranch(gitlabProvider, projectId, repoFullName, repoOwner, repoName, cloneURL, branch, prNumber, discussionId)
212+
log.Printf("got first discussion id: %v", discussionId)
213+
// re-initialize with the right discussion ID
214+
glService, glerr = utils.GetGitlabService(gitlabProvider, projectId, repoName, repoFullName, prNumber, discussionId)
215+
if glerr != nil {
216+
log.Printf("GetGithubService error: %v", glerr)
217+
return fmt.Errorf("error getting ghService to post error comment")
218+
}
219+
220+
diggeryamlStr, config, projectsGraph, err := utils.GetDiggerConfigForBranch(gitlabProvider, projectId, repoFullName, repoOwner, repoName, cloneURL, branch, prNumber, discussionId)
210221
if err != nil {
211222
log.Printf("getDiggerConfigForPR error: %v", err)
212223
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: Could not load digger config, error: %v", err))
@@ -281,112 +292,85 @@ func handlePullRequestEvent(gitlabProvider utils.GitlabProvider, payload *gitlab
281292
return nil
282293
}
283294

284-
//if !config.AllowDraftPRs && isDraft {
285-
// log.Printf("Draft PRs are disabled, skipping PR: %v", prNumber)
286-
// return nil
287-
//}
288-
//
289-
//commentReporter, err := utils.InitCommentReporter(glService, prNumber, ":construction_worker: Digger starting...")
290-
//if err != nil {
291-
// log.Printf("Error initializing comment reporter: %v", err)
292-
// return fmt.Errorf("error initializing comment reporter")
293-
//}
294-
//
295-
//err = utils.ReportInitialJobsStatus(commentReporter, jobsForImpactedProjects)
296-
//if err != nil {
297-
// log.Printf("Failed to comment initial status for jobs: %v", err)
298-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: Failed to comment initial status for jobs: %v", err))
299-
// return fmt.Errorf("failed to comment initial status for jobs")
300-
//}
301-
//
302-
//err = utils.SetPRStatusForJobs(glService, prNumber, jobsForImpactedProjects)
303-
//if err != nil {
304-
// log.Printf("error setting status for PR: %v", err)
305-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: error setting status for PR: %v", err))
306-
// fmt.Errorf("error setting status for PR: %v", err)
307-
//}
308-
//
309-
//impactedProjectsMap := make(map[string]dg_configuration.Project)
310-
//for _, p := range impactedProjects {
311-
// impactedProjectsMap[p.Name] = p
312-
//}
313-
//
314-
//impactedJobsMap := make(map[string]scheduler.Job)
315-
//for _, j := range jobsForImpactedProjects {
316-
// impactedJobsMap[j.ProjectName] = j
317-
//}
318-
//
319-
//commentId, err := strconv.ParseInt(commentReporter.CommentId, 10, 64)
320-
//if err != nil {
321-
// log.Printf("strconv.ParseInt error: %v", err)
322-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: could not handle commentId: %v", err))
323-
//}
324-
//batchId, _, err := utils.ConvertJobsToDiggerJobs(*diggerCommand, models.DiggerVCSGitlab, organisationId, impactedJobsMap, impactedProjectsMap, projectsGraph, 0, branch, prNumber, repoOwner, repoName, repoFullName, commitSha, commentId, diggerYmlStr)
325-
//if err != nil {
326-
// log.Printf("ConvertJobsToDiggerJobs error: %v", err)
327-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: ConvertJobsToDiggerJobs error: %v", err))
328-
// return fmt.Errorf("error converting jobs")
329-
//}
330-
//
331-
//if config.CommentRenderMode == dg_configuration.CommentRenderModeGroupByModule {
332-
// sourceDetails, err := comment_updater.PostInitialSourceComments(glService, prNumber, impactedProjectsSourceMapping)
333-
// if err != nil {
334-
// log.Printf("PostInitialSourceComments error: %v", err)
335-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: PostInitialSourceComments error: %v", err))
336-
// return fmt.Errorf("error posting initial comments")
337-
// }
338-
// batch, err := models.DB.GetDiggerBatch(batchId)
339-
// if err != nil {
340-
// log.Printf("GetDiggerBatch error: %v", err)
341-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: PostInitialSourceComments error: %v", err))
342-
// return fmt.Errorf("error getting digger batch")
343-
// }
344-
// batch.SourceDetails, err = json.Marshal(sourceDetails)
345-
// if err != nil {
346-
// log.Printf("sourceDetails, json Marshal error: %v", err)
347-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: json Marshal error: %v", err))
348-
// return fmt.Errorf("error marshalling sourceDetails")
349-
// }
350-
// err = models.DB.UpdateDiggerBatch(batch)
351-
// if err != nil {
352-
// log.Printf("UpdateDiggerBatch error: %v", err)
353-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: UpdateDiggerBatch error: %v", err))
354-
// return fmt.Errorf("error updating digger batch")
355-
// }
356-
//}
295+
if !config.AllowDraftPRs && isDraft {
296+
log.Printf("Draft PRs are disabled, skipping PR: %v", prNumber)
297+
return nil
298+
}
357299

358-
//segment.Track(strconv.Itoa(int(organisationId)), "backend_trigger_job")
359-
//
360-
//ciBackend, err := ciBackendProvider.GetCiBackend(
361-
// ci_backends.CiBackendOptions{
362-
// RepoName: repoName,
363-
// RepoOwner: repoOwner,
364-
// RepoFullName: repoFullName,
365-
// GitlabProjectId: projectId,
366-
// GitlabCIMergeRequestID: payload.ObjectAttributes.ID,
367-
// GitlabCIMergeRequestIID: payload.ObjectAttributes.IID,
368-
// GitlabciprojectId: payload.Project.ID,
369-
// GitlabciprojectNamespace: payload.Project.Namespace,
370-
// //GitlabciprojectNamespaceId: 0,
371-
// GitlabmergeRequestEventName: payload.EventType,
372-
// //GitlabCIPipelineID: ,
373-
// //GitlabCIPipelineIID: "",
374-
// GitlabCIProjectName: payload.Project.Name,
375-
// GitlabDiscussionId: discussionId,
376-
// },
377-
//)
378-
//if err != nil {
379-
// log.Printf("GetCiBackend error: %v", err)
380-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: GetCiBackend error: %v", err))
381-
// return fmt.Errorf("error fetching ci backed %v", err)
382-
//}
383-
//
384-
//err = controllers.TriggerDiggerJobs(ciBackend, repoFullName, repoOwner, repoName, batchId, prNumber, glService)
385-
//if err != nil {
386-
// log.Printf("TriggerDiggerJobs error: %v", err)
387-
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: TriggerDiggerJobs error: %v", err))
388-
// return fmt.Errorf("error triggerring Digger Jobs")
389-
//}
300+
commentReporter, err := utils.InitCommentReporter(glService, prNumber, ":construction_worker: Digger starting...")
301+
if err != nil {
302+
log.Printf("Error initializing comment reporter: %v", err)
303+
return fmt.Errorf("error initializing comment reporter")
304+
}
305+
306+
err = utils.ReportInitialJobsStatus(commentReporter, jobsForImpactedProjects)
307+
if err != nil {
308+
log.Printf("Failed to comment initial status for jobs: %v", err)
309+
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: Failed to comment initial status for jobs: %v", err))
310+
return fmt.Errorf("failed to comment initial status for jobs")
311+
}
312+
313+
err = utils.SetPRStatusForJobs(glService, prNumber, jobsForImpactedProjects)
314+
if err != nil {
315+
log.Printf("error setting status for PR: %v", err)
316+
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: error setting status for PR: %v", err))
317+
fmt.Errorf("error setting status for PR: %v", err)
318+
}
319+
320+
impactedProjectsMap := make(map[string]dg_configuration.Project)
321+
for _, p := range impactedProjects {
322+
impactedProjectsMap[p.Name] = p
323+
}
324+
325+
impactedJobsMap := make(map[string]scheduler.Job)
326+
for _, j := range jobsForImpactedProjects {
327+
impactedJobsMap[j.ProjectName] = j
328+
}
329+
330+
commentId, err := strconv.ParseInt(commentReporter.CommentId, 10, 64)
331+
if err != nil {
332+
log.Printf("strconv.ParseInt error: %v", err)
333+
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: could not handle commentId: %v", err))
334+
}
335+
batchId, _, err := utils.ConvertJobsToDiggerJobs(*diggerCommand, models.DiggerVCSGitlab, organisationId, impactedJobsMap, impactedProjectsMap, projectsGraph, 0, branch, prNumber, repoOwner, repoName, repoFullName, commitSha, commentId, diggeryamlStr, projectId)
336+
if err != nil {
337+
log.Printf("ConvertJobsToDiggerJobs error: %v", err)
338+
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: ConvertJobsToDiggerJobs error: %v", err))
339+
return fmt.Errorf("error converting jobs")
340+
}
341+
342+
segment.Track(strconv.Itoa(int(organisationId)), "backend_trigger_job")
343+
344+
ciBackend, err := ciBackendProvider.GetCiBackend(
345+
ci_backends.CiBackendOptions{
346+
RepoName: repoName,
347+
RepoOwner: repoOwner,
348+
RepoFullName: repoFullName,
349+
GitlabProjectId: projectId,
350+
GitlabCIMergeRequestID: payload.ObjectAttributes.ID,
351+
GitlabCIMergeRequestIID: payload.ObjectAttributes.IID,
352+
GitlabciprojectId: payload.Project.ID,
353+
GitlabciprojectNamespace: payload.Project.Namespace,
354+
//GitlabciprojectNamespaceId: 0,
355+
GitlabmergeRequestEventName: payload.EventType,
356+
//GitlabCIPipelineID: ,
357+
//GitlabCIPipelineIID: "",
358+
GitlabCIProjectName: payload.Project.Name,
359+
GitlabDiscussionId: discussionId,
360+
},
361+
)
362+
if err != nil {
363+
log.Printf("GetCiBackend error: %v", err)
364+
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: GetCiBackend error: %v", err))
365+
return fmt.Errorf("error fetching ci backed %v", err)
366+
}
367+
368+
err = controllers.TriggerDiggerJobs(ciBackend, repoFullName, repoOwner, repoName, batchId, prNumber, glService, nil)
369+
if err != nil {
370+
log.Printf("TriggerDiggerJobs error: %v", err)
371+
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: TriggerDiggerJobs error: %v", err))
372+
return fmt.Errorf("error triggering Digger Jobs")
373+
}
390374

391375
return nil
392376
}

libs/ci/ci.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ type Issue struct {
3636
}
3737

3838
type Comment struct {
39-
Id string
40-
Body *string
41-
Url string
39+
Id string
40+
DiscussionId string // gitlab only
41+
Body *string
42+
Url string
4243
}
4344

4445
func (c Comment) GetIdAsInt() (int, error) {

libs/ci/gitlab/gitlab.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,14 @@ func (gitlabService GitLabService) PublishComment(prNumber int, comment string)
177177
}
178178
discussionId = discussion.ID
179179
note := discussion.Notes[0]
180-
return &ci.Comment{Id: strconv.Itoa(note.ID), Body: &note.Body}, err
180+
return &ci.Comment{Id: strconv.Itoa(note.ID), DiscussionId: discussionId, Body: &note.Body}, err
181181
} else {
182182
note, _, err := gitlabService.Client.Discussions.AddMergeRequestDiscussionNote(projectId, mergeRequestIID, discussionId, commentOpt)
183183
if err != nil {
184184
log.Printf("Failed to publish a comment. %v\n", err)
185185
print(err.Error())
186186
}
187-
return &ci.Comment{Id: strconv.Itoa(note.ID), Body: &note.Body}, err
187+
return &ci.Comment{Id: strconv.Itoa(note.ID), DiscussionId: discussionId, Body: &note.Body}, err
188188
}
189189
}
190190

0 commit comments

Comments
 (0)