diff --git a/scm/driver/harness/testdata/webhooks/branch_create.json.golden b/scm/driver/harness/testdata/webhooks/branch_create.json.golden index a534de4c2..967f51f17 100644 --- a/scm/driver/harness/testdata/webhooks/branch_create.json.golden +++ b/scm/driver/harness/testdata/webhooks/branch_create.json.golden @@ -1,7 +1,9 @@ { - "Ref": "refs/heads/new2", - "Before": "0000000000000000000000000000000000000000", - "After": "aeafa0e2e4ec6909ad75cb8fad57c0b1eb5986e6", + "Ref": { + "Name": "refs/heads/new2", + "Sha": "aeafa0e2e4ec6909ad75cb8fad57c0b1eb5986e6" + }, + "Action": "created", "Repo": { "ID": "13", "Namespace": "", @@ -15,25 +17,6 @@ "Created": "0001-01-01T00:00:00Z", "Updated": "0001-01-01T00:00:00Z" }, - "Commit": { - "Sha": "aeafa0e2e4ec6909ad75cb8fad57c0b1eb5986e6", - "Message": "version 4", - "Author": { - "Name": "Admin", - "Email": "admin@harness.io", - "Date": "0001-01-01T00:00:00Z", - "Login": "", - "Avatar": "" - }, - "Committer": { - "Name": "Admin", - "Email": "admin@harness.io", - "Date": "0001-01-01T00:00:00Z", - "Login": "", - "Avatar": "" - }, - "Link": "" - }, "Sender": { "ID": "0osgWsTZRsSZ8RWfjLRkEg", "Login": "0osgWsTZRsSZ8RWfjLRkEg", diff --git a/scm/driver/harness/testdata/webhooks/branch_delete.json b/scm/driver/harness/testdata/webhooks/branch_delete.json new file mode 100644 index 000000000..ba496b75d --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/branch_delete.json @@ -0,0 +1,34 @@ +{ + "trigger": "branch_deleted", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + }, + "principal": { + "id": 2, + "uid": "lv0euRhKRCyiXWzS7pOg6g", + "display_name": "Admin", + "email": "admin@harness.io", + "type": "user", + "created": 1701091219051, + "updated": 1701091219051 + }, + "ref": { + "name": "refs/heads/das", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + } + }, + "sha": "0000000000000000000000000000000000000000", + "old_sha": "0f1835abe08473e07863540712d8389984b72dad", + "forced": false +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/branch_delete.json.golden b/scm/driver/harness/testdata/webhooks/branch_delete.json.golden new file mode 100644 index 000000000..b9a0ad8f7 --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/branch_delete.json.golden @@ -0,0 +1,29 @@ +{ + "Ref": { + "Name": "refs/heads/das", + "Sha": "0000000000000000000000000000000000000000" + }, + "Action": "deleted", + "Repo": { + "ID": "16", + "Namespace": "", + "Name": "harness-core", + "Perm": null, + "Branch": "develop", + "Private": false, + "Clone": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "CloneSSH": "", + "Link": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "Created": "0001-01-01T00:00:00Z", + "Updated": "0001-01-01T00:00:00Z" + }, + "Sender": { + "ID": "lv0euRhKRCyiXWzS7pOg6g", + "Login": "lv0euRhKRCyiXWzS7pOg6g", + "Name": "Admin", + "Email": "admin@harness.io", + "Avatar": "", + "Created": "2023-11-27T05:20:19.051-08:00", + "Updated": "2023-11-27T05:20:19.051-08:00" + } +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/tag_create.json b/scm/driver/harness/testdata/webhooks/tag_create.json new file mode 100644 index 000000000..f67e9700b --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/tag_create.json @@ -0,0 +1,76 @@ +{ + "trigger": "tag_created", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + }, + "principal": { + "id": 2, + "uid": "lv0euRhKRCyiXWzS7pOg6g", + "display_name": "Admin", + "email": "admin@harness.io", + "type": "user", + "created": 1701091219051, + "updated": 1701091219051 + }, + "ref": { + "name": "refs/tags/asd", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + } + }, + "sha": "3e4da2d65c3631c3e84b52fabe714c978aff540b", + "head_commit": { + "sha": "0f1835abe08473e07863540712d8389984b72dad", + "message": "", + "author": { + "identity": { + "name": "admin", + "email": "admin@harness.io" + }, + "when": "2024-03-01T07:54:35-08:00" + }, + "committer": { + "identity": { + "name": "GitHub", + "email": "noreply@github.com" + }, + "when": "2024-03-01T07:54:35-08:00" + }, + "added": [], + "removed": [], + "modified": [] + }, + "commit": { + "sha": "0f1835abe08473e07863540712d8389984b72dad", + "message": "", + "author": { + "identity": { + "name": "Jenny James", + "email": "jenny.james@harness.io" + }, + "when": "2024-03-01T07:54:35-08:00" + }, + "committer": { + "identity": { + "name": "GitHub", + "email": "noreply@github.com" + }, + "when": "2024-03-01T07:54:35-08:00" + }, + "added": [], + "removed": [], + "modified": [] + }, + "old_sha": "0000000000000000000000000000000000000000", + "forced": false +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/tag_create.json.golden b/scm/driver/harness/testdata/webhooks/tag_create.json.golden new file mode 100644 index 000000000..f6a8a53e4 --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/tag_create.json.golden @@ -0,0 +1,29 @@ +{ + "Ref": { + "Name": "refs/tags/asd", + "Sha": "3e4da2d65c3631c3e84b52fabe714c978aff540b" + }, + "Action": "created", + "Repo": { + "ID": "16", + "Namespace": "", + "Name": "harness-core", + "Perm": null, + "Branch": "develop", + "Private": false, + "Clone": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "CloneSSH": "", + "Link": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "Created": "0001-01-01T00:00:00Z", + "Updated": "0001-01-01T00:00:00Z" + }, + "Sender": { + "ID": "lv0euRhKRCyiXWzS7pOg6g", + "Login": "lv0euRhKRCyiXWzS7pOg6g", + "Name": "Admin", + "Email": "admin@harness.io", + "Avatar": "", + "Created": "2023-11-27T05:20:19.051-08:00", + "Updated": "2023-11-27T05:20:19.051-08:00" + } +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/tag_delete.json b/scm/driver/harness/testdata/webhooks/tag_delete.json new file mode 100644 index 000000000..3fa9348ee --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/tag_delete.json @@ -0,0 +1,34 @@ +{ + "trigger": "tag_deleted", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + }, + "principal": { + "id": 2, + "uid": "lv0euRhKRCyiXWzS7pOg6g", + "display_name": "Admin", + "email": "admin@harness.io", + "type": "user", + "created": 1701091219051, + "updated": 1701091219051 + }, + "ref": { + "name": "refs/tags/asd", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + } + }, + "sha": "0000000000000000000000000000000000000000", + "old_sha": "3e4da2d65c3631c3e84b52fabe714c978aff540b", + "forced": false +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/tag_delete.json.golden b/scm/driver/harness/testdata/webhooks/tag_delete.json.golden new file mode 100644 index 000000000..cfd67a8b1 --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/tag_delete.json.golden @@ -0,0 +1,29 @@ +{ + "Ref": { + "Name": "refs/tags/asd", + "Sha": "0000000000000000000000000000000000000000" + }, + "Action": "deleted", + "Repo": { + "ID": "16", + "Namespace": "", + "Name": "harness-core", + "Perm": null, + "Branch": "develop", + "Private": false, + "Clone": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "CloneSSH": "", + "Link": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "Created": "0001-01-01T00:00:00Z", + "Updated": "0001-01-01T00:00:00Z" + }, + "Sender": { + "ID": "lv0euRhKRCyiXWzS7pOg6g", + "Login": "lv0euRhKRCyiXWzS7pOg6g", + "Name": "Admin", + "Email": "admin@harness.io", + "Avatar": "", + "Created": "2023-11-27T05:20:19.051-08:00", + "Updated": "2023-11-27T05:20:19.051-08:00" + } +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/tag_update.json b/scm/driver/harness/testdata/webhooks/tag_update.json new file mode 100644 index 000000000..b16eac070 --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/tag_update.json @@ -0,0 +1,100 @@ +{ + "trigger": "tag_updated", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + }, + "principal": { + "id": 2, + "uid": "lv0euRhKRCyiXWzS7pOg6g", + "display_name": "Admin", + "email": "admin@harness.io", + "type": "user", + "created": 1701091219051, + "updated": 1701091219051 + }, + "ref": { + "name": "refs/tags/ddxas", + "repo": { + "id": 16, + "path": "kmpySmUISimoRrJL6NL73w/harness-core", + "identifier": "harness-core", + "default_branch": "develop", + "git_url": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "uid": "harness-core" + } + }, + "sha": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "head_commit": { + "sha": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "message": "Asd", + "author": { + "identity": { + "name": "Abhinav Singh", + "email": "abhinav.singh@harness.io" + }, + "when": "2024-03-07T03:18:51-08:00" + }, + "committer": { + "identity": { + "name": "Abhinav Singh", + "email": "abhinav.singh@harness.io" + }, + "when": "2024-03-07T03:18:51-08:00" + }, + "added": [], + "removed": [], + "modified": [] + }, + "commits": [ + { + "sha": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "message": "Asd", + "author": { + "identity": { + "name": "Abhinav Singh", + "email": "abhinav.singh@harness.io" + }, + "when": "2024-03-07T03:18:51-08:00" + }, + "committer": { + "identity": { + "name": "Abhinav Singh", + "email": "abhinav.singh@harness.io" + }, + "when": "2024-03-07T03:18:51-08:00" + }, + "added": [], + "removed": [], + "modified": [] + } + ], + "total_commits_count": 1, + "commit": { + "sha": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "message": "Asd", + "author": { + "identity": { + "name": "Abhinav Singh", + "email": "abhinav.singh@harness.io" + }, + "when": "2024-03-07T03:18:51-08:00" + }, + "committer": { + "identity": { + "name": "Abhinav Singh", + "email": "abhinav.singh@harness.io" + }, + "when": "2024-03-07T03:18:51-08:00" + }, + "added": [], + "removed": [], + "modified": [] + }, + "old_sha": "0f1835abe08473e07863540712d8389984b72dad", + "forced": true +} \ No newline at end of file diff --git a/scm/driver/harness/testdata/webhooks/tag_update.json.golden b/scm/driver/harness/testdata/webhooks/tag_update.json.golden new file mode 100644 index 000000000..408447db1 --- /dev/null +++ b/scm/driver/harness/testdata/webhooks/tag_update.json.golden @@ -0,0 +1,67 @@ +{ + "Ref": "refs/tags/ddxas", + "Before": "0f1835abe08473e07863540712d8389984b72dad", + "After": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "Repo": { + "ID": "16", + "Namespace": "", + "Name": "harness-core", + "Perm": null, + "Branch": "develop", + "Private": false, + "Clone": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "CloneSSH": "", + "Link": "http://localhost:3000/git/kmpySmUISimoRrJL6NL73w/harness-core.git", + "Created": "0001-01-01T00:00:00Z", + "Updated": "0001-01-01T00:00:00Z" + }, + "Commit": { + "Sha": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "Message": "Asd", + "Author": { + "Name": "Abhinav Singh", + "Email": "abhinav.singh@harness.io", + "Date": "0001-01-01T00:00:00Z", + "Login": "", + "Avatar": "" + }, + "Committer": { + "Name": "Abhinav Singh", + "Email": "abhinav.singh@harness.io", + "Date": "0001-01-01T00:00:00Z", + "Login": "", + "Avatar": "" + }, + "Link": "" + }, + "Commits": [ + { + "Sha": "700b3dab8e7a5cebf5e1ce54e7dd5bde60099912", + "Message": "Asd", + "Author": { + "Name": "Abhinav Singh", + "Email": "abhinav.singh@harness.io", + "Date": "0001-01-01T00:00:00Z", + "Login": "", + "Avatar": "" + }, + "Committer": { + "Name": "Abhinav Singh", + "Email": "abhinav.singh@harness.io", + "Date": "0001-01-01T00:00:00Z", + "Login": "", + "Avatar": "" + }, + "Link": "" + } + ], + "Sender": { + "ID": "lv0euRhKRCyiXWzS7pOg6g", + "Login": "lv0euRhKRCyiXWzS7pOg6g", + "Name": "Admin", + "Email": "admin@harness.io", + "Avatar": "", + "Created": "2023-11-27T05:20:19.051-08:00", + "Updated": "2023-11-27T05:20:19.051-08:00" + } +} \ No newline at end of file diff --git a/scm/driver/harness/webhook.go b/scm/driver/harness/webhook.go index 73e7bd920..33be360b4 100644 --- a/scm/driver/harness/webhook.go +++ b/scm/driver/harness/webhook.go @@ -11,6 +11,7 @@ import ( "io/ioutil" "net/http" "strconv" + "strings" "time" "github.com/drone/go-scm/scm" @@ -37,8 +38,12 @@ func (s *webhookService) Parse(req *http.Request, fn scm.SecretFunc) (scm.Webhoo // hook, err = s.parseDeleteHook(data) // case "issues": // hook, err = s.parseIssueHook(data) - case "branch_created", "branch_updated": + case "branch_updated", "tag_updated": hook, err = s.parsePushHook(data) + case "branch_created", "branch_deleted": + hook, err = s.parseBranchHook(data) + case "tag_created", "tag_deleted": + hook, err = s.parseTagHook(data) case "pullreq_created", "pullreq_reopened", "pullreq_branch_updated", "pullreq_closed", "pullreq_merged": hook, err = s.parsePullRequestHook(data) case "pullreq_comment_created": @@ -99,6 +104,20 @@ func (s *webhookService) parsePullRequestCommentHook(data []byte) (scm.Webhook, return convertPullRequestCommentHook(dst), err } +func (s *webhookService) parseBranchHook(data []byte) (scm.Webhook, error) { + // using pushHook object since it is same as branch events + dst := new(pushHook) + err := json.Unmarshal(data, dst) + return convertBranchHook(dst), err +} + +func (s *webhookService) parseTagHook(data []byte) (scm.Webhook, error) { + // using pushHook object since it is same as tag events + dst := new(pushHook) + err := json.Unmarshal(data, dst) + return convertTagHook(dst), err +} + // native data structures type ( repo struct { @@ -218,7 +237,7 @@ type ( // native data structure conversion func convertPullRequestHook(src *pullRequestHook) *scm.PullRequestHook { return &scm.PullRequestHook{ - Action: convertAction(src.Trigger), + Action: convertPRAction(src.Trigger), PullRequest: convertPullReq(src.PullReq, src.Ref, src.HeadCommit), Repo: convertRepo(src.Repo), Sender: convertUser(src.Principal), @@ -267,9 +286,33 @@ func convertPullRequestCommentHook(src *pullRequestCommentHook) *scm.PullRequest Sender: convertUser(src.Principal), } } +func convertBranchHook(dst *pushHook) *scm.BranchHook { + return &scm.BranchHook{ + Ref: convertRef(dst), + Repo: convertRepo(dst.Repo), + Action: convertBranchAction(dst.Trigger), + Sender: convertUser(dst.Principal), + } +} + +func convertTagHook(dst *pushHook) *scm.TagHook { + return &scm.TagHook{ + Ref: convertRef(dst), + Repo: convertRepo(dst.Repo), + Action: convertTagAction(dst.Trigger), + Sender: convertUser(dst.Principal), + } +} -func convertAction(src string) (action scm.Action) { - switch src { +func convertRef(dst *pushHook) scm.Reference { + return scm.Reference{ + Name: dst.Ref.Name, + Sha: dst.Sha, + } +} + +func convertPRAction(src string) (action scm.Action) { + switch strings.ToLower(src) { case "pullreq_created": return scm.ActionCreate case "pullreq_branch_updated": @@ -281,7 +324,29 @@ func convertAction(src string) (action scm.Action) { case "pullreq_merged": return scm.ActionMerge default: - return + return scm.ActionUnknown + } +} + +func convertBranchAction(src string) (action scm.Action) { + switch strings.ToLower(src) { + case "branch_created": + return scm.ActionCreate + case "branch_deleted": + return scm.ActionDelete + default: + return scm.ActionUnknown + } +} + +func convertTagAction(src string) (action scm.Action) { + switch strings.ToLower(src) { + case "tag_created": + return scm.ActionCreate + case "tag_deleted": + return scm.ActionDelete + default: + return scm.ActionUnknown } } diff --git a/scm/driver/harness/webhook_test.go b/scm/driver/harness/webhook_test.go index 26966db2b..a4cf093b1 100644 --- a/scm/driver/harness/webhook_test.go +++ b/scm/driver/harness/webhook_test.go @@ -31,7 +31,7 @@ func TestWebhooks(t *testing.T) { event: "branch_created", before: "testdata/webhooks/branch_create.json", after: "testdata/webhooks/branch_create.json.golden", - obj: new(scm.PushHook), + obj: new(scm.BranchHook), }, // push branch update { @@ -40,6 +40,38 @@ func TestWebhooks(t *testing.T) { after: "testdata/webhooks/branch_updated.json.golden", obj: new(scm.PushHook), }, + // push branch delete + { + event: "branch_deleted", + before: "testdata/webhooks/branch_delete.json", + after: "testdata/webhooks/branch_delete.json.golden", + obj: new(scm.BranchHook), + }, + // + // tag events + // + // push tag create + { + event: "tag_created", + before: "testdata/webhooks/tag_create.json", + after: "testdata/webhooks/tag_create.json.golden", + obj: new(scm.TagHook), + }, + // push tag update + { + event: "tag_updated", + before: "testdata/webhooks/tag_update.json", + after: "testdata/webhooks/tag_update.json.golden", + obj: new(scm.PushHook), + }, + // push tag delete + { + event: "tag_deleted", + before: "testdata/webhooks/tag_delete.json", + after: "testdata/webhooks/tag_delete.json.golden", + obj: new(scm.TagHook), + }, + // // pull request events //