Skip to content

Commit

Permalink
fix gitlab pr event flow (#1655)
Browse files Browse the repository at this point in the history
  • Loading branch information
motatoes authored Aug 12, 2024
1 parent 1f40c8c commit 8ac050c
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 114 deletions.
1 change: 1 addition & 0 deletions backend/utils/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ func GetGitlabService(gh GitlabProvider, projectId int, repoName string, repoFul
service := orchestrator_gitlab.GitLabService{Client: client, Context: &context}
return &service, nil
}

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) {
token := os.Getenv("DIGGER_GITLAB_ACCESS_TOKEN")

Expand Down
202 changes: 93 additions & 109 deletions ee/backend/controllers/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,19 +194,30 @@ func handlePullRequestEvent(gitlabProvider utils.GitlabProvider, payload *gitlab
prNumber := payload.ObjectAttributes.IID
isDraft := payload.ObjectAttributes.WorkInProgress
branch := payload.ObjectAttributes.SourceBranch
//commitSha := payload.ObjectAttributes.MergeCommitSHA
commitSha := payload.ObjectAttributes.LastCommit.ID
//defaultBranch := payload.Repository.DefaultBranch
//actor := payload.User.Username
discussionId := ""
//discussionId := ""
//action := payload.ObjectAttributes.Action

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

_, config, projectsGraph, err := utils.GetDiggerConfigForBranch(gitlabProvider, projectId, repoFullName, repoOwner, repoName, cloneURL, branch, prNumber, discussionId)
log.Printf("got first discussion id: %v", discussionId)
// re-initialize with the right discussion ID
glService, glerr = utils.GetGitlabService(gitlabProvider, projectId, repoName, repoFullName, prNumber, discussionId)
if glerr != nil {
log.Printf("GetGithubService error: %v", glerr)
return fmt.Errorf("error getting ghService to post error comment")
}

diggeryamlStr, config, projectsGraph, err := utils.GetDiggerConfigForBranch(gitlabProvider, projectId, repoFullName, repoOwner, repoName, cloneURL, branch, prNumber, discussionId)
if err != nil {
log.Printf("getDiggerConfigForPR error: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: Could not load digger config, error: %v", err))
Expand Down Expand Up @@ -281,112 +292,85 @@ func handlePullRequestEvent(gitlabProvider utils.GitlabProvider, payload *gitlab
return nil
}

//if !config.AllowDraftPRs && isDraft {
// log.Printf("Draft PRs are disabled, skipping PR: %v", prNumber)
// return nil
//}
//
//commentReporter, err := utils.InitCommentReporter(glService, prNumber, ":construction_worker: Digger starting...")
//if err != nil {
// log.Printf("Error initializing comment reporter: %v", err)
// return fmt.Errorf("error initializing comment reporter")
//}
//
//err = utils.ReportInitialJobsStatus(commentReporter, jobsForImpactedProjects)
//if err != nil {
// log.Printf("Failed to comment initial status for jobs: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: Failed to comment initial status for jobs: %v", err))
// return fmt.Errorf("failed to comment initial status for jobs")
//}
//
//err = utils.SetPRStatusForJobs(glService, prNumber, jobsForImpactedProjects)
//if err != nil {
// log.Printf("error setting status for PR: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: error setting status for PR: %v", err))
// fmt.Errorf("error setting status for PR: %v", err)
//}
//
//impactedProjectsMap := make(map[string]dg_configuration.Project)
//for _, p := range impactedProjects {
// impactedProjectsMap[p.Name] = p
//}
//
//impactedJobsMap := make(map[string]scheduler.Job)
//for _, j := range jobsForImpactedProjects {
// impactedJobsMap[j.ProjectName] = j
//}
//
//commentId, err := strconv.ParseInt(commentReporter.CommentId, 10, 64)
//if err != nil {
// log.Printf("strconv.ParseInt error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: could not handle commentId: %v", err))
//}
//batchId, _, err := utils.ConvertJobsToDiggerJobs(*diggerCommand, models.DiggerVCSGitlab, organisationId, impactedJobsMap, impactedProjectsMap, projectsGraph, 0, branch, prNumber, repoOwner, repoName, repoFullName, commitSha, commentId, diggerYmlStr)
//if err != nil {
// log.Printf("ConvertJobsToDiggerJobs error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: ConvertJobsToDiggerJobs error: %v", err))
// return fmt.Errorf("error converting jobs")
//}
//
//if config.CommentRenderMode == dg_configuration.CommentRenderModeGroupByModule {
// sourceDetails, err := comment_updater.PostInitialSourceComments(glService, prNumber, impactedProjectsSourceMapping)
// if err != nil {
// log.Printf("PostInitialSourceComments error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: PostInitialSourceComments error: %v", err))
// return fmt.Errorf("error posting initial comments")
// }
// batch, err := models.DB.GetDiggerBatch(batchId)
// if err != nil {
// log.Printf("GetDiggerBatch error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: PostInitialSourceComments error: %v", err))
// return fmt.Errorf("error getting digger batch")
// }
// batch.SourceDetails, err = json.Marshal(sourceDetails)
// if err != nil {
// log.Printf("sourceDetails, json Marshal error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: json Marshal error: %v", err))
// return fmt.Errorf("error marshalling sourceDetails")
// }
// err = models.DB.UpdateDiggerBatch(batch)
// if err != nil {
// log.Printf("UpdateDiggerBatch error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: UpdateDiggerBatch error: %v", err))
// return fmt.Errorf("error updating digger batch")
// }
//}
if !config.AllowDraftPRs && isDraft {
log.Printf("Draft PRs are disabled, skipping PR: %v", prNumber)
return nil
}

//segment.Track(strconv.Itoa(int(organisationId)), "backend_trigger_job")
//
//ciBackend, err := ciBackendProvider.GetCiBackend(
// ci_backends.CiBackendOptions{
// RepoName: repoName,
// RepoOwner: repoOwner,
// RepoFullName: repoFullName,
// GitlabProjectId: projectId,
// GitlabCIMergeRequestID: payload.ObjectAttributes.ID,
// GitlabCIMergeRequestIID: payload.ObjectAttributes.IID,
// GitlabciprojectId: payload.Project.ID,
// GitlabciprojectNamespace: payload.Project.Namespace,
// //GitlabciprojectNamespaceId: 0,
// GitlabmergeRequestEventName: payload.EventType,
// //GitlabCIPipelineID: ,
// //GitlabCIPipelineIID: "",
// GitlabCIProjectName: payload.Project.Name,
// GitlabDiscussionId: discussionId,
// },
//)
//if err != nil {
// log.Printf("GetCiBackend error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: GetCiBackend error: %v", err))
// return fmt.Errorf("error fetching ci backed %v", err)
//}
//
//err = controllers.TriggerDiggerJobs(ciBackend, repoFullName, repoOwner, repoName, batchId, prNumber, glService)
//if err != nil {
// log.Printf("TriggerDiggerJobs error: %v", err)
// utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: TriggerDiggerJobs error: %v", err))
// return fmt.Errorf("error triggerring Digger Jobs")
//}
commentReporter, err := utils.InitCommentReporter(glService, prNumber, ":construction_worker: Digger starting...")
if err != nil {
log.Printf("Error initializing comment reporter: %v", err)
return fmt.Errorf("error initializing comment reporter")
}

err = utils.ReportInitialJobsStatus(commentReporter, jobsForImpactedProjects)
if err != nil {
log.Printf("Failed to comment initial status for jobs: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: Failed to comment initial status for jobs: %v", err))
return fmt.Errorf("failed to comment initial status for jobs")
}

err = utils.SetPRStatusForJobs(glService, prNumber, jobsForImpactedProjects)
if err != nil {
log.Printf("error setting status for PR: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: error setting status for PR: %v", err))
fmt.Errorf("error setting status for PR: %v", err)
}

