Skip to content

feat: strategy.max-parallel and user-configurable fail-fast on deploy matrix #32

Description

@joshua-temple

Problem

The promote workflow hardcodes fail-fast: false on its deploy matrix (promote.go:579) and there is no max-parallel anywhere in the generator. Both values are fixed at generation time with no manifest-level knob.

This prevents two common deployment patterns:

  • Rolling/region-by-region deploys: max-parallel: 1 ensures only one environment or region is deploying at a time, limiting blast radius.
  • Fail-fast on first bad environment: some teams want fail-fast: true so a failed dev deploy halts the rest of the matrix rather than continuing to staging and prod.

The schema shape for this should be reserved now. The matrix-builds work and canary support both inherit this same knob, so the field design affects multiple future features.

What to add

Add a strategy: block to the deploy-matrix configuration in the manifest schema:

deploys:
  strategy:
    max_parallel: 1        # optional; GHA default is unlimited
    fail_fast: false       # optional; default false (current behaviour preserved)

The generator maps these to strategy.max-parallel and strategy.fail-fast on the promote matrix job. When absent, current behaviour is preserved (fail-fast: false, no max-parallel).

Acceptance criteria

  • Manifest schema accepts strategy.max_parallel (positive integer) and strategy.fail_fast (bool) under the deploy configuration.
  • When max_parallel is set, the generated promote matrix includes strategy.max-parallel: N.
  • When fail_fast is set to true, the generated promote matrix emits fail-fast: true instead of the hardcoded false.
  • Omitting strategy produces the same output as today (non-breaking).
  • cascade validate rejects max_parallel: 0 or negative values with a clear error.
  • e2e scenario: a manifest with strategy: {max_parallel: 1, fail_fast: true} generates a promote workflow where the matrix block contains max-parallel: 1 and fail-fast: true; a manifest with no strategy block generates output identical to the current baseline.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions