diff --git a/bin/probot b/bin/probot new file mode 100755 index 0000000..7a9d76f --- /dev/null +++ b/bin/probot @@ -0,0 +1,7 @@ +#!/usr/bin/env node + +require('commander') + .version(require('../package').version) + .usage(' [options]') + .command('run', 'run the bot') + .parse(process.argv) diff --git a/bin/probot-run b/bin/probot-run new file mode 100755 index 0000000..e99c9ec --- /dev/null +++ b/bin/probot-run @@ -0,0 +1,59 @@ +#!/usr/bin/env node + +require('dotenv').config(); + +const program = require('commander'); + +program + .usage('[options] ') + .option('-i, --integration ', 'ID of the GitHub Integration', process.env.INTEGRATION_ID) + .option('-s, --secret ', 'Webhook secret of the GitHub Integration', process.env.WEBHOOK_SECRET || 'development') + .option('-p, --port ', 'Port to start the server on', process.env.PORT || 3000) + .option('-P, --private-key ', 'Path to certificate of the GitHub Integration', path => { + try { + return require('fs').readFileSync(path); + } catch (err) { + console.warn(err.message); + process.exit(1); + } + }, process.env.PRIVATE_KEY) + .parse(process.argv); + +if(!program.integration) { + console.warn("Missing GitHub Integration ID.\nUse --integration flag or set INTEGRATION_ID environment variable."); + program.help(); +} + +if(!program.privateKey) { + try { + program.privateKey = require('fs').readFileSync('private-key.pem'); + } catch (err) { + console.warn("Missing GitHub Integration private key.\nUse --private-key flag or set PRIVATE_KEY environment variable."); + process.exit(1); + } +} + +const pkgConf = require('pkg-conf'); +const resolve = require('resolve').sync; +const createProbot = require('../'); + +const probot = createProbot({ + id: program.integration, + secret: program.secret, + cert: program.privateKey, + port: program.port +}); + +pkgConf('probot').then(pkg => { + program.args.concat(pkg.plugins || []).map(plugin => { + try { + const path = resolve(plugin, {basedir: process.cwd()}); + probot.load(require(path)) + } catch(err) { + console.warn(err.message); + process.exit(1); + } + }); + + probot.start(); +}); diff --git a/bin/probot.js b/bin/probot.js deleted file mode 100755 index 2b3751c..0000000 --- a/bin/probot.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node - -try { - require('dotenv-safe').load(); -} catch (err) { - console.log(err.message); - process.exit(1); -} - -const resolve = require('resolve'); -const pkgConf = require('pkg-conf'); -const probot = require('../index.js'); - -function loadPlugins(plugins) { - plugins.forEach(plugin => { - resolve(plugin, {basedir: process.cwd()}, (err, path) => { - if (err) { - throw err; - } else { - probot.log.debug('loading plugin %s', path); - require(path)(probot); - return path; - } - }); - }); -} - -loadPlugins(process.argv.slice(2)); -pkgConf('probot').then(pkg => loadPlugins(pkg.plugins || [])); diff --git a/docs/demo.js b/docs/demo.js deleted file mode 100644 index 70f728c..0000000 --- a/docs/demo.js +++ /dev/null @@ -1,19 +0,0 @@ -// Delete :+1: comments -const singleEmoji = /^\W*(:[\w-\+]+:|[\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])\W*$/g; -on('issue_comment.created') - .filter(event => event.payload.comment.body.match(singleEmoji)) - .deleteComment(); - -function isDeleted(event) { - return event.payload.action === 'deleted' && - event.payload.sender.type !== 'Bot'; -} - -// restore deleted comments but the one deleted by PRobot -on('issue_comment', 'commit_comment', 'pull_request_review_comment') -.filter(isDeleted) -.comment(` -Deleted comment from @{{ comment.user.login }} at {{ comment.updated_at }} ---- -{{ comment.body }} -`); diff --git a/docs/plugins.md b/docs/plugins.md index c7addda..b182a55 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -89,7 +89,7 @@ TODO: link to docs on getting running in development ``` $ npm install -g https://github.com/probot/probot -$ probot autoresponder.js +$ probot run ./autoresponder.js Listening on http://localhost:3000 ``` diff --git a/index.js b/index.js index e8a34e4..548d590 100644 --- a/index.js +++ b/index.js @@ -1,33 +1,39 @@ -const fs = require('fs'); const createWebhook = require('github-webhook-handler'); const createIntegration = require('github-integration'); - const createRobot = require('./lib/robot'); const createServer = require('./lib/server'); -const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET || 'development'; -const PORT = process.env.PORT || 3000; +module.exports = options => { + const webhook = createWebhook({path: '/', secret: options.secret}); + const integration = createIntegration({ + id: options.id, + cert: options.cert, + debug: process.env.LOG_LEVEL === 'trace' + }); + const server = createServer(webhook); + const robot = createRobot(integration, webhook); -const webhook = createWebhook({path: '/', secret: WEBHOOK_SECRET}); -const integration = createIntegration({ - id: process.env.INTEGRATION_ID, - cert: process.env.PRIVATE_KEY || fs.readFileSync('private-key.pem'), - debug: process.env.LOG_LEVEL === 'trace' -}); -const server = createServer(webhook); -const robot = createRobot(integration, webhook); + // Show trace for any unhandled rejections + process.on('unhandledRejection', reason => { + robot.log.error(reason); + }); -server.listen(PORT); + // Handle case when webhook creation fails + webhook.on('error', err => { + robot.log.error(err); + }); -console.log('Listening on http://localhost:' + PORT); + return { + server, + robot, -// Show trace for any unhandled rejections -process.on('unhandledRejection', reason => { - robot.log.error(reason); -}); + start() { + server.listen(options.port); + console.log('Listening on http://localhost:' + options.port); + }, -// Handle case when webhook creation fails -webhook.on('error', err => { - robot.log.error(err); -}); -module.exports = robot; + load(plugin) { + plugin(robot); + } + }; +}; diff --git a/lib/robot.js b/lib/robot.js index 1d0f5fa..aaeb1b8 100644 --- a/lib/robot.js +++ b/lib/robot.js @@ -1,9 +1,11 @@ const bunyan = require('bunyan'); +const bunyanFormat = require('bunyan-format'); const Context = require('./context'); const logger = bunyan.createLogger({ name: 'PRobot', - level: process.env.LOG_LEVEL || 'debug' + level: process.env.LOG_LEVEL || 'debug', + stream: bunyanFormat({outputMode: process.env.LOG_FORMAT || 'short'}) }); class Robot { diff --git a/package.json b/package.json index c39d74b..b2ce050 100644 --- a/package.json +++ b/package.json @@ -5,17 +5,19 @@ "repository": "https://github.com/probot/probot", "main": "index.js", "bin": { - "probot": "./bin/probot.js" + "probot": "./bin/probot" }, "scripts": { - "start": "probot", + "start": "probot run", "test": "mocha && xo" }, "author": "Brandon Keepers", "license": "ISC", "dependencies": { "bunyan": "^1.8.5", - "dotenv-safe": "^4.0.3", + "bunyan-format": "^0.2.1", + "commander": "^2.9.0", + "dotenv": "~4.0.0", "github-integration": "^1.0.0", "github-webhook-handler": "^0.6.0", "pkg-conf": "^2.0.0",