impactedProjectsMap := make(map[string]dg_configuration.Project)
for _, p := range impactedProjects {
impactedProjectsMap[p.Name] = p
}

impactedJobsMap := make(map[string]scheduler.Job)
for _, j := range jobsForImpactedProjects {
impactedJobsMap[j.ProjectName] = j
}

commentId, err := strconv.ParseInt(commentReporter.CommentId, 10, 64)
if err != nil {
log.Printf("strconv.ParseInt error: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: could not handle commentId: %v", err))
}
batchId, _, err := utils.ConvertJobsToDiggerJobs(*diggerCommand, models.DiggerVCSGitlab, organisationId, impactedJobsMap, impactedProjectsMap, projectsGraph, 0, branch, prNumber, repoOwner, repoName, repoFullName, commitSha, commentId, diggeryamlStr, projectId)
if err != nil {
log.Printf("ConvertJobsToDiggerJobs error: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: ConvertJobsToDiggerJobs error: %v", err))
return fmt.Errorf("error converting jobs")
}

segment.Track(strconv.Itoa(int(organisationId)), "backend_trigger_job")

ciBackend, err := ciBackendProvider.GetCiBackend(
ci_backends.CiBackendOptions{
RepoName: repoName,
RepoOwner: repoOwner,
RepoFullName: repoFullName,
GitlabProjectId: projectId,
GitlabCIMergeRequestID: payload.ObjectAttributes.ID,
GitlabCIMergeRequestIID: payload.ObjectAttributes.IID,
GitlabciprojectId: payload.Project.ID,
GitlabciprojectNamespace: payload.Project.Namespace,
//GitlabciprojectNamespaceId: 0,
GitlabmergeRequestEventName: payload.EventType,
//GitlabCIPipelineID: ,
//GitlabCIPipelineIID: "",
GitlabCIProjectName: payload.Project.Name,
GitlabDiscussionId: discussionId,
},
)
if err != nil {
log.Printf("GetCiBackend error: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: GetCiBackend error: %v", err))
return fmt.Errorf("error fetching ci backed %v", err)
}

