From 83867d6226c162c1bc084cde5c197be2aafa1c50 Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 13:47:38 -0500 Subject: [PATCH 01/11] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index e0cc608..7fc3f12 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ + +# IMPORTANT!! +## forked from yyx990803/pod + +I needed to support webhooks coming from Microsoft Team Foundation Services ( TFS ) +so i changed a few things in /web/app.js to handle webhooks coming from TFS. + + # POD - git push deploy for Node.js ![screenshot](http://i.imgur.com/pda21KY.png) From 174f7fd68bcf8955801f88c1a0dd0841a390e83a Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:26:06 -0500 Subject: [PATCH 02/11] Update app.js Added support for TFS webhook's --- web/app.js | 56 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/web/app.js b/web/app.js index b5d3d49..491c9c0 100644 --- a/web/app.js +++ b/web/app.js @@ -66,12 +66,22 @@ app.post('/hooks/:appid', express.bodyParser(), function (req, res) { } } - if (app && verify(req, app, payload)) { - executeHook(appid, app, payload, function () { + // handle web hook from TFS + if(req.headers['tfs-web-hook']){ + if (app && verifyTFS(req, app, payload)) { + executeHook(appid, app, payload, function () { + res.end(); + }) + } + }else{ + // Handle web hook from git or bibucket + if (app && verify(req, app, payload)) { + executeHook(appid, app, payload, function () { + res.end() + }) + } else { res.end() - }) - } else { - res.end() + } } }) @@ -93,31 +103,38 @@ pod.once('ready', function () { // Helpers function verify (req, app, payload) { + var skipGitUrlCheck = false // skips the check for gitUrl : only happens if coming from TFS + var commit + // not even a remote app if (!app.remote) return // check repo match var repo = payload.repository var repoURL - - if (repo.links && /bitbucket\.org/.test(repo.links.html.href)) { - console.log('\nreceived webhook request from: ' + repo.links.html.href) - + + // check comming from tfs + // NOTE: you need to add the following to your headers when creating the webhook in TFS + // TFS-Web-Hook:true + if(req.headers['tfs-web-hook']){ + repoURL = repo.url + commit = payload.resource.refUpdates + skipGitUrlCheck = true + }else if (repo.links && /bitbucket\.org/.test(repo.links.html.href)) { repoURL = repo.links.html.href } else { - console.log('\nreceived webhook request from: ' + repo.url) - repoURL = repo.url } - + + console.log('\nreceived webhook request from: ' + repoURL) + if (!repoURL) return - if (ghURL(repoURL).repopath !== ghURL(app.remote).repopath) { + if (!skipGitUrlCheck && ghURL(repoURL).repopath !== ghURL(app.remote).repopath) { console.log('aborted.') return } - var commit // support bitbucket webhooks payload structure if (/bitbucket\.org/.test(repoURL)) { @@ -138,6 +155,13 @@ function verify (req, app, payload) { console.log('aborted.') return } + + // check branch match + return checkBranch(commit, app, payload) +} + +// handle checking the branch +function checkBranch(commit, app, payload){ // check branch match var ref = commit.name ? commit.name : payload.ref @@ -145,10 +169,12 @@ function verify (req, app, payload) { var branch = ref.replace('refs/heads/', ''), expected = app.branch || 'master' + console.log('expected branch: ' + expected + ', got branch: ' + branch) + if (branch !== expected) { console.log('aborted.') - return + return false } return true } From b3e2c1c66a85552efdfbf14f5ee15f66c6842d70 Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:27:02 -0500 Subject: [PATCH 03/11] Update app.js --- web/app.js | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/web/app.js b/web/app.js index 491c9c0..a857628 100644 --- a/web/app.js +++ b/web/app.js @@ -65,24 +65,15 @@ app.post('/hooks/:appid', express.bodyParser(), function (req, res) { return res.status(500).end() } } - - // handle web hook from TFS - if(req.headers['tfs-web-hook']){ - if (app && verifyTFS(req, app, payload)) { - executeHook(appid, app, payload, function () { - res.end(); - }) - } - }else{ - // Handle web hook from git or bibucket - if (app && verify(req, app, payload)) { - executeHook(appid, app, payload, function () { - res.end() - }) - } else { + + if (app && verify(req, app, payload)) { + executeHook(appid, app, payload, function () { res.end() - } + }) + } else { + res.end() } + }) // listen when API is ready From fd15e4eaf999d3b39aad9e9e4b19d3d02a9117fc Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:30:23 -0500 Subject: [PATCH 04/11] Update app.js fixed TFS url JSON obj path --- web/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app.js b/web/app.js index a857628..63eb099 100644 --- a/web/app.js +++ b/web/app.js @@ -108,7 +108,7 @@ function verify (req, app, payload) { // NOTE: you need to add the following to your headers when creating the webhook in TFS // TFS-Web-Hook:true if(req.headers['tfs-web-hook']){ - repoURL = repo.url + repoURL = repo.resource.url commit = payload.resource.refUpdates skipGitUrlCheck = true }else if (repo.links && /bitbucket\.org/.test(repo.links.html.href)) { From 34564b9d6b6b2e3095190e59546eb89d49e68546 Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:31:27 -0500 Subject: [PATCH 05/11] Create tfs-webhook-sample.json Added example webhook request JSON object from TFS for reference when making pull request --- web/tfs-webhook-sample.json | 100 ++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 web/tfs-webhook-sample.json diff --git a/web/tfs-webhook-sample.json b/web/tfs-webhook-sample.json new file mode 100644 index 0000000..c78bd9e --- /dev/null +++ b/web/tfs-webhook-sample.json @@ -0,0 +1,100 @@ +{ + "subscriptionId":"d2eddcd8-d1f9-43c7-ba8f-629bdb97b29b", + "notificationId":17, + "id":"d891cdac-47f4-4882-abf9-cb3e71291b1b", + "eventType":"git.push", + "publisherId":"tfs", + "scope":"all", + "message":{ + "text":"cHerendeen pushed updates to branch stable of WebPortal\r\n(https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/#version=GBstable)", + "html":"cHerendeen pushed updates to branch stable of WebPortal", + "markdown":"cHerendeen pushed updates to branch [stable](https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/#version=GBstable) of [WebPortal](https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/)" + }, + "detailedMessage":{ + "text":"cHerendeen pushed 1 commit to branch stable of WebPortal\r\n - auto push test again… 5f6bcc4b (https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/commit/5f6bcc4b0023e986102cd99002ccb89348c84a76)", + "html":"cHerendeen pushed 1 commit to branch stable of WebPortal\r\n
    \r\n
  • auto push test again… 5f6bcc4b
  • \r\n
