Skip to content

Commit 220b666

Browse files
committed
1 parent 69430a8 commit 220b666

File tree

4 files changed

+262
-125
lines changed

4 files changed

+262
-125
lines changed

gitlab/gitlab.go

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -25,43 +25,44 @@ 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-
ConfidentialCommentEvents Event = "Confidential Note Hook"
34-
MergeRequestEvents Event = "Merge Request Hook"
35-
WikiPageEvents Event = "Wiki Page Hook"
36-
PipelineEvents Event = "Pipeline Hook"
37-
BuildEvents Event = "Build Hook"
38-
JobEvents Event = "Job Hook"
39-
DeploymentEvents Event = "Deployment Hook"
40-
SystemHookEvents Event = "System Hook"
41-
objectPush string = "push"
42-
objectTag string = "tag_push"
43-
objectMergeRequest string = "merge_request"
44-
objectBuild string = "build"
45-
eventProjectCreate string = "project_create"
46-
eventProjectDestroy string = "project_destroy"
47-
eventProjectRename string = "project_rename"
48-
eventProjectTransfer string = "project_transfer"
49-
eventProjectUpdate string = "project_update"
50-
eventUserAddToTeam string = "user_add_to_team"
51-
eventUserRemoveFromTeam string = "user_remove_from_team"
52-
eventUserUpdateForTeam string = "user_update_for_team"
53-
eventUserCreate string = "user_create"
54-
eventUserDestroy string = "user_destroy"
55-
eventUserFailedLogin string = "user_failed_login"
56-
eventUserRename string = "user_rename"
57-
eventKeyCreate string = "key_create"
58-
eventKeyDestroy string = "key_destroy"
59-
eventGroupCreate string = "group_create"
60-
eventGroupDestroy string = "group_destroy"
61-
eventGroupRename string = "group_rename"
62-
eventUserAddToGroup string = "user_add_to_group"
63-
eventUserRemoveFromGroup string = "user_remove_from_group"
64-
eventUserUpdateForGroup string = "user_update_for_group"
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+
ConfidentialCommentEvents Event = "Confidential Note Hook"
34+
MergeRequestEvents Event = "Merge Request Hook"
35+
WikiPageEvents Event = "Wiki Page Hook"
36+
PipelineEvents Event = "Pipeline Hook"
37+
BuildEvents Event = "Build Hook"
38+
JobEvents Event = "Job Hook"
39+
DeploymentEvents Event = "Deployment Hook"
40+
ReleaseEvents Event = "Release Hook"
41+
SystemHookEvents Event = "System Hook"
42+
objectPush string = "push"
43+
objectTag string = "tag_push"
44+
objectMergeRequest string = "merge_request"
45+
objectBuild string = "build"
46+
eventProjectCreate string = "project_create"
47+
eventProjectDestroy string = "project_destroy"
48+
eventProjectRename string = "project_rename"
49+
eventProjectTransfer string = "project_transfer"
50+
eventProjectUpdate string = "project_update"
51+
eventUserAddToTeam string = "user_add_to_team"
52+
eventUserRemoveFromTeam string = "user_remove_from_team"
53+
eventUserUpdateForTeam string = "user_update_for_team"
54+
eventUserCreate string = "user_create"
55+
eventUserDestroy string = "user_destroy"
56+
eventUserFailedLogin string = "user_failed_login"
57+
eventUserRename string = "user_rename"
58+
eventKeyCreate string = "key_create"
59+
eventKeyDestroy string = "key_destroy"
60+
eventGroupCreate string = "group_create"
61+
eventGroupDestroy string = "group_destroy"
62+
eventGroupRename string = "group_rename"
63+
eventUserAddToGroup string = "user_add_to_group"
64+
eventUserRemoveFromGroup string = "user_remove_from_group"
65+
eventUserUpdateForGroup string = "user_update_for_group"
6566
)
6667

6768
// Option is a configuration option for the webhook
@@ -354,6 +355,10 @@ func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{
354355
return nil, fmt.Errorf("unknown system hook event %s", gitLabEvent)
355356
}
356357
}
358+
case ReleaseEvents:
359+
var pl ReleaseEventPayload
360+
err := json.Unmarshal([]byte(payload), &pl)
361+
return pl, err
357362
default:
358363
return nil, fmt.Errorf("unknown event %s", gitLabEvent)
359364
}

gitlab/gitlab_test.go

