Raxx · internal docs

internal · gated

RCA — Woodpecker forge connectivity: context deadline exceeded on GitHub API

Incident ID: 2026-07-09-wp-forge-context-deadline Date: 2026-07-09 Severity: SEV-2 Duration: ~60 min total (18:30 UTC detection → 19:30 UTC resolution) Blast radius: All Woodpecker pipeline creation blocked; v1.10.3 prod deploy delayed ~60 min. No user-visible impact (pre-launch). Author: sre-agent

Summary

The Woodpecker CI server container (EC2 i-082ee835595d90ae0, running 5 days) developed intermittent context deadline exceeded errors when fetching .woodpecker/*.yaml pipeline config files from the GitHub API. The errors prevented any new pipelines from being created, blocking the v1.10.3 production deploy. Root cause: Go HTTP client connection pool in the server process accumulated stale/half-open TCP connections over 5 days of high-frequency webhook processing, causing subsequent connection attempts to exhaust the pool and time out. Fix: operator-authorized service restart cleared the Go process and all stale connections. The prod deploy completed successfully after restart via manual break-glass trigger.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Add forge-connectivity probe to woodpecker-healthcheck.yml: GET /api/repos/1 (requires WP token) as a synthetic forge-ping; alert if returns non-200 or times out sre-agent 2026-07-16 file
2 Add scheduled WP server restart to prevent connection pool accumulation: sudo systemctl restart woodpecker weekly during low-traffic window via SSM scheduled automation sre-agent 2026-07-16 file
3 Document failure mode in ci-woodpecker runbook: "container-level forge connectivity timeout (host network healthy)" with restart command and diagnosis steps sre-agent 2026-07-10 (this RCA)
4 Fix create-github-release step: guard on empty TAG_NAME and exit non-zero (not swallow) so pipeline fails visibly when release creation is skipped feature-developer 2026-07-16 file
5 Add TAG_NAME env var injection to deploy-prod.yaml for manual triggers: TAG_NAME: v${CI_COMMIT_TAG:-manual} or accept TAG_NAME as a pipeline variable so break-glass runs can specify the version feature-developer 2026-07-16 file

References