Raxx · internal docs

internal · gated

RCA — Woodpecker CI crash loop via systemd Requires= dependency

Incident ID: 2026-07-11-woodpecker-restart-loop Date: 2026-07-11 Severity: SEV-2 Duration: 5h 47m (08:00:02 UTC — first loop iteration; 13:47:03 UTC — service stable) Blast radius: All CI pipelines blocked. No webhook-triggered builds ran from 08:00 to 13:47 UTC. ALB returned 502 for all ci.moosequest.net requests during the window. No data loss. No Woodpecker database writes during loop (container never reached serving state). Author: sre-agent


Summary

At 08:00:02 UTC the woodpecker-restart.timer fired its daily restart of Woodpecker CI. The woodpecker-restart.service unit contained Requires=woodpecker.service, which caused systemd to SIGTERM the restart process the moment it internally stopped woodpecker.service (the first half of systemctl restart). Systemd then re-queued the start of woodpecker.service and attempted to restore woodpecker-restart.service to active, restarting the loop every ~2 seconds. The WP container never remained up long enough for the ALB health check to pass. The healthcheck edge-triggered one alert email at ~08:15 UTC. The operator acted on the alert at ~13:36 UTC. The fix — removing Requires=woodpecker.service from the restart.service unit — broke the loop; the service was stable within 10 seconds.


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 Apply section-9 user_data_server.sh.tpl patch to main checkout and open PR to develop operator / sre-agent 2026-07-12
2 Smoke test systemctl start woodpecker-restart.service manually after tomorrow's 08:00 fire to confirm the fix holds in the timer-triggered path operator 2026-07-12
3 Add 30-minute re-alert to woodpecker-healthcheck.yml (or Slack notification) so sustained SEV-2 outages escalate past an unread email operator 2026-07-18
4 Establish a process: any live-patch to unit files on the WP EC2 instance must be mirrored to user_data_server.sh.tpl in the same SSM session (note in runbook) operator 2026-07-14

References