Lines changed: 113 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,27 @@ func TestBadRequests(t *testing.T) {
9494
for _, tt := range tests {
9595
tc := tt
9696
client := &http.Client{}
97-
t.Run(tt.name, func(t *testing.T) {
98-
t.Parallel()
99-
var parseError error
100-
server := newServer(func(w http.ResponseWriter, r *http.Request) {
101-
_, parseError = hook.Parse(r, tc.event)
102-
})
103-
defer server.Close()
104-
req, err := http.NewRequest(http.MethodPost, server.URL+path, tc.payload)
105-
assert.NoError(err)
106-
req.Header = tc.headers
107-
req.Header.Set("Content-Type", "application/json")
97+
t.Run(
98+
tt.name, func(t *testing.T) {
99+
t.Parallel()
100+
var parseError error
101+
server := newServer(
102+
func(w http.ResponseWriter, r *http.Request) {
103+
_, parseError = hook.Parse(r, tc.event)
104+
},
105+
)
106+
defer server.Close()
107+
req, err := http.NewRequest(http.MethodPost, server.URL+path, tc.payload)
108+
assert.NoError(err)
109+
req.Header = tc.headers
110+
req.Header.Set("Content-Type", "application/json")
108111

109-
resp, err := client.Do(req)
110-
assert.NoError(err)
111-
assert.Equal(http.StatusOK, resp.StatusCode)
112-
assert.Error(parseError)
113-
})
112+
resp, err := client.Do(req)
113+
assert.NoError(err)
114+
assert.Equal(http.StatusOK, resp.StatusCode)
115+
assert.Error(parseError)
116+
},
117+
)
114118
}
115119
}
116120

@@ -249,37 +253,50 @@ func TestWebhooks(t *testing.T) {
249253
"X-Gitlab-Event": []string{"Deployment Hook"},
250254
},
251255
},
256+
{
257+
name: "ReleaseEvent",
258+
event: ReleaseEvents,
259+
typ: ReleaseEventPayload{},
260+
filename: "../testdata/gitlab/release-event.json",
261+
headers: http.Header{
262+
"X-Gitlab-Event": []string{"Release Hook"},
263+
},
264+
},
252265
}
253266

254267
for _, tt := range tests {
255268
tc := tt
256269
client := &http.Client{}
257-
t.Run(tt.name, func(t *testing.T) {
258-
t.Parallel()
259-
payload, err := os.Open(tc.filename)
260-
assert.NoError(err)
261-
defer func() {
262-
_ = payload.Close()
263-
}()
270+
t.Run(
271+
tt.name, func(t *testing.T) {
272+
t.Parallel()
273+
payload, err := os.Open(tc.filename)
274+
assert.NoError(err)
275+
defer func() {
276+
_ = payload.Close()
277+
}()
264278

265-
var parseError error
266-
var results interface{}
267-
server := newServer(func(w http.ResponseWriter, r *http.Request) {
268-
results, parseError = hook.Parse(r, tc.event)
269-
})
270-
defer server.Close()
271-
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
272-
assert.NoError(err)
273-
req.Header = tc.headers
274-
req.Header.Set("Content-Type", "application/json")
275-
req.Header.Set("X-Gitlab-Token", "sampleToken!")
279+
var parseError error
280+
var results interface{}
281+
server := newServer(
282+
func(w http.ResponseWriter, r *http.Request) {
283+
results, parseError = hook.Parse(r, tc.event)
284+
},
285+
)
286+
defer server.Close()
287+
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
288+
assert.NoError(err)
289+
req.Header = tc.headers
290+
req.Header.Set("Content-Type", "application/json")
291+
req.Header.Set("X-Gitlab-Token", "sampleToken!")
276292

277-
resp, err := client.Do(req)
278-
assert.NoError(err)
279-
assert.Equal(http.StatusOK, resp.StatusCode)
280-
assert.NoError(parseError)
281-
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
282-
})
293+
resp, err := client.Do(req)
294+
assert.NoError(err)
295+
assert.Equal(http.StatusOK, resp.StatusCode)
296+
assert.NoError(parseError)
297+
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
298+
},
299+
)
283300
}
284301
}
285302

@@ -306,32 +323,36 @@ func TestJobHooks(t *testing.T) {
306323
for _, tt := range tests {
307324
tc := tt
308325
client := &http.Client{}
309-
t.Run(tt.name, func(t *testing.T) {
310-
t.Parallel()
311-
payload, err := os.Open(tc.filename)
312-
assert.NoError(err)
313-
defer func() {
314-
_ = payload.Close()
315-
}()
326+
t.Run(
327+
tt.name, func(t *testing.T) {
328+
t.Parallel()
329+
payload, err := os.Open(tc.filename)
330+
assert.NoError(err)
331+
defer func() {
332+
_ = payload.Close()
333+
}()
316334

317-
var parseError error
318-
var results interface{}
319-
server := newServer(func(w http.ResponseWriter, r *http.Request) {
320-
results, parseError = hook.Parse(r, tc.events...)
321-
})
322-
defer server.Close()
323-
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
324-
assert.NoError(err)
325-
req.Header = tc.headers
326-
req.Header.Set("Content-Type", "application/json")
327-
req.Header.Set("X-Gitlab-Token", "sampleToken!")
335+
var parseError error
336+
var results interface{}
337+
server := newServer(
338+
func(w http.ResponseWriter, r *http.Request) {
339+
results, parseError = hook.Parse(r, tc.events...)
340+
},
341+
)
342+
defer server.Close()
343+
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
344+
assert.NoError(err)
345+
req.Header = tc.headers
346+
req.Header.Set("Content-Type", "application/json")
347+
req.Header.Set("X-Gitlab-Token", "sampleToken!")
328348

329-
resp, err := client.Do(req)
330-
assert.NoError(err)
331-
assert.Equal(http.StatusOK, resp.StatusCode)
332-
assert.NoError(parseError)
333-
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
334-
})
349+
resp, err := client.Do(req)
350+
assert.NoError(err)
351+
assert.Equal(http.StatusOK, resp.StatusCode)
352+
assert.NoError(parseError)
353+
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
354+
},
355+
)
335356
}
336357
}
337358

