|
|
@@ -0,0 +1,192 @@
|
|
|
+# Gogs Webhook Server
|
|
|
+
|
|
|
+A modular Node.js server for receiving and processing Gogs webhooks. The server logs all incoming webhooks to the console and provides an extensible callback system for custom event handling.
|
|
|
+
|
|
|
+## Features
|
|
|
+
|
|
|
+- **Modular Architecture**: Clean separation of concerns (server, handler, logger)
|
|
|
+- **Extensible Callback System**: Register callbacks for specific events or all events
|
|
|
+- **Console Logging**: Colored, formatted logging of all webhook events
|
|
|
+- **Health Check Endpoint**: Built-in health monitoring
|
|
|
+- **Graceful Shutdown**: Proper cleanup on process termination
|
|
|
+- **Zero Dependencies**: Pure Node.js implementation
|
|
|
+
|
|
|
+## Requirements
|
|
|
+
|
|
|
+- Node.js >= 18.0.0
|
|
|
+
|
|
|
+## Installation
|
|
|
+
|
|
|
+```bash
|
|
|
+npm install
|
|
|
+```
|
|
|
+
|
|
|
+## Usage
|
|
|
+
|
|
|
+### Basic Usage (Logging Only)
|
|
|
+
|
|
|
+Start the server with default configuration:
|
|
|
+
|
|
|
+```bash
|
|
|
+npm start
|
|
|
+```
|
|
|
+
|
|
|
+The server will start on port 3000 and log all incoming webhooks to the console.
|
|
|
+
|
|
|
+### Development Mode (Auto-reload)
|
|
|
+
|
|
|
+```bash
|
|
|
+npm run dev
|
|
|
+```
|
|
|
+
|
|
|
+### Configuration
|
|
|
+
|
|
|
+Configure the server using environment variables:
|
|
|
+
|
|
|
+```bash
|
|
|
+PORT=8080 WEBHOOK_PATH=/gogs WEBHOOK_SECRET=your-secret npm start
|
|
|
+```
|
|
|
+
|
|
|
+Available environment variables:
|
|
|
+- `PORT`: Server port (default: 3000)
|
|
|
+- `WEBHOOK_PATH`: Webhook endpoint path (default: /webhook)
|
|
|
+- `WEBHOOK_SECRET`: Optional webhook secret for signature verification
|
|
|
+
|
|
|
+### Endpoints
|
|
|
+
|
|
|
+- `POST /webhook` - Webhook endpoint
|
|
|
+- `GET /health` - Health check endpoint
|
|
|
+
|
|
|
+## Extending with Callbacks
|
|
|
+
|
|
|
+The server is designed to be easily extended with custom callbacks. See `examples/with-callbacks.js` for a complete example.
|
|
|
+
|
|
|
+### Register Event-Specific Callbacks
|
|
|
+
|
|
|
+```javascript
|
|
|
+import { WebhookServer } from './src/server.js';
|
|
|
+
|
|
|
+const server = new WebhookServer({ port: 3000 });
|
|
|
+const handler = server.getHandler();
|
|
|
+
|
|
|
+// Handle push events
|
|
|
+handler.on('push', async (payload, headers) => {
|
|
|
+ console.log('Push to:', payload.repository.name);
|
|
|
+ console.log('Commits:', payload.commits.length);
|
|
|
+ // Your custom logic here
|
|
|
+});
|
|
|
+
|
|
|
+// Handle pull request events
|
|
|
+handler.on('pull_request', async (payload, headers) => {
|
|
|
+ console.log('PR:', payload.action);
|
|
|
+ // Your custom logic here
|
|
|
+});
|
|
|
+
|
|
|
+server.start();
|
|
|
+```
|
|
|
+
|
|
|
+### Register Global Callbacks
|
|
|
+
|
|
|
+```javascript
|
|
|
+// Handle all events
|
|
|
+handler.onAny(async (eventType, payload, headers) => {
|
|
|
+ console.log('Received event:', eventType);
|
|
|
+ // Send to analytics, external logging, etc.
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### Run the Example
|
|
|
+
|
|
|
+```bash
|
|
|
+node examples/with-callbacks.js
|
|
|
+```
|
|
|
+
|
|
|
+## Gogs Webhook Configuration
|
|
|
+
|
|
|
+1. Go to your Gogs repository settings
|
|
|
+2. Navigate to Webhooks → Add Webhook → Gogs
|
|
|
+3. Configure:
|
|
|
+ - **Payload URL**: `http://your-server:3000/webhook`
|
|
|
+ - **Content Type**: `application/json`
|
|
|
+ - **Secret**: (optional) your webhook secret
|
|
|
+ - **Events**: Select which events to receive
|
|
|
+4. Click "Add Webhook"
|
|
|
+
|
|
|
+### Supported Events
|
|
|
+
|
|
|
+- `push` - Repository push
|
|
|
+- `create` - Branch or tag creation
|
|
|
+- `delete` - Branch or tag deletion
|
|
|
+- `pull_request` - Pull request actions
|
|
|
+- `issues` - Issue actions
|
|
|
+- `issue_comment` - Issue comment actions
|
|
|
+- `release` - Release actions
|
|
|
+
|
|
|
+## Project Structure
|
|
|
+
|
|
|
+```
|
|
|
+.
|
|
|
+├── src/
|
|
|
+│ ├── index.js # Main entry point
|
|
|
+│ ├── server.js # HTTP server implementation
|
|
|
+│ ├── webhookHandler.js # Webhook processing and callbacks
|
|
|
+│ └── logger.js # Logging utility
|
|
|
+├── examples/
|
|
|
+│ └── with-callbacks.js # Example with custom callbacks
|
|
|
+├── package.json
|
|
|
+└── README.md
|
|
|
+```
|
|
|
+
|
|
|
+## Architecture
|
|
|
+
|
|
|
+### WebhookServer (`src/server.js`)
|
|
|
+- Creates HTTP server
|
|
|
+- Handles routing and request parsing
|
|
|
+- Manages webhook verification
|
|
|
+- Delegates webhook processing to handler
|
|
|
+
|
|
|
+### WebhookHandler (`src/webhookHandler.js`)
|
|
|
+- Manages callback registration
|
|
|
+- Executes callbacks for events
|
|
|
+- Supports event-specific and global callbacks
|
|
|
+- Provides error handling for callbacks
|
|
|
+
|
|
|
+### Logger (`src/logger.js`)
|
|
|
+- Formats and colorizes console output
|
|
|
+- Provides structured logging methods
|
|
|
+- Handles timestamp formatting
|
|
|
+
|
|
|
+## Testing
|
|
|
+
|
|
|
+You can test the webhook server using curl:
|
|
|
+
|
|
|
+```bash
|
|
|
+# Test health check
|
|
|
+curl http://localhost:3000/health
|
|
|
+
|
|
|
+# Test webhook with push event
|
|
|
+curl -X POST http://localhost:3000/webhook \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -H "X-Gogs-Event: push" \
|
|
|
+ -H "X-Gogs-Delivery: 12345" \
|
|
|
+ -d '{
|
|
|
+ "ref": "refs/heads/main",
|
|
|
+ "repository": {
|
|
|
+ "name": "test-repo",
|
|
|
+ "full_name": "user/test-repo"
|
|
|
+ },
|
|
|
+ "pusher": {
|
|
|
+ "username": "testuser"
|
|
|
+ },
|
|
|
+ "commits": [
|
|
|
+ {
|
|
|
+ "id": "abc123",
|
|
|
+ "message": "Test commit"
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }'
|
|
|
+```
|
|
|
+
|
|
|
+## License
|
|
|
+
|
|
|
+ISC
|