eleven / messenger Public

deploy: ops ship --expedite — the encoded bake-window override (#1342)

The incident path ('update run --ignore-bake' after an operator stable
promote) existed only as a hand-run precedent; tonight's mesh fix needed it
again. ship --expedite passes --ignore-bake through to each box's updater —
still a stated, deliberate override, now a verb instead of prose.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Paul Campbell 17773e965fdc6b5e126ef2b7a0cc900a56050aa0 parent 4e8c592
2 files changed, +14 −4
  • deploy/ops-release.sh +6 −2
  • deploy/release-server.sh +8 −2
diff --git a/deploy/ops-release.sh b/deploy/ops-release.sh
index b8566dc..300e972 100755
--- a/deploy/ops-release.sh
+++ b/deploy/ops-release.sh
@@ -26,7 +26,7 @@ root="$(CDPATH= cd -- "$here/.." && pwd)"
BOXES="${LCHAT_BOXES:-elevenbox kepler}"
usage() {
- echo "usage: ops publish [notes...] | ops promote <ver> edge|beta|stable | ops ship [box...]" >&2
+ echo "usage: ops publish [notes...] | ops promote <ver> edge|beta|stable | ops ship [--expedite] [box...]" >&2
exit 2
}
@@ -79,6 +79,10 @@ ship)
# Ship converges the WHOLE fleet: one release-server.sh ship pass per box
# (each box runs its own updater). Naming boxes limits the sweep; the
# default is every fleet box, so nobody has to remember there are two.
+ # `ship --expedite [box...]` overrides the supply-chain bake window — the
+ # encoded form of the update-run --ignore-bake incident precedent.
+ EXPEDITE=""
+ if [ "${1:-}" = "--expedite" ]; then EXPEDITE="--expedite"; shift; fi
[ $# -gt 0 ] && BOXES="$*"
failed=""
for box in $BOXES; do
@@ -86,7 +90,7 @@ ship)
# One box lagging (GitHub's CDN serves fresh manifests stale for a few
# minutes) must not stop the others from converging — finish the sweep,
# then report.
- LCHAT_BOX="$box" "$here/release-server.sh" ship || failed="$failed $box"
+ LCHAT_BOX="$box" "$here/release-server.sh" ship $EXPEDITE || failed="$failed $box"
done
echo
echo "note: this opened operator SSH sessions — the public access ledger wants a"
diff --git a/deploy/release-server.sh b/deploy/release-server.sh
index 7ef7721..71903e3 100755
--- a/deploy/release-server.sh
+++ b/deploy/release-server.sh
@@ -427,13 +427,19 @@ promote)
;;
ship)
+ # --expedite: pass --ignore-bake through to the box updater — the deliberate
+ # operator override of the supply-chain bake window (docs/server-releases.md),
+ # for shipping an incident fix the moment it's promoted. The hold is the
+ # default for a reason; expediting is a stated decision, never routine.
+ EXPEDITE=""
+ if [ "${1:-}" = "--expedite" ]; then EXPEDITE="--ignore-bake"; shift; fi
VER="${1:-$(git rev-parse --short HEAD)}"
BOX="${LCHAT_BOX:-}"
[ -n "$BOX" ] || { echo "release-server: set LCHAT_BOX (e.g. <box-ip>; user comes from ssh config) to ship" >&2; exit 1; }
- echo "ship: updating instances on $BOX until current (feed target: $VER)"
+ echo "ship: updating instances on $BOX until current (feed target: $VER${EXPEDITE:+, expedited past the bake window})"
DEADLINE=$(( $(date +%s) + 600 ))
while :; do
- ssh "$BOX" sudo -n /opt/lchat/lchat update run || true
+ ssh "$BOX" sudo -n /opt/lchat/lchat update run $EXPEDITE || true
STATUS="$(ssh "$BOX" sudo -n /opt/lchat/lchat update status || true)"
# Done when no un-pinned instance with a known channel head is behind, and
# at least one row proves a feed landed at all. Pinned rows are someone's