err = controllers.TriggerDiggerJobs(ciBackend, repoFullName, repoOwner, repoName, batchId, prNumber, glService, nil)
if err != nil {
log.Printf("TriggerDiggerJobs error: %v", err)
utils.InitCommentReporter(glService, prNumber, fmt.Sprintf(":x: TriggerDiggerJobs error: %v", err))
return fmt.Errorf("error triggering Digger Jobs")
}

return nil
}
Expand Down
7 changes: 4 additions & 3 deletions libs/ci/ci.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ type Issue struct {
}

type Comment struct {
Id string
Body *string
Url string
Id string
DiscussionId string // gitlab only
Body *string
Url string
}

func (c Comment) GetIdAsInt() (int, error) {
Expand Down
4 changes: 2 additions & 2 deletions libs/ci/gitlab/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,14 +177,14 @@ func (gitlabService GitLabService) PublishComment(prNumber int, comment string)
}
discussionId = discussion.ID
note := discussion.Notes[0]
return &ci.Comment{Id: strconv.Itoa(note.ID), Body: &note.Body}, err
return &ci.Comment{Id: strconv.Itoa(note.ID), DiscussionId: discussionId, Body: &note.Body}, err
} else {
note, _, err := gitlabService.Client.Discussions.AddMergeRequestDiscussionNote(projectId, mergeRequestIID, discussionId, commentOpt)
if err != nil {
log.Printf("Failed to publish a comment. %v\n", err)
print(err.Error())
}
return &ci.Comment{Id: strconv.Itoa(note.ID), Body: &note.Body}, err
return &ci.Comment{Id: strconv.Itoa(note.ID), DiscussionId: discussionId, Body: &note.Body}, err
}
}

Expand Down

0 comments on commit 8ac050c

Please sign in to comment.