The tool said what it did twice. `sitedeploy` is a site and a deploy welded
together, and it sat next to `sitepublish` — two compounds sharing one noun,
where the noun alone is the whole meaning. `site hanzo-ai out` reads as what it
is; `sitedeploy hanzo-ai out` reads as a category and a verb fighting for the
same word.

The env vars follow: SITEDEPLOY_JOBS is SITE_JOBS. The composite action is
`hanzoai/ci/.github/actions/site@v1`.

Nothing about the implementation moves. 61 assertions pass before and after,
including the one that was already failing, which is the point of renaming
separately from changing.

Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-08-14 18:58:56 -07:00
co-authored by Hanzo Dev
parent a8219111f6
commit fc8fbf8f02
6 changed files with 53 additions and 53 deletions
@@ -1,4 +1,4 @@
name: sitedeploy
name: site
description: Publish a built static export to the Hanzo PaaS Sites plane.
# For every repo whose deploy is "a static export goes live" — hanzo.ai, hanzo.app,
# hips, computer and the ones after them. Those were each about to carry their own
@@ -6,7 +6,7 @@ description: Publish a built static export to the Hanzo PaaS Sites plane.
# transcriptions that drift (see the imgver action next door for the same story
# told about image tags).
#
# - uses: hanzoai/ci/.github/actions/sitedeploy@v1
# - uses: hanzoai/ci/.github/actions/site@v1
# with: { slug: hanzo-ai, dir: out }
# env:
# KMS_CLIENT_ID: '${{ secrets.KMS_CLIENT_ID }}'
@@ -40,7 +40,7 @@ inputs:
Several sites from one build, one `slug=dir` pair per line. A white-labelled
product is one codebase and several hosts, and a site keys on its HOST — so
a brand per host is a site per host, and one build writes an export per
brand. bin/sitedeploy stays single-site: a publish IS one site, and which
brand. bin/site stays single-site: a publish IS one site, and which
sites to publish is orchestration, which is what this file is.
required: false
default:
@@ -59,23 +59,23 @@ inputs:
runs:
using: composite
steps:
- name: Fetch sitedeploy
- name: Fetch site
shell: bash
# The action ref is the script ref: an action pinned to @v1 runs v1's
# sitedeploy. Both forges, because this repo is served from each.
# site. Both forges, because this repo is served from each.
run: |
set -euo pipefail
ref="${GITHUB_ACTION_REF:-v1}"
# The break tests for the TOOL, not for the clone: a host that answers
# with a tree carrying no bin/sitedeploy must fall through to the next
# with a tree carrying no bin/site must fall through to the next
# one rather than break and dead-end the job on it.
for url in https://git.hanzo.ai/hanzoai/ci https://github.com/hanzoai/ci; do
git clone -q --depth 1 --branch "$ref" "$url" "$RUNNER_TEMP/sitedeploy-ci" 2>/dev/null \
&& [ -x "$RUNNER_TEMP/sitedeploy-ci/bin/sitedeploy" ] && break
rm -rf "$RUNNER_TEMP/sitedeploy-ci"
git clone -q --depth 1 --branch "$ref" "$url" "$RUNNER_TEMP/site-ci" 2>/dev/null \
&& [ -x "$RUNNER_TEMP/site-ci/bin/site" ] && break
rm -rf "$RUNNER_TEMP/site-ci"
done
[ -x "$RUNNER_TEMP/sitedeploy-ci/bin/sitedeploy" ] \
|| { echo "::error::could not fetch hanzoai/ci@$ref (bin/sitedeploy)"; exit 1; }
[ -x "$RUNNER_TEMP/site-ci/bin/site" ] \
|| { echo "::error::could not fetch hanzoai/ci@$ref (bin/site)"; exit 1; }
- name: Read the deploy key
id: key
@@ -107,9 +107,9 @@ runs:
env:
HANZO_API: ${{ inputs.api }}
HANZO_DEPLOY_TOKEN: ${{ steps.key.outputs.token }}
SITEDEPLOY_JOBS: ${{ inputs.jobs }}
SITEDEPLOY_COMMIT: ${{ github.sha }}
SITEDEPLOY_BRANCH: ${{ github.ref_name }}
SITE_JOBS: ${{ inputs.jobs }}
SITE_COMMIT: ${{ github.sha }}
SITE_BRANCH: ${{ github.ref_name }}
run: |
set -euo pipefail
pairs='${{ inputs.sites }}'
@@ -127,7 +127,7 @@ runs:
[ -n "${pair//[[:space:]]/}" ] || continue
case "$pair" in *=*) ;; *) echo "::error::sites: entry '$pair' is not slug=dir"; exit 1 ;; esac
echo "::group::publish ${pair%%=*}"
bash "$RUNNER_TEMP/sitedeploy-ci/bin/sitedeploy" "${pair%%=*}" "${pair#*=}"
bash "$RUNNER_TEMP/site-ci/bin/site" "${pair%%=*}" "${pair#*=}"
echo "::endgroup::"
n=$((n + 1))
done < "$RUNNER_TEMP/site-pairs"
+6 -6
View File
@@ -1964,10 +1964,10 @@ jobs:
# which is what makes the prefix unforgeable. Nothing is left for an org
# to be missing.
#
# THE WORK IS IN bin/sitedeploy, NOT HERE. Forty lines of enqueue →
# THE WORK IS IN bin/site, NOT HERE. Forty lines of enqueue →
# upload → complete inlined in a workflow is forty lines nobody can run
# offline, and this file already learned that with imgver and gover.
# bin/sitedeploy_test.sh drives it through SITEDEPLOY_PLAN=1 with no
# bin/site_test.sh drives it through SITE_PLAN=1 with no
# network, and is weighted toward the REFUSALS — a publish step that
# reports success when it verified nothing is worse than one that never
# verified, because it is indistinguishable from a working one until a
@@ -2030,7 +2030,7 @@ jobs:
if [ -z "${HANZO_DEPLOY_TOKEN:-}" ]; then
echo "::error::hanzo.yml declares a site but the KMS step read no HANZO_DEPLOY_TOKEN for $API — refusing to publish. That is a KMS_CLIENT_ID/KMS_CLIENT_SECRET problem on this repo, not a missing site credential."; exit 1
fi
# sitedeploy, not sitepublish: the export goes up FILE BY FILE against a
# site, not sitepublish: the export goes up FILE BY FILE against a
# presigned, prefix-scoped grant, so the bytes never traverse the API and
# no body limit applies. sitepublish POSTs the whole zip, which fasthttp
# refuses above the edge BodyLimit before any handler runs — reported as
@@ -2039,14 +2039,14 @@ jobs:
# console export is 116 MB across 627 files, and a static export only
# ever grows. One lane, and it is the one that scales.
# One publish per site, from the one implementation. A file, not a
# pipe: sitedeploy runs curl, and curl inherits stdin — it would eat
# pipe: site runs curl, and curl inherits stdin — it would eat
# the rest of the list and report success for sites it never sent.
printf '%s\n' "$PAIRS" > "$RUNNER_TEMP/site-pairs"
while IFS= read -r pair; do
[ -n "${pair//[[:space:]]/}" ] || continue
echo "::group::publish ${pair%%=*}"
HANZO_API="$API" SITEDEPLOY_COMMIT="${{ github.sha }}" SITEDEPLOY_BRANCH="$REF" \
"$CI_HOME/bin/sitedeploy" "${pair%%=*}" "${pair#*=}"
HANZO_API="$API" SITE_COMMIT="${{ github.sha }}" SITE_BRANCH="$REF" \
"$CI_HOME/bin/site" "${pair%%=*}" "${pair#*=}"
echo "::endgroup::"
done < "$RUNNER_TEMP/site-pairs"
+1 -1
View File
@@ -240,7 +240,7 @@ bearer is the IAM JWT the workflow already mints from `KMS_CLIENT_ID` /
no org — the org segment is prepended server-side from the validated principal,
which is what makes the prefix unforgeable.
The export ships through [`bin/sitedeploy`](bin/sitedeploy):
The export ships through [`bin/site`](bin/site):
`POST /v1/projects/<slug>/deployments` answers with a prefix-scoped, 30-minute
presigned grant, every file goes straight to S3 against it, and the completion
carries the manifest cloud reconciles the prefix against — deleting whatever the
+12 -12
View File
@@ -1,8 +1,8 @@
#!/usr/bin/env bash
# sitedeploy — publish a built static export to the Hanzo PaaS Sites plane.
# site — publish a built static export to the Hanzo Sites plane.
# One implementation, every static site.
#
# sitedeploy <slug> <dir> # e.g. sitedeploy hanzo-ai out
# site <slug> <dir> # e.g. site hanzo-ai out
#
# WHY THIS IS A SCRIPT AND NOT INLINE SHELL: the same forty lines of enqueue →
# upload → complete were about to be pasted into hanzo.ai, hanzo.app, hips,
@@ -49,15 +49,15 @@
# ENV: HANZO_DEPLOY_TOKEN (required) the org-scoped `sk-` key; mint at POST /v1/keys
# HANZO_API (https://api.hanzo.ai)
# GATEWAY_BODY_LIMIT (16777216) the edge's own name for its own limit
# SITEDEPLOY_JOBS (24) parallel uploads
# SITEDEPLOY_COMMIT / SITEDEPLOY_BRANCH recorded on the deployment
# SITEDEPLOY_PLAN=1 print the manifest and exit; no network. The test seam.
# SITE_JOBS (24) parallel uploads
# SITE_COMMIT / SITE_BRANCH recorded on the deployment
# SITE_PLAN=1 print the manifest and exit; no network. The test seam.
set -euo pipefail
slug="${1:?usage: sitedeploy <slug> <dir>}"
dir="${2:?usage: sitedeploy <slug> <dir>}"
api="${HANZO_API:-https://api.hanzo.ai}"
jobs="${SITEDEPLOY_JOBS:-24}"
jobs="${SITE_JOBS:-24}"
# `16 << 20`, quoted from cloud internal/edge/edge.go:38 so a reader can check it
# against the source rather than trust it. That package is the one definition;
@@ -169,7 +169,7 @@ bytes=$(cd "$dir" && find . -type f ! -name CNAME -exec wc -c {} + | awk '$2!="t
# would die there first — "Argument list too long", from the tool that builds the
# body rather than from the size of it — which is the same unreadable failure one
# layer up, and it would fire before this check could name the real ceiling.
jq -n --arg c "${SITEDEPLOY_COMMIT:-}" --argjson f "$count" --argjson b "${bytes:-0}" \
jq -n --arg c "${SITE_COMMIT:-}" --argjson f "$count" --argjson b "${bytes:-0}" \
--rawfile k "$work/manifest" \
'{status:"live", commit:$c, files:$f, bytes:$b,
keys:($k | rtrimstr("\n") | split("\n"))}' > "$work/sd-done.json"
@@ -182,7 +182,7 @@ body=$(wc -c < "$work/sd-done.json" | tr -d ' ') # BSD wc pads its count, GNU
echo "::error::publish aborted: the completion manifest is $(human "$body") ($body bytes) for $count files, over the $(human "$max_body") ($max_body bytes) edge limit (GATEWAY_BODY_LIMIT, cloud internal/edge/edge.go:38). The bytes stream per file and are not the problem — the manifest cloud reconciles the prefix against is one body, and fasthttp refuses an oversized POST before any handler runs, answering only 'Error when parsing request', which names neither size nor cause. Reduce the object count: a full prerender is what makes an export this wide."
exit 1; }
if [ -n "${SITEDEPLOY_PLAN:-}" ]; then
if [ -n "${SITE_PLAN:-}" ]; then
printf 'slug=%s dir=%s files=%s\n' "$slug" "$dir" "$count"
while IFS= read -r k; do [ -n "$k" ] && printf '%s\t%s\n' "$k" "$(ctype "$k")"; done <<< "$manifest"
exit 0
@@ -295,11 +295,11 @@ post() {
# success. So a new site needs no out-of-band `POST /v1/projects`; committing the
# workflow is enough. The repo is linked so the deploy's lifecycle events name a
# repo and reach the notify subscriptions keyed on it — the enqueue itself no
# longer requires a link; SITEDEPLOY_REPO overrides the origin for a forge
# longer requires a link; SITE_REPO overrides the origin for a forge
# checkout whose remote is not the canonical repo.
repo="${SITEDEPLOY_REPO:-$(git remote get-url origin 2>/dev/null || true)}"
repo="${SITE_REPO:-$(git remote get-url origin 2>/dev/null || true)}"
pcode=$(post "$work"/sd-proj.json "$api/v1/projects" \
"$(jq -nc --arg s "$slug" --arg u "$repo" --arg b "${SITEDEPLOY_BRANCH:-main}" \
"$(jq -nc --arg s "$slug" --arg u "$repo" --arg b "${SITE_BRANCH:-main}" \
'{slug:$s, name:$s} + (if $u=="" then {} else {repo:{url:$u, branch:$b}} end)')")
case "$pcode" in
200|201|409) : ;; # created now, or already there — either is the state we need
@@ -325,7 +325,7 @@ esac
# no branch column, and the lifecycle event derives it from the project's own
# linked branch. jq builds it so a commit message can never break the JSON.
code=$(post "$work"/sd-enq.json "$api/v1/projects/$slug/deployments" \
"$(jq -nc --arg c "${SITEDEPLOY_COMMIT:-}" '{commit:$c}')")
"$(jq -nc --arg c "${SITE_COMMIT:-}" '{commit:$c}')")
if [ "$code" != "202" ]; then
echo "::error::enqueue $api/v1/projects/$slug/deployments returned HTTP $code"; head -c 600 "$work"/sd-enq.json; echo; exit 1
fi
+15 -15
View File
@@ -1,9 +1,9 @@
#!/usr/bin/env bash
# Tests for bin/sitedeploy. Runs OFFLINE two ways: SITEDEPLOY_PLAN=1 stops the
# Tests for bin/site. Runs OFFLINE two ways: SITE_PLAN=1 stops the
# script before the first network call and prints the manifest it would upload,
# and a `curl` shim on PATH records every request and answers it from a fixture.
# So every case here is deterministic and needs no token, no bucket and no
# cluster. Run: bash bin/sitedeploy_test.sh
# cluster. Run: bash bin/site_test.sh
#
# THE ADDRESSES ARE THE POINT of the shim half. They were described in a comment
# and asserted nowhere, and when cloud split the deploy route in two — /deploy
@@ -13,11 +13,11 @@
# stayed PASS throughout. A wire nobody asserts is a wire that moves.
set -uo pipefail
cd "$(dirname "$0")/.."
SD="$PWD/bin/sitedeploy"
SD="$PWD/bin/site"
tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT
fail=0
plan() { SITEDEPLOY_PLAN=1 bash "$SD" a-slug "$1" 2>&1; }
plan() { SITE_PLAN=1 bash "$SD" a-slug "$1" 2>&1; }
t() { # t <name> <got> <want>
if [ "$2" = "$3" ]; then printf 'ok %-56s -> %s\n' "$1" "$2"
else printf 'FAIL %-56s -> %s (want %s)\n' "$1" "$2" "$3"; fail=1; fi
@@ -164,7 +164,7 @@ ENQ='{"id":"dep_x","version":7,"status":"queued","bucket":"hanzo-sites","prefix"
"fields":{"key":"acme/a-slug/","policy":"POLICY","x-amz-signature":"SIG"}}}'
DONE='{"status":"live","liveUrl":"https://a-slug.hanzo.app","version":7,"files":6,"bytes":42}'
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 SITEDEPLOY_REPO= \
SITE_JOBS=1 SITE_COMMIT=abc123 SITE_REPO= \
T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" bash "$SD" a-slug "$site" 2>&1); rc=$?
calls="$tmp/calls"
t "a full deploy succeeds" "$rc" "0"
@@ -231,7 +231,7 @@ exact=$(wc -c < "$tmp/complete.body" | tr -d ' ')
rm -f "$tmp/calls" "$tmp/complete.body"
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=1 SITE_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
GATEWAY_BODY_LIMIT=1 bash "$SD" a-slug "$site" 2>&1); rc=$?
t "a manifest past the edge limit refuses" "$rc" "1"
t " ...naming the server's own knob" "$(printf '%s' "$out" | grep -c GATEWAY_BODY_LIMIT)" "1"
@@ -247,7 +247,7 @@ t " ...having sent nothing at all" "$(cat "$tmp/calls" 2>/dev/null | w
# have worked must still work, or the fleet learns to route around the gate.
rm -f "$tmp/calls"
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=1 SITE_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
GATEWAY_BODY_LIMIT="$exact" bash "$SD" a-slug "$site" 2>&1); rc=$?
t "a manifest exactly AT the limit publishes" "$rc" "0"
# The size the release line reports must not depend on the runner's locale: awk
@@ -262,12 +262,12 @@ t "a manifest exactly AT the limit publishes" "$rc" "0"
# FALSE no matter what is installed. The block simply never ran.
if locale -a 2>/dev/null | grep -ix 'de_DE.UTF-8' >/dev/null; then
o=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=1 SITE_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
LC_ALL=de_DE.UTF-8 bash "$SD" a-slug "$site" 2>&1)
t "the size reads the same under a comma locale" "$(printf '%s' "$o" | grep -cF '16.0 MiB edge limit')" "1"
fi
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=1 SITE_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
GATEWAY_BODY_LIMIT="$((exact - 1))" bash "$SD" a-slug "$site" 2>&1); rc=$?
t "one byte past the limit refuses" "$rc" "1"
# Readable in the band where a site FIRST crosses, which is the ~100 KiB just
@@ -284,7 +284,7 @@ t " ...on the measured side too" "$(printf '%s' "$out" | grep -cF
for bad in abc 0x10 1e9 0 -1 '1 6' 99999999999999999999999 ''; do
rm -f "$tmp/calls"
o=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=1 SITE_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
GATEWAY_BODY_LIMIT="$bad" bash "$SD" a-slug "$site" 2>&1)
t "GATEWAY_BODY_LIMIT='$bad' -> 16 MiB, publishes" \
"$(printf '%s' "$o" | grep -cF 'of the 16.0 MiB edge limit')" "1"
@@ -292,7 +292,7 @@ done
# Atoi accepts a leading sign, so this one is VALID and must be honoured rather
# than discarded — a mirror that only ever falls back is not a mirror.
o=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=1 SITE_COMMIT=abc123 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
GATEWAY_BODY_LIMIT=" +1 " bash "$SD" a-slug "$site" 2>&1)
t "a signed, padded limit is read as Atoi reads it" "$(printf '%s' "$o" | grep -cF '(1 bytes) edge limit')" "1"
@@ -305,7 +305,7 @@ wide="$tmp/wide"; mkdir -p "$wide"
i=0; while [ $i -lt 627 ]; do : > "$wide/page$i.html"; i=$((i + 1)); done
rm -f "$tmp/calls"
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=8 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
SITE_JOBS=8 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" \
bash "$SD" a-slug "$wide" 2>&1); rc=$?
t "a 627-object export publishes" "$rc" "0"
t " ...with every key in the manifest" "$(jq -r '.keys|length' "$tmp/complete.body")" "627"
@@ -314,7 +314,7 @@ t " ...with every key in the manifest" "$(jq -r '.keys|length' "$tmp/complete
# than a deployment queued forever behind a build that is gone.
rm -f "$tmp/calls" "$tmp/complete.body"
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 T_DIR="$tmp" T_ENQ="${ENQ/https:\/\/s3.test/https:\/\/s3.unknown}" T_DONE="$DONE" \
SITE_JOBS=1 T_DIR="$tmp" T_ENQ="${ENQ/https:\/\/s3.test/https:\/\/s3.unknown}" T_DONE="$DONE" \
bash "$SD" a-slug "$site" 2>&1); rc=$?
# Non-zero, not a number: the upload loop is xargs, and a failed child is exit
# 123 on GNU and exit 1 on BSD. Pinning either one passes on the machine it was
@@ -333,7 +333,7 @@ t "a failed upload is reported as error" "$(jq -r .status "$tmp/complete.body" 2
# pass proves the retry ran rather than that the first call happened to work.
rm -f "$tmp/calls" "$tmp/n"
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 SITEDEPLOY_COMMIT=abc123 SITEDEPLOY_REPO= \
SITE_JOBS=1 SITE_COMMIT=abc123 SITE_REPO= \
T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" T_5XX=2 bash "$SD" a-slug "$site" 2>&1); rc=$?
t "two 503s do not lose the build" "$rc" "0"
t "the 503s were retried, not ignored" "$(cat "$tmp/n")" "3"
@@ -342,7 +342,7 @@ t "the 503s were retried, not ignored" "$(cat "$tmp/n")" "3"
# and the second spends four sleeps before printing a refusal it had at once.
rm -f "$tmp/calls" "$tmp/n"
out=$(PATH="$shim:$PATH" HANZO_API=https://api.test HANZO_DEPLOY_TOKEN=sk-test \
SITEDEPLOY_JOBS=1 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" T_5XX=9 \
SITE_JOBS=1 T_DIR="$tmp" T_ENQ="$ENQ" T_DONE="$DONE" T_5XX=9 \
bash "$SD" a-slug "$site" 2>&1); rc=$?
t "a plane that never recovers fails" "$([ "$rc" != 0 ] && echo failed)" "failed"
t "it gives up rather than hammering" "$(cat "$tmp/n")" "5"
+4 -4
View File
@@ -177,8 +177,8 @@ test:
# turns 3, 9 and 1 of these tests red respectively. Offline and
# deterministic: a curl shim answers the routes from fixtures, no network.
run: bash bin/sitepublish_test.sh
- name: sitedeploy
# bin/sitedeploy is the other half of the same plane — the per-file presigned
- name: site
# bin/site is the other half of the same plane — the per-file presigned
# route the exports too large for sitepublish's 16 MiB body take — and it is
# what all 15 static repos reach through the composite action. Its suite was
# written and then never wired here, so the one tool in bin/ with the widest
@@ -197,8 +197,8 @@ test:
# before a single request goes out; at exactly it, the publish still happens.
# A guard that can only refuse is a guard that eventually blocks a build that
# would have worked, and those are the ones people learn to route around.
# Offline and deterministic: SITEDEPLOY_PLAN prints the manifest, no network.
run: bash bin/sitedeploy_test.sh
# Offline and deterministic: SITE_PLAN prints the manifest, no network.
run: bash bin/site_test.sh
- name: conflictmarkers
# bin/conflictmarkers runs against every repo in the fleet, so a false
# positive is as expensive as a miss: it blocks a build that would have