Add Gitea Event Bridge application files
This commit is contained in:
parent
2664a0c301
commit
04b97276fd
195
README.md
195
README.md
@ -0,0 +1,195 @@
|
|||||||
|
# Gitea Event Bridge Service
|
||||||
|
|
||||||
|
A Flask-based webhook event bridge service that receives Gitea webhooks, routes them based on trigger conditions, and broadcasts events via Server-Sent Events (SSE).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Webhook Reception**: Accept Gitea webhooks via POST endpoint
|
||||||
|
- **Event Routing**: Automatically detect and route events based on:
|
||||||
|
- Labels (`start-pipeline`, `needs-decision`)
|
||||||
|
- Comment commands (`/pipeline start`)
|
||||||
|
- PR events (opened, synchronized)
|
||||||
|
- **SSE Broadcasting**: Real-time event streaming to connected clients
|
||||||
|
- **Activity Logging**: JSON Lines format for audit trail
|
||||||
|
- **Webhook Verification**: HMAC signature validation (optional)
|
||||||
|
|
||||||
|
## Supported Gitea Event Types
|
||||||
|
|
||||||
|
- `issue` (opened, closed, reopened, edited)
|
||||||
|
- `issue.label` (added, removed)
|
||||||
|
- `pull_request` (opened, closed, reopened, synchronize, edited)
|
||||||
|
- `pull_request.label` (added, removed)
|
||||||
|
- `pull_request.review` (approved, rejected, commented)
|
||||||
|
- `comment` (created, edited, deleted)
|
||||||
|
- `repository` (created, deleted, archived)
|
||||||
|
- `organization` (member_added, member_removed)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### Using Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone and navigate to the directory
|
||||||
|
cd gitea-event-bridge
|
||||||
|
|
||||||
|
# Copy environment file
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# Edit .env with your configuration
|
||||||
|
# Set GITEA_WEBHOOK_SECRET if using signature verification
|
||||||
|
|
||||||
|
# Start the service
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Check health
|
||||||
|
curl http://localhost:5000/health
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Copy and configure environment
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# Run the application
|
||||||
|
python app.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
| Environment Variable | Default | Description |
|
||||||
|
|---------------------|---------|-------------|
|
||||||
|
| `HOST` | `0.0.0.0` | Server bind address |
|
||||||
|
| `PORT` | `5000` | Server port |
|
||||||
|
| `DEBUG` | `false` | Enable debug mode |
|
||||||
|
| `OPENCODE_URL` | `http://localhost:8080` | OpenCode server URL |
|
||||||
|
| `LOG_FILE` | `activity.json` | Activity log file path |
|
||||||
|
| `GITEA_WEBHOOK_SECRET` | (empty) | Secret for signature verification |
|
||||||
|
| `AUTO_TRIGGER_PIPELINE` | `true` | Enable automatic pipeline triggers |
|
||||||
|
| `AUTO_TRIGGER_REVIEW` | `true` | Enable automatic review triggers |
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
### POST /webhook/gitea
|
||||||
|
|
||||||
|
Receive Gitea webhooks.
|
||||||
|
|
||||||
|
**Headers:**
|
||||||
|
- `X-Gitea-Event`: Event type
|
||||||
|
- `X-Gitea-Signature`: HMAC signature (if secret configured)
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"event_type": "pull_request",
|
||||||
|
"action": "opened",
|
||||||
|
"repository": "owner/repo",
|
||||||
|
"sender": "username",
|
||||||
|
"triggers": [
|
||||||
|
{
|
||||||
|
"type": "review",
|
||||||
|
"agent": "lead",
|
||||||
|
"trigger": "trigger_lead_review",
|
||||||
|
"reason": "pr:opened"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### GET /events
|
||||||
|
|
||||||
|
SSE stream endpoint for real-time events.
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
```
|
||||||
|
event: gitea_event
|
||||||
|
data: {"event_type": "pull_request", "action": "opened", ...}
|
||||||
|
```
|
||||||
|
|
||||||
|
### GET /health
|
||||||
|
|
||||||
|
Health check endpoint.
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "healthy",
|
||||||
|
"sse_connected_clients": 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### GET /activity
|
||||||
|
|
||||||
|
Get recent activity log entries.
|
||||||
|
|
||||||
|
**Query Parameters:**
|
||||||
|
- `limit`: Maximum entries to return (default: 50, max: 200)
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"count": 2,
|
||||||
|
"activities": [
|
||||||
|
{
|
||||||
|
"id": "uuid",
|
||||||
|
"timestamp": "2026-04-08T12:00:00Z",
|
||||||
|
"event_type": "pull_request",
|
||||||
|
"action": "opened",
|
||||||
|
"repository": "owner/repo",
|
||||||
|
"sender": "username",
|
||||||
|
"payload": {...},
|
||||||
|
"routed_to": ["lead"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Trigger Conditions
|
||||||
|
|
||||||
|
### Label Triggers
|
||||||
|
- `start-pipeline` label → Trigger master pipeline
|
||||||
|
- `needs-decision` label → Trigger master decision
|
||||||
|
|
||||||
|
### Comment Commands
|
||||||
|
- `/pipeline start` → Trigger pipeline
|
||||||
|
- `/pipeline` → Trigger pipeline (shorthand)
|
||||||
|
|
||||||
|
### PR Events
|
||||||
|
- PR opened → Trigger lead review
|
||||||
|
- PR synchronize → Trigger lead review
|
||||||
|
|
||||||
|
## Gitea Webhook Setup
|
||||||
|
|
||||||
|
1. In Gitea, go to Repository Settings → Webhooks
|
||||||
|
2. Add new webhook:
|
||||||
|
- **URL**: `http://<your-server>/webhook/gitea`
|
||||||
|
- **Secret**: Set to match `GITEA_WEBHOOK_SECRET` (optional)
|
||||||
|
- **Events**: Select events to send
|
||||||
|
3. Test the webhook
|
||||||
|
|
||||||
|
## Example curl Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test health endpoint
|
||||||
|
curl http://localhost:5000/health
|
||||||
|
|
||||||
|
# Test SSE stream
|
||||||
|
curl -N http://localhost:5000/events
|
||||||
|
|
||||||
|
# Get activity log
|
||||||
|
curl http://localhost:5000/activity?limit=10
|
||||||
|
|
||||||
|
# Simulate webhook (if no secret configured)
|
||||||
|
curl -X POST http://localhost:5000/webhook/gitea \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "X-Gitea-Event: pull_request" \
|
||||||
|
-d '{"action": "opened", "repository": {"full_name": "owner/repo"}, "sender": {"login": "user"}, "pull_request": {"number": 1}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT
|
||||||
Loading…
Reference in New Issue
Block a user