diff --git a/lib/pollTravis.js b/lib/pollTravis.js index 3c055d32..1b6eab0b 100644 --- a/lib/pollTravis.js +++ b/lib/pollTravis.js @@ -22,7 +22,9 @@ githubClient.authenticate({ token: process.env.GITHUB_TOKEN }) -function pollThenComment (owner, repoName, prId) { +exports.pollThenStatus = pollThenStatus + +function pollThenStatus (owner, repoName, prId) { const prInfo = prInfoStr({ owner, repoName, prId }) // we have to figure out what type of Travis polling we should perform, @@ -37,7 +39,7 @@ function pollThenComment (owner, repoName, prId) { if (hasAnyPrBuilds) { pollByPrThenComment(owner, repoName, prId) } else { - pollByCommitThenComment(owner, repoName, prId) + pollByCommitThenStatus(owner, repoName, prId) } }) } @@ -92,7 +94,7 @@ function pollByPrThenComment (owner, repoName, prId, checkNumber) { * * This is the case for readable-stream. */ -function pollByCommitThenComment (owner, repoName, prId) { +function pollByCommitThenStatus (owner, repoName, prId) { const prInfo = prInfoStr({ owner, repoName, prId }) githubClient.pullRequests.getCommits({ @@ -111,7 +113,7 @@ function pollByCommitThenComment (owner, repoName, prId) { } function pollTravisBuildBySha (options, checkNumber) { - const createGhComment = createGhCommentFn(options) + const createGhStatus = createGhStatusFn(options) const prInfo = prInfoStr(options) const shaToMatch = options.lastSha @@ -138,11 +140,14 @@ function pollTravisBuildBySha (options, checkNumber) { const lastState = lastBuildForCommit.state if (lastState === 'passed') { - return createGhComment(`[Travis build passed](https://travis-ci.org/${options.owner}/${options.repoName}/builds/${lastBuildForCommit.id}) :+1:`) + return createGhStatus('success', lastBuildForCommit.id, 'all tests passed') } else if (lastState === 'failed') { - return createGhComment(`[Travis build failed](https://travis-ci.org/${options.owner}/${options.repoName}/builds/${lastBuildForCommit.id}) :-1:`) + return createGhStatus('failure', lastBuildForCommit.id, 'build failure') } else if (~['created', 'started'].indexOf(lastState)) { console.log(`* ${prInfo} "${lastState}" build found, will do check #${checkNumber + 1} in 30 seconds`) + if (checkNumber === 1) { + createGhStatus('pending', lastBuildForCommit.id, 'build in progress') + } } else { return console.log(`* ${prInfo} Unknown build state: "${lastState}", stopping polling`) } @@ -157,7 +162,7 @@ function pollTravisBuildBySha (options, checkNumber) { function createGhCommentFn (options) { const prInfo = prInfoStr(options) - return (message, cb) => { + return (message) => { githubClient.issues.createComment({ user: options.owner, repo: options.repoName, @@ -172,8 +177,27 @@ function createGhCommentFn (options) { } } +function createGhStatusFn (options) { + const prInfo = prInfoStr(options) + + return (state, travisId, message) => { + githubClient.statuses.create({ + user: options.owner, + repo: options.repoName, + sha: options.lastSha, + target_url: `https://travis-ci.org/${options.owner}/${options.repoName}/builds/${travisId}`, + context: 'Travis CI via nodejs-github-bot', + state: state, + description: message + }, (err, res) => { + if (err) { + return console.error(`! ${prInfo} Error while updating GitHub PR status`, err.stack) + } + console.log(`* ${prInfo} Github PR status updated`) + }) + } +} + function prInfoStr (options) { return `${options.owner}/${options.repoName}/#${options.prId}` } - -exports.pollThenComment = pollThenComment diff --git a/server.js b/server.js index f28a09da..d4811b24 100644 --- a/server.js +++ b/server.js @@ -16,7 +16,7 @@ app.all('/hooks/github', (req, res) => { const repo = req.body.repository console.log(`* ${repo.owner.login}/${repo.name}/#${req.body.number} Opened, starting build checks!`) - pollTravis.pollThenComment(repo.owner.login, repo.name, parseInt(req.body.number)) + pollTravis.pollThenStatus(repo.owner.login, repo.name, parseInt(req.body.number)) } res.end() @@ -24,7 +24,7 @@ app.all('/hooks/github', (req, res) => { // to trigger polling manually app.get('/pr/:owner/:repo/:prId', (req, res) => { - pollTravis.pollThenComment(req.params.owner, req.params.repo, parseInt(req.params.prId)) + pollTravis.pollThenStatus(req.params.owner, req.params.repo, parseInt(req.params.prId)) res.end() })