@@ -485,31 +506,35 @@ func TestSystemHooks(t *testing.T) {
485506
for _, tt := range tests {
486507
tc := tt
487508
client := &http.Client{}
488-
t.Run(tt.name, func(t *testing.T) {
489-
t.Parallel()
490-
payload, err := os.Open(tc.filename)
491-
assert.NoError(err)
492-
defer func() {
493-
_ = payload.Close()
494-
}()
509+
t.Run(
510+
tt.name, func(t *testing.T) {
511+
t.Parallel()
512+
payload, err := os.Open(tc.filename)
513+
assert.NoError(err)
514+
defer func() {
515+
_ = payload.Close()
516+
}()
495517

496-
var parseError error
497-
var results interface{}
498-
server := newServer(func(w http.ResponseWriter, r *http.Request) {
499-
results, parseError = hook.Parse(r, SystemHookEvents, tc.event)
500-
})
501-
defer server.Close()
502-
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
503-
assert.NoError(err)
504-
req.Header.Set("Content-Type", "application/json")
505-
req.Header.Set("X-Gitlab-Token", "sampleToken!")
506-
req.Header.Set("X-Gitlab-Event", "System Hook")
518+
var parseError error
519+
var results interface{}
520+
server := newServer(
521+
func(w http.ResponseWriter, r *http.Request) {
522+
results, parseError = hook.Parse(r, SystemHookEvents, tc.event)
523+
},
524+
)
525+
defer server.Close()
526+
req, err := http.NewRequest(http.MethodPost, server.URL+path, payload)
527+
assert.NoError(err)
528+
req.Header.Set("Content-Type", "application/json")
529+
req.Header.Set("X-Gitlab-Token", "sampleToken!")
530+
req.Header.Set("X-Gitlab-Event", "System Hook")
507531

508-
resp, err := client.Do(req)
509-
assert.NoError(err)
510-
assert.Equal(http.StatusOK, resp.StatusCode)
511-
assert.NoError(parseError)
512-
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
513-
})
532+
resp, err := client.Do(req)
533+
assert.NoError(err)
534+
assert.Equal(http.StatusOK, resp.StatusCode)
535+
assert.NoError(parseError)
536+
assert.Equal(reflect.TypeOf(tc.typ), reflect.TypeOf(results))
537+
},
538+
)
514539
}
515540
}

gitlab/payload.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,43 @@ type GroupMemberUpdatedEventPayload struct {
485485
UserID int64 `json:"user_id"`
486486
}
487487

488+
// ReleaseEventPayload contains the information about GitLab's release event
489+
type ReleaseEventPayload struct {
490+
ID int `json:"id"`
491+
CreatedAt customTime `json:"created_at"`
492+
Description string `json:"description"`
493+
Name string `json:"name"`
494+
ReleasedAt customTime `json:"released_at"`
495+
Tag string `json:"tag"`
496+
ObjectKind string `json:"object_kind"`
497+
Project Project `json:"project"`
498+
URL string `json:"url"`
499+
Action string `json:"action"`
500+
Assets Assets `json:"assets"`
501+
}
502+
503+
// Assets represent artefacts and links associated to a release
504+
type Assets struct {
505+
Count int `json:"count"`
506+
Links []Link `json:"links"`
507+
Sources []AssetSource `json:"sources"`
508+
}
509+
510+
// Link represent a generic html link
511+
type Link struct {
512+
ID int `json:"id"`
513+
External bool `json:"external"`
514+
LinkType string `json:"link_type"`
515+
Name string `json:"name"`
516+
URL string `json:"url"`
517+
}
518+
519+
// AssetSource represent the download url for an asset
520+
type AssetSource struct {
521+
Format string `json:"format"`
522+
URL string `json:"url"`
523+
}
524+
488525
// Issue contains all of the GitLab issue information
489526
type Issue struct {
490527
ID int64 `json:"id"`

0 commit comments

Comments
 (0)