Skip to content

Commit 72d9edb

Browse files
committed
add support for multiple repos
1 parent 0d60e13 commit 72d9edb

File tree

2 files changed

+64
-21
lines changed

2 files changed

+64
-21
lines changed

gitlab.go

+63-20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"encoding/json"
45
"errors"
56
"fmt"
67
"github.com/aws/aws-lambda-go/events"
@@ -39,16 +40,11 @@ func ParseWebHookJSON(secret string, lambdaRequest events.LambdaFunctionURLReque
3940

4041
fmt.Printf("gitlabEvent: %s\n", gitlabEvent)
4142

42-
gitLabClient, err := CreateGitLabClient()
43+
gitLabClients, err := CreateGitLabClient()
4344
if err != nil {
4445
return fmt.Errorf("failed to create GitLab client, %v\n", err)
4546
}
4647

47-
currentUser, _, err := gitLabClient.Users.CurrentUser()
48-
if err != nil {
49-
return fmt.Errorf("failed to get current GitLab user info, %v", err)
50-
}
51-
5248
eventType := gitlab.EventType(gitlabEvent)
5349

5450
payload := lambdaRequest.Body
@@ -70,8 +66,14 @@ func ParseWebHookJSON(secret string, lambdaRequest events.LambdaFunctionURLReque
7066
mergeRequestIID := event.ObjectAttributes.IID
7167
mergeRequestID := event.ObjectAttributes.ID
7268

69+
currentUser, _, err := gitLabClients[projectId].Users.CurrentUser()
70+
if err != nil {
71+
return fmt.Errorf("failed to get current GitLab user info, %v", err)
72+
}
73+
fmt.Printf("Current GitLab user id: %d\n", currentUser.ID)
74+
7375
//check if Merge Request mergeable
74-
isMergeable, err := IsMergeable(gitLabClient, projectId, mergeRequestIID)
76+
isMergeable, err := IsMergeable(gitLabClients[projectId], projectId, mergeRequestIID)
7577
if err != nil {
7678
return fmt.Errorf("failed to parse webhook event: %w\n", err)
7779
}
@@ -81,7 +83,7 @@ func ParseWebHookJSON(secret string, lambdaRequest events.LambdaFunctionURLReque
8183
fmt.Printf("branchName: %s\n", branchName)
8284

8385
// check if branch exist
84-
branchExists, err := checkIfBranchExist(gitLabClient, projectId, branchName)
86+
branchExists, err := checkIfBranchExist(gitLabClients[projectId], projectId, branchName)
8587
if err != nil {
8688
return err
8789
}
@@ -135,8 +137,15 @@ func ParseWebHookJSON(secret string, lambdaRequest events.LambdaFunctionURLReque
135137
case gitlab.EventTypeNote:
136138
event := result.(*gitlab.MergeCommentEvent)
137139
comment := event.ObjectAttributes.Note
140+
projectId := event.ProjectID
138141
fmt.Printf("note event: %v\n", event)
139142

143+
currentUser, _, err := gitLabClients[projectId].Users.CurrentUser()
144+
if err != nil {
145+
return fmt.Errorf("failed to get current GitLab user info, %v", err)
146+
}
147+
fmt.Printf("Current GitLab user id: %d\n", currentUser.ID)
148+
140149
if event.User.ID == currentUser.ID {
141150
fmt.Println("Webhook triggered by lambda, do nothing.")
142151
// do nothing if comment has been created by the same webhook user
@@ -148,13 +157,12 @@ func ParseWebHookJSON(secret string, lambdaRequest events.LambdaFunctionURLReque
148157
fmt.Println("Comment is not a digger command, ignoring.")
149158
return nil
150159
}
151-
projectId := event.ProjectID
152160
branchName := event.MergeRequest.SourceBranch
153161
mergeRequestIID := event.MergeRequest.IID
154162
mergeRequestID := event.MergeRequest.ID
155163

156164
//check if Merge Request mergeable
157-
isMergeable, err := IsMergeable(gitLabClient, projectId, mergeRequestIID)
165+
isMergeable, err := IsMergeable(gitLabClients[projectId], projectId, mergeRequestIID)
158166
if err != nil {
159167
return fmt.Errorf("failed to parse webhook event: %w\n", err)
160168
}
@@ -173,11 +181,13 @@ func ParseWebHookJSON(secret string, lambdaRequest events.LambdaFunctionURLReque
173181
}
174182

175183
func TriggerPipeline(projectId int, branchName string, eventType string, diggerCommand string, discussionId string, mergeRequestID int, mergeRequestIID int, isMergeable bool) error {
176-
git, err := CreateGitLabClient()
184+
gitLabClients, err := CreateGitLabClient()
177185
if err != nil {
178186
return err
179187
}
180188

189+
gitLabClient := gitLabClients[projectId]
190+
181191
log.Printf("TriggerPipeline: projectId: %d, branchName: %s, mergeRequestIID:%d, mergeRequestID:%d, eventType: %s, discussionId: %s, diggerCommand: %s", projectId, branchName, mergeRequestIID, mergeRequestID, eventType, discussionId, diggerCommand)
182192

183193
variables := make([]*gitlab.PipelineVariableOptions, 0)
@@ -225,7 +235,7 @@ func TriggerPipeline(projectId int, branchName string, eventType string, diggerC
225235
fmt.Printf("key: %s, value: %s\n", *v.Key, *v.Value)
226236
}
227237

228-
build, _, err := git.Pipelines.CreatePipeline(projectId, opt)
238+
build, _, err := gitLabClient.Pipelines.CreatePipeline(projectId, opt)
229239
if err != nil {
230240
return fmt.Errorf("failed to create pipeline, %v", err)
231241
}
@@ -234,24 +244,57 @@ func TriggerPipeline(projectId int, branchName string, eventType string, diggerC
234244
return nil
235245
}
236246

237-
func CreateGitLabClient() (*gitlab.Client, error) {
238-
gitlabToken := os.Getenv("GITLAB_TOKEN")
239-
if gitlabToken == "" {
240-
return nil, fmt.Errorf("GITLAB_TOKEN has not been set\n")
247+
func CreateGitLabClient() (map[int]*gitlab.Client, error) {
248+
// GITLAB_TOKENS is a json dict of tokens, example:
249+
//[{"46465722": "glpat-121211"}, {"44723537": "glpat-2323232323"}]
250+
251+
gitlabTokenJson := os.Getenv("GITLAB_TOKENS")
252+
253+
if gitlabTokenJson == "" {
254+
return nil, fmt.Errorf("GITLAB_TOKENS has not been set\n")
241255
}
242-
client, err := gitlab.NewClient(gitlabToken)
256+
257+
var result map[int]*gitlab.Client
258+
259+
var tokens []map[string]string
260+
err := json.Unmarshal([]byte(gitlabTokenJson), &tokens)
243261
if err != nil {
244-
return nil, fmt.Errorf("failed to create GitLab client, %v, \n", err)
262+
panic(err)
263+
}
264+
result = make(map[int]*gitlab.Client, len(tokens))
265+
266+
for i := range tokens {
267+
if tokens[i]["project"] == "" {
268+
return nil, fmt.Errorf("Project Id has not been set in GITLAB_TOKENS\n")
269+
}
270+
271+
if tokens[i]["token"] == "" {
272+
return nil, fmt.Errorf("GitLab token has not been set in GITLAB_TOKENS\n")
273+
}
274+
token := tokens[i]["token"]
275+
projectId, err := strconv.Atoi(tokens[i]["project"])
276+
if err != nil {
277+
return nil, fmt.Errorf("Failed to parse projectId for %s\n", tokens[i]["project"])
278+
}
279+
280+
client, err := gitlab.NewClient(token)
281+
if err != nil {
282+
return nil, fmt.Errorf("failed to create GitLab client for project %d, %v, \n", projectId, err)
283+
}
284+
result[projectId] = client
245285
}
246-
return client, nil
286+
287+
return result, nil
247288
}
248289

249290
func PublishComment(projectID int, mergeRequestIID int, comment string) error {
250-
gitLabClient, err := CreateGitLabClient()
291+
gitLabClients, err := CreateGitLabClient()
251292
if err != nil {
252293
return err
253294
}
254295

296+
gitLabClient := gitLabClients[projectID]
297+
255298
opt := &gitlab.CreateMergeRequestDiscussionOptions{Body: &comment}
256299

257300
gitLabClient.Discussions.CreateMergeRequestDiscussion(projectID, mergeRequestIID, opt)

serverless.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ functions:
2020
method: post
2121
private: false
2222
environment:
23-
GITLAB_TOKEN: ${ssm:/gitlab-dev-webhook-handler/dev/GITLAB_TOKEN}
23+
GITLAB_TOKENS: ${ssm:/gitlab-dev-webhook-handler/dev/GITLAB_TOKENS}
2424
SECRET_TOKEN: ${ssm:/gitlab-dev-webhook-handler/dev/SECRET_TOKEN}
2525

0 commit comments

Comments
 (0)