Skip to content

Commit 200ca6c

Browse files
authored
Add GitLab system hooks (#162)
This PR adds the GitLab system hooks for the following events: - group_create - group_destroy - group_rename - key_create - key_destroy - project_create - project_destroy - project_rename - project_transfer - project_update - repository_update - user_add_to_group - user_add_to_team - user_create - user_destroy - user_failed_login - user_remove_from_group - user_remove_from_team - user_rename - user_update_for_group - user_update_for_team See documentation at https://docs.gitlab.com/ee/administration/system_hooks.html
1 parent 5e32fd5 commit 200ca6c

23 files changed

+781
-16
lines changed

gitlab/gitlab.go

Lines changed: 142 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,41 @@ var (
2525

2626
// GitLab hook types
2727
const (
28-
PushEvents Event = "Push Hook"
29-
TagEvents Event = "Tag Push Hook"
30-
IssuesEvents Event = "Issue Hook"
31-
ConfidentialIssuesEvents Event = "Confidential Issue Hook"
32-
CommentEvents Event = "Note Hook"
33-
MergeRequestEvents Event = "Merge Request Hook"
34-
WikiPageEvents Event = "Wiki Page Hook"
35-
PipelineEvents Event = "Pipeline Hook"
36-
BuildEvents Event = "Build Hook"
37-
JobEvents Event = "Job Hook"
38-
SystemHookEvents Event = "System Hook"
39-
40-
objectPush string = "push"
41-
objectTag string = "tag_push"
42-
objectMergeRequest string = "merge_request"
43-
objectBuild string = "build"
28+
PushEvents Event = "Push Hook"
29+
TagEvents Event = "Tag Push Hook"
30+
IssuesEvents Event = "Issue Hook"
31+
ConfidentialIssuesEvents Event = "Confidential Issue Hook"
32+
CommentEvents Event = "Note Hook"
33+
MergeRequestEvents Event = "Merge Request Hook"
34+
WikiPageEvents Event = "Wiki Page Hook"
35+
PipelineEvents Event = "Pipeline Hook"
36+
BuildEvents Event = "Build Hook"
37+
JobEvents Event = "Job Hook"
38+
SystemHookEvents Event = "System Hook"
39+
objectPush string = "push"
40+
objectTag string = "tag_push"
41+
objectMergeRequest string = "merge_request"
42+
objectBuild string = "build"
43+
eventProjectCreate string = "project_create"
44+
eventProjectDestroy string = "project_destroy"
45+
eventProjectRename string = "project_rename"
46+
eventProjectTransfer string = "project_transfer"
47+
eventProjectUpdate string = "project_update"
48+
eventUserAddToTeam string = "user_add_to_team"
49+
eventUserRemoveFromTeam string = "user_remove_from_team"
50+
eventUserUpdateForTeam string = "user_update_for_team"
51+
eventUserCreate string = "user_create"
52+
eventUserDestroy string = "user_destroy"
53+
eventUserFailedLogin string = "user_failed_login"
54+
eventUserRename string = "user_rename"
55+
eventKeyCreate string = "key_create"
56+
eventKeyDestroy string = "key_destroy"
57+
eventGroupCreate string = "group_create"
58+
eventGroupDestroy string = "group_destroy"
59+
eventGroupRename string = "group_rename"
60+
eventUserAddToGroup string = "user_add_to_group"
61+
eventUserRemoveFromGroup string = "user_remove_from_group"
62+
eventUserUpdateForGroup string = "user_update_for_group"
4463
)
4564

4665
// Option is a configuration option for the webhook
@@ -177,6 +196,7 @@ func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{
177196
var pl BuildEventPayload
178197
err := json.Unmarshal([]byte(payload), &pl)
179198
return pl, err
199+
180200
case JobEvents:
181201
var pl JobEventPayload
182202
err := json.Unmarshal([]byte(payload), &pl)
@@ -194,21 +214,127 @@ func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{
194214
if err != nil {
195215
return nil, err
196216
}
217+
197218
switch pl.ObjectKind {
198219
case objectPush:
199220
return eventParsing(PushEvents, events, payload)
221+
200222
case objectTag:
201223
return eventParsing(TagEvents, events, payload)
224+
202225
case objectMergeRequest:
203226
return eventParsing(MergeRequestEvents, events, payload)
204227
default:
205228
switch pl.EventName {
206229
case objectPush:
207230
return eventParsing(PushEvents, events, payload)
231+
208232
case objectTag:
209233
return eventParsing(TagEvents, events, payload)
234+
210235
case objectMergeRequest:
211236
return eventParsing(MergeRequestEvents, events, payload)
237+
238+
case eventProjectCreate:
239+
var pl ProjectCreatedEventPayload
240+
err := json.Unmarshal([]byte(payload), &pl)
241+
return pl, err
242+
243+
case eventProjectDestroy:
244+
var pl ProjectDestroyedEventPayload
245+
err := json.Unmarshal([]byte(payload), &pl)
246+
return pl, err
247+
248+
case eventProjectRename:
249+
var pl ProjectRenamedEventPayload
250+
err := json.Unmarshal([]byte(payload), &pl)
251+
return pl, err
252+
253+
case eventProjectTransfer:
254+
var pl ProjectTransferredEventPayload
255+
err := json.Unmarshal([]byte(payload), &pl)
256+
return pl, err
257+
258+
case eventProjectUpdate:
259+
var pl ProjectUpdatedEventPayload
260+
err := json.Unmarshal([]byte(payload), &pl)
261+
return pl, err
262+
263+
case eventUserAddToTeam:
264+
var pl TeamMemberAddedEventPayload
265+
err := json.Unmarshal([]byte(payload), &pl)
266+
return pl, err
267+
268+
case eventUserRemoveFromTeam:
269+
var pl TeamMemberRemovedEventPayload
270+
err := json.Unmarshal([]byte(payload), &pl)
271+
return pl, err
272+
273+
case eventUserUpdateForTeam:
274+
var pl TeamMemberUpdatedEventPayload
275+
err := json.Unmarshal([]byte(payload), &pl)
276+
return pl, err
277+
278+
case eventUserCreate:
279+
var pl UserCreatedEventPayload
280+
err := json.Unmarshal([]byte(payload), &pl)
281+
return pl, err
282+
283+
case eventUserDestroy:
284+
var pl UserRemovedEventPayload
285+
err := json.Unmarshal([]byte(payload), &pl)
286+
return pl, err
287+
288+
case eventUserFailedLogin:
289+
var pl UserFailedLoginEventPayload
290+
err := json.Unmarshal([]byte(payload), &pl)
291+
return pl, err
292+
293+
case eventUserRename:
294+
var pl UserRenamedEventPayload
295+
err := json.Unmarshal([]byte(payload), &pl)
296+
return pl, err
297+
298+
case eventKeyCreate:
299+
var pl KeyAddedEventPayload
300+
err := json.Unmarshal([]byte(payload), &pl)
301+
return pl, err
302+
303+
case eventKeyDestroy:
304+
var pl KeyRemovedEventPayload
305+
err := json.Unmarshal([]byte(payload), &pl)
306+
return pl, err
307+
308+
case eventGroupCreate:
309+
var pl GroupCreatedEventPayload
310+
err := json.Unmarshal([]byte(payload), &pl)
311+
return pl, err
312+
313+
case eventGroupDestroy:
314+
var pl GroupRemovedEventPayload
315+
err := json.Unmarshal([]byte(payload), &pl)
316+
return pl, err
317+
318+
case eventGroupRename:
319+
var pl GroupRenamedEventPayload
320+
err := json.Unmarshal([]byte(payload), &pl)
321+
return pl, err
322+
323+
case eventUserAddToGroup:
324+
var pl GroupMemberAddedEventPayload
325+
err := json.Unmarshal([]byte(payload), &pl)
326+
return pl, err
327+
328+
case eventUserRemoveFromGroup:
329+
var pl GroupMemberRemovedEventPayload
330+
err := json.Unmarshal([]byte(payload), &pl)
331+
return pl, err
332+
333+
case eventUserUpdateForGroup:
334+
var pl GroupMemberUpdatedEventPayload
335+
err := json.Unmarshal([]byte(payload), &pl)
336+
return pl, err
337+
212338
default:
213339
return nil, fmt.Errorf("unknown system hook event %s", gitLabEvent)
214340
}

gitlab/gitlab_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,126 @@ func TestSystemHooks(t *testing.T) {
343343
typ: MergeRequestEventPayload{},
344344
filename: "../testdata/gitlab/system-merge-request-event.json",
345345
},
346+
{
347+
name: "ProjectCreatedEvent",
348+
event: SystemHookEvents,
349+
typ: ProjectCreatedEventPayload{},
350+
filename: "../testdata/gitlab/system-project-created.json",
351+
},
352+
{
353+
name: "ProjectDestroyedEvent",
354+
event: SystemHookEvents,
355+
typ: ProjectDestroyedEventPayload{},
356+
filename: "../testdata/gitlab/system-project-destroyed.json",
357+
},
358+
{
359+
name: "ProjectRenamedEvent",
360+
event: SystemHookEvents,
361+
typ: ProjectRenamedEventPayload{},
362+
filename: "../testdata/gitlab/system-project-renamed.json",
363+
},
364+
{
365+
name: "ProjectTransferredEvent",
366+
event: SystemHookEvents,
367+
typ: ProjectTransferredEventPayload{},
368+
filename: "../testdata/gitlab/system-project-transferred.json",
369+
},
370+
{
371+
name: "ProjectUpdatedEvent",
372+
event: SystemHookEvents,
373+
typ: ProjectUpdatedEventPayload{},
374+
filename: "../testdata/gitlab/system-project-updated.json",
375+
},
376+
{
377+
name: "TeamMemberAddedEvent",
378+
event: SystemHookEvents,
379+
typ: TeamMemberAddedEventPayload{},
380+
filename: "../testdata/gitlab/system-team-member-added.json",
381+
},
382+
{
383+
name: "TeamMemberRemovedEvent",
384+
event: SystemHookEvents,
385+
typ: TeamMemberRemovedEventPayload{},
386+
filename: "../testdata/gitlab/system-team-member-removed.json",
387+
},
388+
{
389+
name: "TeamMemberUpdatedEvent",
390+
event: SystemHookEvents,
391+
typ: TeamMemberUpdatedEventPayload{},
392+
filename: "../testdata/gitlab/system-team-member-updated.json",
393+
},
394+
{
395+
name: "UserCreatedEvent",
396+
event: SystemHookEvents,
397+
typ: UserCreatedEventPayload{},
398+
filename: "../testdata/gitlab/system-user-created.json",
399+
},
400+
{
401+
name: "UserRemovedEvent",
402+
event: SystemHookEvents,
403+
typ: UserRemovedEventPayload{},
404+
filename: "../testdata/gitlab/system-user-removed.json",
405+
},
406+
{
407+
name: "UserFailedLoginEvent",
408+
event: SystemHookEvents,
409+
typ: UserFailedLoginEventPayload{},
410+
filename: "../testdata/gitlab/system-user-failed-login.json",
411+
},
412+
{
413+
name: "UserRenamedEvent",
414+
event: SystemHookEvents,
415+
typ: UserRenamedEventPayload{},
416+
filename: "../testdata/gitlab/system-user-renamed.json",
417+
},
418+
{
419+
name: "KeyAddedEvent",
420+
event: SystemHookEvents,
421+
typ: KeyAddedEventPayload{},
422+
filename: "../testdata/gitlab/system-key-added.json",
423+
},
424+
{
425+
name: "KeyRemovedEvent",
426+
event: SystemHookEvents,
427+
typ: KeyRemovedEventPayload{},
428+
filename: "../testdata/gitlab/system-key-removed.json",
429+
},
430+
{
431+
name: "GroupCreatedEvent",
432+
event: SystemHookEvents,
433+
typ: GroupCreatedEventPayload{},
434+
filename: "../testdata/gitlab/system-group-created.json",
435+
},
436+
{
437+
name: "GroupRemovedEvent",
438+
event: SystemHookEvents,
439+
typ: GroupRemovedEventPayload{},
440+
filename: "../testdata/gitlab/system-group-removed.json",
441+
},
442+
{
443+
name: "GroupRenamedEvent",
444+
event: SystemHookEvents,
445+
typ: GroupRenamedEventPayload{},
446+
filename: "../testdata/gitlab/system-group-renamed.json",
447+
},
448+
{
449+
name: "GroupMemberAddedEvent",
450+
event: SystemHookEvents,
451+
typ: GroupMemberAddedEventPayload{},
452+
filename: "../testdata/gitlab/system-group-member-added.json",
453+
},
454+
{
455+
name: "GroupMemberRemovedEvent",
456+
event: SystemHookEvents,
457+
typ: GroupMemberRemovedEventPayload{},
458+
filename: "../testdata/gitlab/system-group-member-removed.json",
459+
},
460+
{
461+
name: "GroupMemberUpdatedEvent",
462+
event: SystemHookEvents,
463+
typ: GroupMemberUpdatedEventPayload{},
464+
filename: "../testdata/gitlab/system-group-member-updated.json",
465+
},
346466
}
347467
for _, tt := range tests {
348468
tc := tt

0 commit comments

Comments
 (0)