Skip to content

guides

Debugging CI with a breakpoint instead of 40 commits

Print-statement debugging via push is the slowest loop in software. SSH into the runner instead.

Tomás Rivera · Performance engineering · 2026-02-18 · 5 min read

The standard way to debug a CI-only failure is to add an echo, push, wait eight minutes, read the log, and repeat. Teams routinely spend a day on failures that take four minutes to diagnose with a shell.

The faster loop

  1. Add a breakpoint step that holds the runner open on failure
  2. SSH in with your authorised key while the workspace is exactly as the failing step left it
  3. Inspect the actual filesystem, environment and tool versions rather than inferring them
  4. Fix, remove the breakpoint, push once
yaml
- name: Hold the runner open if the tests failed
if: failure()
uses: runnerhut/breakpoint@v1
with:
timeout-minutes: 30

What it usually turns out to be

  • A tool version that differs from local
  • A missing locale or timezone that only matters in date formatting tests
  • Test-order dependence exposed by different parallelism
  • A file the build assumed existed because it was gitignored locally

Your next build could be twice as fast, at half the price

Start free. Migrating away is the same one line, and we publish that diff too.