Skip to main content
info

This documentation is automatically synchronized from the claude-hub repository. Last updated: 2025-06-01

Complete Claude GitHub Webhook Workflow

This document provides a comprehensive overview of the entire workflow from GitHub webhook reception to Claude execution and response.

Architecture Overview​

GitHub → Webhook Service → Docker Container → Claude API
↓ ↓
←←←←←← GitHub API ←←←←←←←←←←←←←←←←←

Detailed Workflow​

1. GitHub Webhook Reception​

Endpoint: POST /api/webhooks/github Handler: src/index.ts:38

  1. GitHub sends webhook event to the service
  2. Express middleware captures raw body for signature verification
  3. Request is passed to the GitHub controller

2. Webhook Verification & Processing​

Controller: src/controllers/githubController.ts Method: handleWebhook()

  1. Verifies webhook signature using GITHUB_WEBHOOK_SECRET
  2. Parses event payload
  3. Supported event types:
    • issue_comment.created
    • pull_request_review_comment.created
    • pull_request.created

3. Command Extraction​

  1. Checks for bot mention in comment body (using BOT_USERNAME env variable)
  2. Extracts command using regex pattern based on configured bot username
  3. Captures:
    • Repository full name
    • Issue/PR number
    • Branch information (if PR)
    • Command to execute

4. Claude Container Preparation​

Service: src/services/claudeService.ts Method: processCommand()

  1. Builds Docker image if not exists: claudecode:latest
  2. Creates unique container name
  3. Prepares environment variables:
    GITHUB_TOKEN
    AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY
    AWS_REGION
    ANTHROPIC_MODEL
    CLAUDE_CODE_USE_BEDROCK
    REPO_FULL_NAME
    ISSUE_NUMBER
    TARGET_BRANCH
    COMMAND

5. Container Execution​

Entrypoint: claudecode-entrypoint.sh

  1. Configure GitHub CLI authentication
  2. Clone repository with GitHub token
  3. Checkout appropriate branch:
    • PR branch for pull requests
    • Main/default branch for issues
  4. Set git configuration for commits
  5. Run Claude Code CLI with command
  6. Save response to /tmp/response.md

6. Response Handling​

Controller: src/controllers/githubController.ts Method: handleWebhook()

  1. Read response from container
  2. Return response as HTTP JSON response
  3. Clean up container (if configured)

API Endpoints​

Main Webhook Endpoint​

  • URL: /api/webhooks/github
  • Method: POST
  • Headers: X-Hub-Signature-256 (GitHub webhook signature)
  • Purpose: Receives GitHub webhook events

Direct Claude API​

  • URL: /api/claude
  • Method: POST
  • Body:
    {
    "repository": "owner/repo",
    "useContainer": true,
    "command": "your command here"
    }
  • Purpose: Direct Claude invocation (testing/debugging)

Health Check​

  • URL: /health
  • Method: GET
  • Response:
    {
    "status": "OK",
    "docker": true,
    "timestamp": "2024-11-03T12:00:00.000Z"
    }
  • Purpose: Service health monitoring

Environment Variables​

Required​

VariableDescriptionExample
GITHUB_TOKENGitHub personal access tokenyour_github_token
GITHUB_WEBHOOK_SECRETWebhook signature secretyour-secret
AWS_ACCESS_KEY_IDAWS access key for Bedrockyour_access_key_id
AWS_SECRET_ACCESS_KEYAWS secret keyxxxxx

Optional​

VariableDescriptionDefault
AWS_REGIONAWS region for Bedrockus-east-1
ANTHROPIC_MODELClaude model to useanthropic.claude-3-sonnet-20240229-v1:0
CLAUDE_CODE_USE_BEDROCKUse Bedrock (vs API)1
PORTService port3002
LOG_LEVELLogging verbosityinfo
CLEANUP_CONTAINERSAuto-cleanup after executionfalse

Docker Container Lifecycle​

Build Phase​

  1. Dockerfile.claudecode defines Claude execution environment
  2. Installs:
    • Node.js 20
    • GitHub CLI
    • AWS CLI
    • Claude Code CLI
    • Git and utilities

Execution Phase​

  1. Container created with unique name
  2. Volumes mounted:
    • /tmp/response.md for output
    • Project directory for access
  3. Environment variables passed
  4. Runs claudecode-entrypoint.sh

Cleanup Phase​

  1. Response file extracted
  2. Container stopped
  3. Container removed (if cleanup enabled)
  4. Volumes cleaned up

Security Considerations​

  1. Webhook Verification: All webhooks verified with HMAC signature
  2. Container Isolation: Each request runs in isolated container
  3. Limited Permissions: Claude Code runs with restricted tools
  4. Token Security: GitHub tokens never exposed in logs
  5. Network Isolation: Containers run in isolated network

Error Handling​

  1. Webhook Errors: Return 401 for invalid signatures
  2. Container Errors: Caught and logged, error posted to GitHub
  3. API Errors: Return appropriate HTTP status codes
  4. Timeout Handling: Container execution limited to 5 minutes
  5. Cleanup Errors: Logged but don't fail the request

Testing​

Manual Testing​

# Test webhook locally using CLI
./cli/claude-webhook owner/repo "Your command"

# Test Claude API directly
node test/test-claude-api.js owner/repo

# Test with container
node test/test-claude-api.js owner/repo container "Your command"

Integration Testing​

# Full workflow test
npm test

# Docker container test
./test-claudecode-docker.sh

Deployment​

Docker Compose​

services:
webhook:
build: .
ports:
- "8082:3002"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- n8n_default

Production Considerations​

  1. Use environment-specific .env files
  2. Enable container cleanup for production
  3. Set appropriate resource limits
  4. Configure logging for monitoring
  5. Use webhook URL allowlisting

Troubleshooting​

Common Issues​

  1. Webhook Signature Failures

    • Check GITHUB_WEBHOOK_SECRET matches GitHub
    • Verify raw body is captured correctly
  2. Container Build Failures

    • Check Docker daemon is running
    • Verify Docker socket permissions
  3. Claude Errors

    • Verify AWS credentials are valid
    • Check Bedrock model availability in region
  4. GitHub API Errors

    • Verify GITHUB_TOKEN has correct permissions
    • Check rate limits

Debug Commands​

# View webhook logs
docker compose logs -f webhook

# List running containers
docker ps -a | grep claude-code

# Debug container directly
docker exec -it <container-id> /bin/bash

# Check Docker connectivity
curl --unix-socket /var/run/docker.sock http://localhost/info