@@ -11,6 +11,7 @@ import (
11
11
"github.com/diggerhq/digger/backend/utils"
12
12
"github.com/diggerhq/digger/libs/ci/generic"
13
13
dg_github "github.com/diggerhq/digger/libs/ci/github"
14
+ gitlab2 "github.com/diggerhq/digger/libs/ci/gitlab"
14
15
comment_updater "github.com/diggerhq/digger/libs/comment_utils/reporting"
15
16
dg_configuration "github.com/diggerhq/digger/libs/digger_config"
16
17
dg_locking "github.com/diggerhq/digger/libs/locking"
@@ -78,12 +79,12 @@ func (d DiggerEEController) GitlabWebHookHandler(c *gin.Context) {
78
79
}
79
80
case * gitlab.MergeEvent :
80
81
log .Printf ("Got pull request event for %d" , event .Project .ID )
81
- // err := handlePullRequestEvent(gh , event, d.CiBackendProvider)
82
- // if err != nil {
83
- // log.Printf("handlePullRequestEvent error: %v", err)
84
- // c.String(http.StatusInternalServerError, err.Error())
85
- // return
86
- // }
82
+ err := handlePullRequestEvent (d . GitlabProvider , event , d .CiBackendProvider , organisationId )
83
+ if err != nil {
84
+ log .Printf ("handlePullRequestEvent error: %v" , err )
85
+ c .String (http .StatusInternalServerError , err .Error ())
86
+ return
87
+ }
87
88
case * gitlab.PushEvent :
88
89
log .Printf ("Got push event for %v %v" , event .Project .URL , event .Ref )
89
90
//err := handlePushEvent(gh, event)
@@ -99,6 +100,211 @@ func (d DiggerEEController) GitlabWebHookHandler(c *gin.Context) {
99
100
c .JSON (200 , "ok" )
100
101
}
101
102
103
+ func handlePullRequestEvent (gitlabProvider utils.GitlabProvider , payload * gitlab.MergeEvent , ciBackendProvider ci_backends.CiBackendProvider , organisationId uint ) error {
104
+ projectId := payload .Project .ID
105
+ repoFullName := payload .Project .PathWithNamespace
106
+ repoOwner , repoName , _ := strings .Cut (repoFullName , "/" )
107
+ cloneURL := payload .Project .GitHTTPURL
108
+ prNumber := payload .ObjectAttributes .IID
109
+ isDraft := payload .ObjectAttributes .WorkInProgress
110
+ branch := payload .ObjectAttributes .SourceBranch
111
+ commitSha := payload .ObjectAttributes .MergeCommitSHA
112
+ //defaultBranch := payload.Repository.DefaultBranch
113
+ //actor := payload.User.Username
114
+ discussionId := ""
115
+ //action := payload.ObjectAttributes.Action
116
+
117
+ glService , glerr := utils .GetGitlabService (gitlabProvider , projectId , repoName , repoFullName , prNumber , discussionId )
118
+ if glerr != nil {
119
+ log .Printf ("GetGithubService error: %v" , glerr )
120
+ return fmt .Errorf ("error getting ghService to post error comment" )
121
+ }
122
+
123
+ diggerYmlStr , config , projectsGraph , err := utils .GetDiggerConfigForBranch (gitlabProvider , projectId , repoFullName , repoOwner , repoName , cloneURL , branch , prNumber , discussionId )
124
+ if err != nil {
125
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: Could not load digger config, error: %v" , err ))
126
+ log .Printf ("getDiggerConfigForPR error: %v" , err )
127
+ return fmt .Errorf ("error getting digger config" )
128
+ }
129
+
130
+ if ! config .AllowDraftPRs && isDraft {
131
+ log .Printf ("AllowDraftPRs is disabled, skipping PR: %v" , prNumber )
132
+ return nil
133
+ }
134
+
135
+ impactedProjects , impactedProjectsSourceMapping , _ , err := gitlab2 .ProcessGitlabPullRequestEvent (payload , config , projectsGraph , glService )
136
+ if err != nil {
137
+ log .Printf ("Error processing event: %v" , err )
138
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: Error processing event: %v" , err ))
139
+ return fmt .Errorf ("error processing event" )
140
+ }
141
+
142
+ jobsForImpactedProjects , _ , err := gitlab2 .ConvertGithubPullRequestEventToJobs (payload , impactedProjects , nil , * config )
143
+ if err != nil {
144
+ log .Printf ("Error converting event to jobsForImpactedProjects: %v" , err )
145
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: Error converting event to jobsForImpactedProjects: %v" , err ))
146
+ return fmt .Errorf ("error converting event to jobsForImpactedProjects" )
147
+ }
148
+
149
+ if len (jobsForImpactedProjects ) == 0 {
150
+ // do not report if no projects are impacted to minimise noise in the PR thread
151
+ // TODO use status checks instead: https://github.com/diggerhq/digger/issues/1135
152
+ log .Printf ("No projects impacted; not starting any jobs" )
153
+ // This one is for aggregate reporting
154
+ err = utils .SetPRStatusForJobs (glService , prNumber , jobsForImpactedProjects )
155
+ return nil
156
+ }
157
+
158
+ diggerCommand , err := scheduler .GetCommandFromJob (jobsForImpactedProjects [0 ])
159
+ if err != nil {
160
+ log .Printf ("could not determine digger command from job: %v" , jobsForImpactedProjects [0 ].Commands )
161
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: could not determine digger command from job: %v" , err ))
162
+ return fmt .Errorf ("unkown digger command in comment %v" , err )
163
+ }
164
+
165
+ if * diggerCommand == scheduler .DiggerCommandNoop {
166
+ log .Printf ("job is of type noop, no actions top perform" )
167
+ return nil
168
+ }
169
+
170
+ // perform locking/unlocking in backend
171
+ if config .PrLocks {
172
+ for _ , project := range impactedProjects {
173
+ prLock := dg_locking.PullRequestLock {
174
+ InternalLock : locking.BackendDBLock {
175
+ OrgId : organisationId ,
176
+ },
177
+ CIService : glService ,
178
+ Reporter : comment_updater.NoopReporter {},
179
+ ProjectName : project .Name ,
180
+ ProjectNamespace : repoFullName ,
181
+ PrNumber : prNumber ,
182
+ }
183
+ err = dg_locking .PerformLockingActionFromCommand (prLock , * diggerCommand )
184
+ if err != nil {
185
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: Failed perform lock action on project: %v %v" , project .Name , err ))
186
+ return fmt .Errorf ("failed to perform lock action on project: %v, %v" , project .Name , err )
187
+ }
188
+ }
189
+ }
190
+
191
+ // if commands are locking or unlocking we don't need to trigger any jobs
192
+ if * diggerCommand == scheduler .DiggerCommandUnlock ||
193
+ * diggerCommand == scheduler .DiggerCommandLock {
194
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":white_check_mark: Command %v completed successfully" , * diggerCommand ))
195
+ return nil
196
+ }
197
+
198
+ if ! config .AllowDraftPRs && isDraft {
199
+ log .Printf ("Draft PRs are disabled, skipping PR: %v" , prNumber )
200
+ return nil
201
+ }
202
+
203
+ commentReporter , err := utils .InitCommentReporter (glService , prNumber , ":construction_worker: Digger starting..." )
204
+ if err != nil {
205
+ log .Printf ("Error initializing comment reporter: %v" , err )
206
+ return fmt .Errorf ("error initializing comment reporter" )
207
+ }
208
+
209
+ err = utils .ReportInitialJobsStatus (commentReporter , jobsForImpactedProjects )
210
+ if err != nil {
211
+ log .Printf ("Failed to comment initial status for jobs: %v" , err )
212
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: Failed to comment initial status for jobs: %v" , err ))
213
+ return fmt .Errorf ("failed to comment initial status for jobs" )
214
+ }
215
+
216
+ err = utils .SetPRStatusForJobs (glService , prNumber , jobsForImpactedProjects )
217
+ if err != nil {
218
+ log .Printf ("error setting status for PR: %v" , err )
219
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: error setting status for PR: %v" , err ))
220
+ fmt .Errorf ("error setting status for PR: %v" , err )
221
+ }
222
+
223
+ impactedProjectsMap := make (map [string ]dg_configuration.Project )
224
+ for _ , p := range impactedProjects {
225
+ impactedProjectsMap [p .Name ] = p
226
+ }
227
+
228
+ impactedJobsMap := make (map [string ]scheduler.Job )
229
+ for _ , j := range jobsForImpactedProjects {
230
+ impactedJobsMap [j .ProjectName ] = j
231
+ }
232
+
233
+ commentId , err := strconv .ParseInt (commentReporter .CommentId , 10 , 64 )
234
+ if err != nil {
235
+ log .Printf ("strconv.ParseInt error: %v" , err )
236
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: could not handle commentId: %v" , err ))
237
+ }
238
+ batchId , _ , err := utils .ConvertJobsToDiggerJobs (* diggerCommand , models .DiggerVCSGitlab , organisationId , impactedJobsMap , impactedProjectsMap , projectsGraph , 0 , branch , prNumber , repoOwner , repoName , repoFullName , commitSha , commentId , diggerYmlStr )
239
+ if err != nil {
240
+ log .Printf ("ConvertJobsToDiggerJobs error: %v" , err )
241
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: ConvertJobsToDiggerJobs error: %v" , err ))
242
+ return fmt .Errorf ("error converting jobs" )
243
+ }
244
+
245
+ if config .CommentRenderMode == dg_configuration .CommentRenderModeGroupByModule {
246
+ sourceDetails , err := comment_updater .PostInitialSourceComments (glService , prNumber , impactedProjectsSourceMapping )
247
+ if err != nil {
248
+ log .Printf ("PostInitialSourceComments error: %v" , err )
249
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: PostInitialSourceComments error: %v" , err ))
250
+ return fmt .Errorf ("error posting initial comments" )
251
+ }
252
+ batch , err := models .DB .GetDiggerBatch (batchId )
253
+ if err != nil {
254
+ log .Printf ("GetDiggerBatch error: %v" , err )
255
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: PostInitialSourceComments error: %v" , err ))
256
+ return fmt .Errorf ("error getting digger batch" )
257
+ }
258
+ batch .SourceDetails , err = json .Marshal (sourceDetails )
259
+ if err != nil {
260
+ log .Printf ("sourceDetails, json Marshal error: %v" , err )
261
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: json Marshal error: %v" , err ))
262
+ return fmt .Errorf ("error marshalling sourceDetails" )
263
+ }
264
+ err = models .DB .UpdateDiggerBatch (batch )
265
+ if err != nil {
266
+ log .Printf ("UpdateDiggerBatch error: %v" , err )
267
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: UpdateDiggerBatch error: %v" , err ))
268
+ return fmt .Errorf ("error updating digger batch" )
269
+ }
270
+ }
271
+
272
+ segment .Track (strconv .Itoa (int (organisationId )), "backend_trigger_job" )
273
+
274
+ ciBackend , err := ciBackendProvider .GetCiBackend (
275
+ ci_backends.CiBackendOptions {
276
+ RepoName : repoName ,
277
+ RepoOwner : repoOwner ,
278
+ RepoFullName : repoFullName ,
279
+ GitlabProjectId : projectId ,
280
+ GitlabCIMergeRequestID : payload .ObjectAttributes .ID ,
281
+ GitlabCIMergeRequestIID : payload .ObjectAttributes .IID ,
282
+ GitlabciprojectId : payload .Project .ID ,
283
+ GitlabciprojectNamespace : payload .Project .Namespace ,
284
+ //GitlabciprojectNamespaceId: 0,
285
+ GitlabmergeRequestEventName : payload .EventType ,
286
+ //GitlabCIPipelineID: ,
287
+ //GitlabCIPipelineIID: "",
288
+ GitlabCIProjectName : payload .Project .Name ,
289
+ GitlabDiscussionId : discussionId ,
290
+ },
291
+ )
292
+ if err != nil {
293
+ log .Printf ("GetCiBackend error: %v" , err )
294
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: GetCiBackend error: %v" , err ))
295
+ return fmt .Errorf ("error fetching ci backed %v" , err )
296
+ }
297
+
298
+ err = controllers .TriggerDiggerJobs (ciBackend , repoFullName , repoOwner , repoName , batchId , prNumber , glService )
299
+ if err != nil {
300
+ log .Printf ("TriggerDiggerJobs error: %v" , err )
301
+ utils .InitCommentReporter (glService , prNumber , fmt .Sprintf (":x: TriggerDiggerJobs error: %v" , err ))
302
+ return fmt .Errorf ("error triggerring Digger Jobs" )
303
+ }
304
+
305
+ return nil
306
+ }
307
+
102
308
func handleIssueCommentEvent (gitlabProvider utils.GitlabProvider , payload * gitlab.MergeCommentEvent , ciBackendProvider ci_backends.CiBackendProvider , organisationId uint ) error {
103
309
projectId := payload .ProjectID
104
310
repoFullName := payload .Project .PathWithNamespace
0 commit comments