Files
gh-technicalpickles-pickled…/skills/buildkite-status/references/buildkite-states.md
2025-11-30 09:00:26 +08:00

4.2 KiB

Buildkite Build and Job States

Understanding Buildkite states is critical for correctly interpreting build status. Some states are misleading or require additional context.

Build States

Terminal States

  • passed - All jobs completed successfully
  • failed - One or more jobs failed
  • canceled - Build was manually canceled
  • skipped - Build was skipped (e.g., due to branch filters)
  • blocked - Build is waiting for manual approval via block step

Active States

  • running - Build is currently executing
  • scheduled - Build is queued and waiting to start
  • creating - Build is being created

Job States

Terminal States

  • passed - Job completed successfully
  • failed - Job failed with non-zero exit code
  • canceled - Job was canceled
  • skipped - Job was skipped
  • timed_out - Job exceeded time limit

Special States (Often Misleading)

  • broken - This is the most misleading state. It can mean:

    • Job was skipped because an earlier job in the pipeline failed
    • Job was skipped due to dependency conditions not being met
    • Job was skipped due to conditional logic in the pipeline config
    • NOT necessarily a failure of this specific job

    Example: In the zen-payroll pipeline, many jobs show as "broken" but are actually skipped because their dependencies indicated they weren't needed (e.g., no relevant file changes).

  • soft_failed - Job failed but was marked as "soft fail" (doesn't block pipeline)

    • Shows as failed but doesn't cause overall build failure
    • Often used for optional checks or flaky tests

Active States

  • waiting - Job is waiting for dependencies
  • waiting_failed - Job was waiting but its dependency failed
  • assigned - Job has been assigned to an agent
  • accepted - Agent has accepted the job
  • running - Job is currently executing
  • blocked - Job is a block step waiting for manual unblock

Interpreting Build Status

Progressive Disclosure Pattern

When checking build status, follow this pattern:

  1. Start with overall state: passed, failed, canceled, blocked
  2. If failed, check job summary: How many jobs failed vs broken vs passed?
  3. Examine failed jobs specifically: Don't assume "broken" means the job itself failed
  4. Check annotations: Some projects surface important failures in annotations
  5. Inspect logs: For actual failures, read the job logs

Common Pitfalls

  1. Treating "broken" as "failed": A "broken" job is often just skipped due to pipeline logic, not an actual failure.

  2. Ignoring soft fails: Jobs marked as soft_failed may contain important information even though they don't block the build.

  3. Missing blocked builds: A blocked build is waiting for approval and won't progress without manual intervention.

  4. Overlooking job dependencies: Jobs may be skipped (broken) because their dependencies weren't met, which is expected behavior.

Project-Specific Patterns

zen-payroll Pipeline

  • Heavy use of conditional execution: Many jobs are conditionally skipped based on file changes
  • "broken" is normal: A build with many "broken" jobs may still be perfectly healthy
  • Check annotations: Important test failures are often surfaced in build annotations
  • Multiple test suites: Different test types (unit, integration, system) have different failure patterns

Smaller Pipelines (e.g., gusto-karafka)

  • Fewer conditional jobs: Most jobs are expected to run
  • "broken" usually indicates a problem: Less conditional logic means broken jobs are more likely to be actual issues
  • Simpler job graphs: Easier to trace why a job didn't run
  • May not use annotations: Failures are usually just in job logs

When to Investigate

Investigate a build when:

  1. Overall build state is failed
  2. Jobs show failed state (not just broken)
  3. Build is blocked and you need to unblock it
  4. Annotations contain error messages
  5. Job logs show actual errors (red output, stack traces, test failures)

Don't automatically investigate when:

  1. Build is passed (even if some jobs are broken)
  2. Jobs are soft_failed unless specifically requested
  3. Jobs are broken due to conditional execution (check pipeline config)