mirror of
https://github.com/zhigang1992/probot.git
synced 2026-06-16 19:51:43 +08:00
123 lines
3.3 KiB
JavaScript
123 lines
3.3 KiB
JavaScript
const cacheManager = require('cache-manager')
|
|
const Webhooks = require('@octokit/webhooks')
|
|
const createApp = require('./github-app')
|
|
const createRobot = require('./robot')
|
|
const createServer = require('./server')
|
|
const createWebhookProxy = require('./webhook-proxy')
|
|
const resolve = require('./resolver')
|
|
const logger = require('./logger')
|
|
const logRequestErrors = require('./middleware/log-request-errors')
|
|
|
|
const cache = cacheManager.caching({
|
|
store: 'memory',
|
|
ttl: 60 * 60 // 1 hour
|
|
})
|
|
|
|
const defaultApps = [
|
|
require('./plugins/sentry'),
|
|
require('./plugins/stats'),
|
|
require('./plugins/default')
|
|
]
|
|
|
|
module.exports = (options = {}) => {
|
|
options.webhookPath = options.webhookPath || '/'
|
|
options.secret = options.secret || 'development'
|
|
|
|
const webhook = new Webhooks({path: options.webhookPath, secret: options.secret})
|
|
const app = createApp({
|
|
id: options.id,
|
|
cert: options.cert
|
|
})
|
|
const server = createServer({webhook: webhook.middleware, logger})
|
|
|
|
function errorHandler (err) {
|
|
switch (err.message) {
|
|
case 'X-Hub-Signature does not match blob signature':
|
|
case 'No X-Hub-Signature found on request':
|
|
logger.error('Go to https://github.com/settings/apps/YOUR_APP and verify that the Webhook secret matches the value of the WEBHOOK_SECRET environment variable.')
|
|
break
|
|
case 'error:0906D06C:PEM routines:PEM_read_bio:no start line':
|
|
case '{"message":"A JSON web token could not be decoded","documentation_url":"https://developer.github.com/v3"}':
|
|
logger.error('Your private key (usually a .pem file) is not correct. Go to https://github.com/settings/apps/YOUR_APP and generate a new PEM file. If you\'re deploying to Now, visit https://probot.github.io/docs/deployment/#now.')
|
|
break
|
|
default:
|
|
logger.error(err)
|
|
}
|
|
}
|
|
|
|
// Log all received webhooks
|
|
webhook.on('*', event => {
|
|
const webhookEvent = {
|
|
...event,
|
|
event: event.name
|
|
}
|
|
|
|
delete webhookEvent.name
|
|
|
|
logger.debug({event: webhookEvent}, 'Webhook received')
|
|
receive(webhookEvent)
|
|
})
|
|
|
|
// Log all webhook errors
|
|
webhook.on('error', errorHandler)
|
|
|
|
const robots = []
|
|
|
|
function receive (event) {
|
|
return Promise.all(robots.map(robot => robot.receive(event)))
|
|
}
|
|
|
|
function load (plugin) {
|
|
if (typeof plugin === 'string') {
|
|
plugin = resolve(plugin)
|
|
}
|
|
|
|
const robot = createRobot({app, cache, logger, catchErrors: true})
|
|
|
|
// Connect the router from the robot to the server
|
|
server.use(robot.router)
|
|
|
|
// Initialize the plugin
|
|
plugin(robot)
|
|
robots.push(robot)
|
|
|
|
return robot
|
|
}
|
|
|
|
function setup (apps) {
|
|
// Log all unhandled rejections
|
|
process.on('unhandledRejection', errorHandler)
|
|
|
|
// Load the given apps along with the default apps
|
|
apps.concat(defaultApps).forEach(app => load(app))
|
|
|
|
// Register error handler as the last middleware
|
|
server.use(logRequestErrors)
|
|
}
|
|
|
|
return {
|
|
server,
|
|
webhook,
|
|
receive,
|
|
logger,
|
|
load,
|
|
setup,
|
|
|
|
start () {
|
|
if (options.webhookProxy) {
|
|
createWebhookProxy({
|
|
url: options.webhookProxy,
|
|
port: options.port,
|
|
path: options.webhookPath,
|
|
logger
|
|
})
|
|
}
|
|
|
|
server.listen(options.port)
|
|
logger.info('Listening on http://localhost:' + options.port)
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports.createRobot = createRobot
|