", + "markdown":"cHerendeen pushed 1 commit to branch [stable](https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/#version=GBstable) of [WebPortal](https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/)\r\n* auto push test again… [5f6bcc4b](https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal/commit/5f6bcc4b0023e986102cd99002ccb89348c84a76)" + }, + "resource":{ + "commits":[ + { + "commitId":"5f6bcc4b0023e986102cd99002ccb89348c84a76", + "author":{ + "name":"Clay Herendeen", + "email":"cherendeen@envative.com", + "date":"2017-01-20T18:59:56Z" + }, + "committer":{ + "name":"Clay Herendeen", + "email":"cherendeen@envative.com", + "date":"2017-01-20T18:59:56Z" + }, + "comment":"auto push test again…", + "url":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9/commits/5f6bcc4b0023e986102cd99002ccb89348c84a76" + } + ], + "refUpdates":[ + { + "name":"refs/heads/stable", + "oldObjectId":"19396a7d5b0967fb58ff7bd1b0b0827126333bce", + "newObjectId":"5f6bcc4b0023e986102cd99002ccb89348c84a76" + } + ], + "repository":{ + "id":"fe3be7e8-f759-4a1d-be68-a30f23aad3e9", + "name":"WebPortal", + "url":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9", + "project":{ + "id":"7f367f39-6695-4c77-8be7-aebf58d7e414", + "name":"OBG Safety Moments App", + "url":"https://envative.visualstudio.com/_apis/projects/7f367f39-6695-4c77-8be7-aebf58d7e414", + "state":"wellFormed" + }, + "defaultBranch":"refs/heads/master", + "remoteUrl":"https://envative.visualstudio.com/OBG%20Safety%20Moments%20App/_git/WebPortal" + }, + "pushedBy":{ + "id":"a13c2079-d832-4b81-8a40-683fb51e9b61", + "displayName":"cHerendeen", + "uniqueName":"cherendeen@envative.com", + "url":"https://app.vssps.visualstudio.com/Afbb8d8ef-76f1-415d-abd8-87c55ea8fb64/_apis/Identities/a13c2079-d832-4b81-8a40-683fb51e9b61", + "imageUrl":"https://envative.visualstudio.com/_api/_common/identityImage?id=a13c2079-d832-4b81-8a40-683fb51e9b61" + }, + "pushId":10569, + "date":"2017-01-20T18:59:58.5916971Z", + "url":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9/pushes/10569", + "_links":{ + "self":{ + "href":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9/pushes/10569" + }, + "repository":{ + "href":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9" + }, + "commits":{ + "href":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9/pushes/10569/commits" + }, + "pusher":{ + "href":"https://app.vssps.visualstudio.com/Afbb8d8ef-76f1-415d-abd8-87c55ea8fb64/_apis/Identities/a13c2079-d832-4b81-8a40-683fb51e9b61" + }, + "refs":{ + "href":"https://envative.visualstudio.com/_apis/git/repositories/fe3be7e8-f759-4a1d-be68-a30f23aad3e9/refs" + } + } + }, + "resourceVersion":"1.0", + "resourceContainers":{ + "collection":{ + "id":"81938269-1970-4a66-8848-6da1f799e6cf", + "baseUrl":"https://envative.visualstudio.com/" + }, + "account":{ + "id":"fbb8d8ef-76f1-415d-abd8-87c55ea8fb64", + "baseUrl":"https://envative.visualstudio.com/" + }, + "project":{ + "id":"7f367f39-6695-4c77-8be7-aebf58d7e414", + "baseUrl":"https://envative.visualstudio.com/" + } + }, + "createdDate":"2017-01-20T19:00:02.410893Z" +} From 3b3d5f8f921ad8ecb8773dc69dad2542ed297ede Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:34:48 -0500 Subject: [PATCH 06/11] Update app.js --- web/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/app.js b/web/app.js index 63eb099..2eadf71 100644 --- a/web/app.js +++ b/web/app.js @@ -108,7 +108,8 @@ function verify (req, app, payload) { // NOTE: you need to add the following to your headers when creating the webhook in TFS // TFS-Web-Hook:true if(req.headers['tfs-web-hook']){ - repoURL = repo.resource.url + repo = payload.resource.repository + repoURL = repo.url commit = payload.resource.refUpdates skipGitUrlCheck = true }else if (repo.links && /bitbucket\.org/.test(repo.links.html.href)) { From a44b981a0ddca7d793314475db143f0968252093 Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:36:40 -0500 Subject: [PATCH 07/11] Update app.js --- web/app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/app.js b/web/app.js index 2eadf71..2b2086a 100644 --- a/web/app.js +++ b/web/app.js @@ -110,7 +110,6 @@ function verify (req, app, payload) { if(req.headers['tfs-web-hook']){ repo = payload.resource.repository repoURL = repo.url - commit = payload.resource.refUpdates skipGitUrlCheck = true }else if (repo.links && /bitbucket\.org/.test(repo.links.html.href)) { repoURL = repo.links.html.href @@ -129,7 +128,10 @@ function verify (req, app, payload) { // support bitbucket webhooks payload structure - if (/bitbucket\.org/.test(repoURL)) { + if(req.headers['tfs-web-hook']){ + // From TFS + commit = payload.resource.refUpdates + }else if (/bitbucket\.org/.test(repoURL)) { commit = payload.push.changes[0].new commit.message = commit.target.message From 2d3e26d212cdfdfe84a85d4d517559a44338c269 Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:39:55 -0500 Subject: [PATCH 08/11] Update app.js --- web/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/app.js b/web/app.js index 2b2086a..2b8e28d 100644 --- a/web/app.js +++ b/web/app.js @@ -131,6 +131,7 @@ function verify (req, app, payload) { if(req.headers['tfs-web-hook']){ // From TFS commit = payload.resource.refUpdates + commit.message = payload.resource.commits[payload.resource.commits.length - 1].comment }else if (/bitbucket\.org/.test(repoURL)) { commit = payload.push.changes[0].new @@ -159,7 +160,7 @@ function checkBranch(commit, app, payload){ // check branch match var ref = commit.name ? commit.name : payload.ref - if (!ref) return + if (!ref) return false var branch = ref.replace('refs/heads/', ''), expected = app.branch || 'master' From 00435d79303f06118cf0f8696648deabc55f0ddd Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:42:04 -0500 Subject: [PATCH 09/11] Update app.js --- web/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app.js b/web/app.js index 2b8e28d..d9ae4ac 100644 --- a/web/app.js +++ b/web/app.js @@ -130,7 +130,7 @@ function verify (req, app, payload) { // support bitbucket webhooks payload structure if(req.headers['tfs-web-hook']){ // From TFS - commit = payload.resource.refUpdates + commit = payload.resource.refUpdates[payload.resource.refUpdates.length -1] commit.message = payload.resource.commits[payload.resource.commits.length - 1].comment }else if (/bitbucket\.org/.test(repoURL)) { commit = payload.push.changes[0].new From 697d32240592f5316f25764d3f7d38611886b46e Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:45:03 -0500 Subject: [PATCH 10/11] Update README.md --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 7fc3f12..6c180f3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,4 @@ -# IMPORTANT!! -## forked from yyx990803/pod - -I needed to support webhooks coming from Microsoft Team Foundation Services ( TFS ) -so i changed a few things in /web/app.js to handle webhooks coming from TFS. - - # POD - git push deploy for Node.js ![screenshot](http://i.imgur.com/pda21KY.png) From c52c057e71281a12d81d65221612b7fe0e80ff5a Mon Sep 17 00:00:00 2001 From: Clayton Herendeen Date: Fri, 20 Jan 2017 14:45:33 -0500 Subject: [PATCH 11/11] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6c180f3..e0cc608 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - # POD - git push deploy for Node.js ![screenshot](http://i.imgur.com/pda21KY.png)