GitHub Webhook Implementations
Quick developer friendly implementations for GitHub Webhooks
🔀 Git snippet cli
GitHub Webhook Implementations#
This page provides working examples of handling GitHub Webhooks in Java,
Node.js (Express), Node.js (Vanilla JS), and PHP, including signature validation and event handling.
🚀 Java (Spring Boot)#
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.HmacUtils;
import java.io.BufferedReader;
import java.io.IOException;
@RestController
public class GithubWebhookController {
private static final String SECRET = "YOUR_WEBHOOK_SECRET";
@PostMapping("/webhook")
public String handleWebhook(HttpServletRequest request) throws IOException {
// Read payload
StringBuilder payload = new StringBuilder();
try (BufferedReader reader = request.getReader()) {
String line;
while ((line = reader.readLine()) != null) {
payload.append(line);
}
}
// Verify signature (X-Hub-Signature-256)
String signature = request.getHeader("X-Hub-Signature-256");
if (!verifySignature(signature, payload.toString())) {
return "Invalid signature";
}
String event = request.getHeader("X-GitHub-Event");
if ("push".equals(event)) {
// Execute deployment script or command
runDeployScript();
}
return "OK";
}
private boolean verifySignature(String signature, String payload) {
if (signature == null) return false;
String expected = "sha256=" +
Hex.encodeHexString(HmacUtils.hmacSha256(SECRET, payload));
return expected.equals(signature);
}
private void runDeployScript() {
try {
ProcessBuilder pb = new ProcessBuilder(
"/bin/bash", "/path/to/deploy.sh"
);
pb.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}java⚡ Node.js (Express)#
import crypto from "crypto";
import express from "express";
const app = express();
const SECRET = "YOUR_WEBHOOK_SECRET";
app.use(express.raw({ type: "application/json" }));
function verifySignature(req) {
const signature = req.headers["x-hub-signature-256"];
const hmac = crypto.createHmac("sha256", SECRET);
const digest = "sha256=" + hmac.update(req.body).digest("hex");
return signature === digest;
}
app.post("/webhook", (req, res) => {
if (!verifySignature(req)) {
return res.status(401).send("Invalid signature");
}
const event = req.headers["x-github-event"];
if (event === "push") {
const { exec } = require("child_process");
exec("sh /path/to/deploy.sh");
}
res.send("OK");
});
app.listen(3000, () => console.log("Webhook server running on port 3000"));js⚡ Node.js (Vanilla JavaScript — No Framework)#
import crypto from "crypto";
import http from "http";
const SECRET = "YOUR_WEBHOOK_SECRET";
function verifySignature(signature, payload) {
if (!signature) return false;
const hmac = crypto.createHmac("sha256", SECRET);
const digest = "sha256=" + hmac.update(payload).digest("hex");
return signature === digest;
}
const server = http.createServer((req, res) => {
if (req.method !== "POST" || req.url !== "/webhook") {
res.writeHead(404);
return res.end("Not Found");
}
let body = [];
req.on("data", chunk => body.push(chunk));
req.on("end", () => {
const payload = Buffer.concat(body).toString();
const signature = req.headers["x-hub-signature-256"];
const event = req.headers["x-github-event"];
if (!verifySignature(signature, payload)) {
res.writeHead(401);
return res.end("Invalid signature");
}
if (event === "push") {
const { exec } = require("child_process");
exec("sh /path/to/deploy.sh");
}
res.end("OK");
});
});
server.listen(3001, () => {
console.log("Vanilla JS webhook listening on port 3001");
});js🐘 PHP (Native)#
<?php
$secret = "YOUR_WEBHOOK_SECRET";
// Read payload
$payload = file_get_contents("php://input");
$signature = $_SERVER["HTTP_X_HUB_SIGNATURE_256"] ?? "";
// Verify signature
$hash = "sha256=" . hash_hmac("sha256", $payload, $secret);
if (!hash_equals($hash, $signature)) {
http_response_code(401);
exit("Invalid signature");
}
// Handle event
$event = $_SERVER["HTTP_X_GITHUB_EVENT"] ?? "unknown";
if ($event === "push") {
shell_exec("sh /path/to/deploy.sh");
}
echo "OK";
?>php▶️ How to Run These Webhook Servers#
Java#
Run via JAR:
java -jar target/yourapp.jarbashOr deploy via:
- Tomcat
- Docker
- systemd service
NodeJS Express#
Install:
npm install expressbashRun:
node index.jsbashProduction:
pm2 start index.jsbashNode.js (Vanilla JS)#
Run:
node server.jsbashProduction:
pm2 start server.jsbashPHP#
Development:
php -S 0.0.0.0:8000bashProduction:
- Apache
- Nginx + PHP-FM
- Docker
Related DevTools
Published: 12/10/2025
Back to DevTools