Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/actions/dispatch-suite/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ inputs:
retry-attempts:
description: >-
Total dispatch attempts for this suite. Default 1 keeps the historical
behavior (a single dispatch, no retry). Set to 2 or more on the heaviest,
most race-prone lane so a whole-suite failure re-dispatches a fresh run.
behavior (a single dispatch, no retry). Set to 2 or more on a fan-out lane
so a whole-suite failure re-dispatches a fresh run.
This is safe because every scenario-suite run begins with its own
"reset and seed dev" step, so a re-dispatch starts from a clean slate.
Only a non-success conclusion (or a run that never became visible)
Expand Down
10 changes: 9 additions & 1 deletion .github/actions/fleet-repin/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,15 @@ runs:
install -m 0755 "$TMPDIR/cascade" /usr/local/bin/cascade
rm -rf "$TMPDIR"

INSTALLED=$(cascade version 2>/dev/null | head -n 1 | awk '{print $2}')
# `cascade version` prints three lines via separate writes. Piping it
# straight into `head -n 1` lets head close the pipe after the first
# line while the binary is still writing the rest, which delivers
# SIGPIPE (exit 141) to the binary and, under `set -o pipefail`, reds
# this step intermittently. Capture the output into a variable first,
# then take field two of the first line without a pipe, so no producer
# can be signalled. This mirrors the setup-cli action's capture pattern.
INSTALLED_RAW=$(cascade version 2>/dev/null || true)
read -r _ INSTALLED _ <<<"$INSTALLED_RAW" || true
# Tolerate a leading v in the self-report so the check tracks the release
# tag rather than a future ldflags formatting choice.
echo "fleet-repin: installed cascade version ${INSTALLED} (expected ${RC_BARE})"
Expand Down
20 changes: 18 additions & 2 deletions .github/workflows/fleet-e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,11 @@ jobs:
token: ${{ secrets.CASCADE_STATE_TOKEN }}
cascade_version: ${{ needs.resolve.outputs.cascade_version }}
cascade_version_sha: ${{ needs.resolve.outputs.cascade_version_sha }}
# Allow one whole-suite re-dispatch so a transient runner
# non-acquisition, a mid-poll API blip, or a SIGPIPE does not red the
# lane on a single unlucky attempt. Safe because each scenario-suite
# run self-resets on its first step, so a re-dispatch starts clean.
retry-attempts: '2'

# Lane 1, stage 2: dependents of primary (mutate primary's shared external
# state), so they only start after primary is green. Two repos run together,
Expand Down Expand Up @@ -396,6 +401,11 @@ jobs:
token: ${{ secrets.CASCADE_STATE_TOKEN }}
cascade_version: ${{ needs.resolve.outputs.cascade_version }}
cascade_version_sha: ${{ needs.resolve.outputs.cascade_version_sha }}
# Allow one whole-suite re-dispatch so a transient runner
# non-acquisition, a mid-poll API blip, or a SIGPIPE does not red the
# lane on a single unlucky attempt. Safe because each scenario-suite
# run self-resets on its first step, so a re-dispatch starts clean.
retry-attempts: '2'

# Lane 2: 4env alone. It is the heaviest and most fragile repo, so it runs in
# its own dedicated job with nothing beside it. Sequenced AFTER the dependents
Expand Down Expand Up @@ -424,8 +434,9 @@ jobs:
# plus chained multi-env hotfix, conflict, rollback, and merge_queue
# against one live repo). Allow one whole-suite re-dispatch so a live
# GitHub eventual-consistency blip does not red the lane. Safe because
# each suite run self-resets on its first step. Other lanes keep the
# default (no retry) so a retry stays a scoped concession here.
# each suite run self-resets on its first step. Every fan-out lane
# carries the same single re-dispatch so a transient failure on any of
# them re-dispatches once rather than redding the whole fleet.
retry-attempts: '2'

# Lane 3: the light remainder, capped at two repos in flight. Sequenced AFTER
Expand Down Expand Up @@ -454,6 +465,11 @@ jobs:
token: ${{ secrets.CASCADE_STATE_TOKEN }}
cascade_version: ${{ needs.resolve.outputs.cascade_version }}
cascade_version_sha: ${{ needs.resolve.outputs.cascade_version_sha }}
# Allow one whole-suite re-dispatch so a transient runner
# non-acquisition, a mid-poll API blip, or a SIGPIPE does not red the
# lane on a single unlucky attempt. Safe because each scenario-suite
# run self-resets on its first step, so a re-dispatch starts clean.
retry-attempts: '2'

# Fan-in: this job's conclusion is the rc fleet gate. It needs EVERY lane so a
# green gate means every selected repo passed; auto-promote keys off this
Expand Down