Introduction to GitHub Webhook Handler
GitHub Webhook Handler is an essential tool that enables seamless integration between your GitHub repositories and external services or applications. By leveraging webhooks, you can automate workflows, trigger builds, and more. In this comprehensive guide, we will dive into several useful APIs that the GitHub Webhook Handler offers and provide code snippets for better understanding.
Setting Up the GitHub Webhook Handler
Before we delve into the various APIs, it’s important to set up the GitHub Webhook Handler for your repository. Follow the steps below:
const createHandler = require('github-webhook-handler');
const handler = createHandler({ path: '/webhook', secret: 'mysecret' });
Listening for Events
Once the handler is set up, you can listen for different GitHub events such as push, pull_request, issues, etc. Here’s an example:
handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
});
handler.on('pull_request', function (event) {
if (event.payload.action === 'opened') {
console.log('PR opened: %s', event.payload.pull_request.title);
}
});
handler.on('issues', function (event) {
if (event.payload.action === 'opened') {
console.log('Issue opened: %s', event.payload.issue.title);
}
});
Handling the Incoming Webhook
It’s crucial to properly handle incoming webhooks and respond to GitHub to confirm receipt. The example below demonstrates this:
const http = require('http');
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404;
res.end('no such location');
});
}).listen(7777);
console.log('Server listening on http://localhost:7777');
Example Application
To put it all together, here is an example node.js application that uses GitHub Webhook Handler to automatically label newly opened pull requests:
const createHandler = require('github-webhook-handler');
const handler = createHandler({ path: '/webhook', secret: 'mysecret' });
const http = require('http');
const axios = require('axios');
handler.on('pull_request', function (event) {
if (event.payload.action === 'opened') {
const pr = event.payload.pull_request;
const repo = event.payload.repository;
// Add a label to the new pull request
axios.post(`https://api.github.com/repos/${repo.owner.login}/${repo.name}/issues/${pr.number}/labels`, {
labels: ['new-pr']
}, {
headers: { 'Authorization': `token YOUR_GITHUB_TOKEN` }
})
.then(response => {
console.log('Label added', response.data);
})
.catch(error => {
console.error('Error adding label', error);
});
}
});
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404;
res.end('no such location');
});
}).listen(7777);
console.log('Server listening on http://localhost:7777');