mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-03 07:18:03 +01:00
* test-free-shards: --ci-run --jobs k sub-shards inside one CI job (k=1 default), per-file JUnit counts (GSTA-203 PR 2) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(ci): ship ffmpeg in the eval image so the marathon design-motion case can run (#3687) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * shard-jobs: serial sub-shard gets what is left of the shard wall; register shard-jobs.ts in ship-measure touchfiles Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * shard-jobs: validate every sub-shard summary, bounded JUnit read, stricter --ci-verify records, unique count paths, no serial launch without wall Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * shard-jobs tests: non-hex plan id fixture; harness-version: shard-jobs FREE_ONLY entry is non-behavioral Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(test:free): exact root-bound JUnit path matching; serial timeout text names the wall the parallel phase left Adversarial pass 2 (GSTA-203 PR 2): a plain relative path now matches a planned file exactly, and an absolute or ../-prefixed path matches only when its prefix is the child's root, so an unplanned browse/test/x.test.ts is never credited to test/x.test.ts. The serial sub-shard's FREE_SUBSHARD_TIMEOUT text says how much of the shard wall the parallel phase left it. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs(testing): real-home tripwire covers --jobs k>1 parallel sub-shards (docs audit docs-203-1) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * ci(free): per-shard sub-shard k in the CI plan (--shard-jobs), free_jobs and windows_jobs dispatch inputs (k=1 defaults) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * ci(free-tests): 10 x ubicloud-standard-8 at 4 sub-shards per shard (GSTA-203 PR 3 A/B winner); Windows stays at k=1 Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: pre-landing review fixes (changelog names main's 20 x standard-4 baseline and the unchanged 80 vCPUs) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs(testing): sub-shard default is the plan's per-shard k (docs audit docs-pr3-2) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * ci(free): run the #3680/#3679 BSD-userland regression on macos-named-regressions Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * changelog: macos-named-regressions runs the BSD-userland ubi-runner regression (#3680) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs: Windows k=1 applies to the nightly suite since #3806 (docs re-audit after the main merge) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
3d99c22497
commit
4bbad24221
15 files changed
+297
-62
No files matched your search
@@ -193,6 +193,21 @@ RUN for i in 1 2 3; do \
|
||||
&& fc-cache -f \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# ffmpeg (with ffprobe): /design-motion's checks and exports shell out to it
|
||||
# (lib/motion-encode.ts), and the marathon design-motion-showcase case runs
|
||||
# that flow end to end. The image had none, so every trial stopped at
|
||||
# FFMPEG_MISSING (#3687). The build fails if the packaged ffmpeg ever lacks a
|
||||
# filter or encoder the checks and exports use.
|
||||
RUN for i in 1 2 3; do \
|
||||
apt-get update && apt-get install -y --no-install-recommends ffmpeg && break || \
|
||||
(echo "ffmpeg install retry $i/3"; sleep 10); \
|
||||
done \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& command -v ffprobe \
|
||||
&& filters="$(ffmpeg -hide_banner -filters)" && encoders="$(ffmpeg -hide_banner -encoders)" \
|
||||
&& for f in psnr gblur palettegen paletteuse signalstats tile; do echo "$filters" | grep -qw "$f" || { echo "ERROR: ffmpeg lacks the $f filter" >&2; exit 1; }; done \
|
||||
&& for e in libx264 gif; do echo "$encoders" | grep -qw "$e" || { echo "ERROR: ffmpeg lacks the $e encoder" >&2; exit 1; }; done
|
||||
|
||||
# Pre-install dependencies (cached layer — only rebuilds when package.json or
|
||||
# bun.lock changes). Copy BOTH so install is deterministic and matches local
|
||||
# resolution. Without bun.lock here, bun install resolved transitive deps
|
||||
|
||||
@@ -41,13 +41,21 @@ on:
|
||||
description: 'Runner-sizing experiments only: shard count, 1-40 (empty keeps FREE_SUITE_SHARDS)'
|
||||
type: string
|
||||
default: ''
|
||||
free_jobs:
|
||||
description: 'Runner-sizing experiments only: sub-shards per CI shard (--shard-jobs), 1-8 (empty keeps FREE_SUITE_JOBS)'
|
||||
type: string
|
||||
default: ''
|
||||
|
||||
# The one source of the free-suite runner and shard count. pull_request and
|
||||
# push runs never see workflow_dispatch inputs, so free-plan resolves these
|
||||
# (or a dispatch override) into outputs that free-suite reads.
|
||||
# The one source of the free-suite runner, shard count and sub-shards per
|
||||
# shard. pull_request and push runs never see workflow_dispatch inputs, so
|
||||
# free-plan resolves these (or a dispatch override) into outputs and the plan
|
||||
# that free-suite reads. FREE_SUITE_JOBS is k in `--ci-plan --shard-jobs k`:
|
||||
# each shard runs min(k, its parallel files) sandboxed sub-shards side by side
|
||||
# (scripts/lib/shard-jobs.ts); the exclusive host-state shard stays one child.
|
||||
env:
|
||||
FREE_SUITE_RUNNER: ubicloud-standard-4
|
||||
FREE_SUITE_SHARDS: '20'
|
||||
FREE_SUITE_RUNNER: ubicloud-standard-8
|
||||
FREE_SUITE_SHARDS: '10'
|
||||
FREE_SUITE_JOBS: '4'
|
||||
|
||||
# Keyed on the PR number, not head_ref: a bare branch name carries no fork
|
||||
# prefix, so same-name branches from two forks would share one group and a
|
||||
@@ -120,10 +128,12 @@ jobs:
|
||||
env:
|
||||
RUNNER_OVERRIDE: ${{ inputs.free_runner }}
|
||||
SHARDS_OVERRIDE: ${{ inputs.free_shards }}
|
||||
JOBS_OVERRIDE: ${{ inputs.free_jobs }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
runner="${RUNNER_OVERRIDE:-$FREE_SUITE_RUNNER}"
|
||||
shards="${SHARDS_OVERRIDE:-$FREE_SUITE_SHARDS}"
|
||||
jobs="${JOBS_OVERRIDE:-$FREE_SUITE_JOBS}"
|
||||
case "$runner" in
|
||||
ubicloud-standard-2|ubicloud-standard-4|ubicloud-standard-8) ;;
|
||||
*) echo "::error::free_runner '$runner' is not ubicloud-standard-2, -4 or -8"; exit 1 ;;
|
||||
@@ -132,10 +142,14 @@ jobs:
|
||||
''|*[!0-9]*) echo "::error::free_shards '$shards' is not a whole number"; exit 1 ;;
|
||||
esac
|
||||
if [ "$shards" -lt 1 ] || [ "$shards" -gt 40 ]; then echo "::error::free_shards $shards is outside 1-40"; exit 1; fi
|
||||
if [ "$runner" != "$FREE_SUITE_RUNNER" ] || [ "$shards" != "$FREE_SUITE_SHARDS" ]; then
|
||||
echo "- Runner-sizing experiment: $shards shards on $runner (defaults $FREE_SUITE_SHARDS on $FREE_SUITE_RUNNER); not a PR or train Free Tests result" >> "$GITHUB_STEP_SUMMARY"
|
||||
case "$jobs" in
|
||||
''|*[!0-9]*) echo "::error::free_jobs '$jobs' is not a whole number"; exit 1 ;;
|
||||
esac
|
||||
if [ "$jobs" -lt 1 ] || [ "$jobs" -gt 8 ]; then echo "::error::free_jobs $jobs is outside 1-8"; exit 1; fi
|
||||
if [ "$runner" != "$FREE_SUITE_RUNNER" ] || [ "$shards" != "$FREE_SUITE_SHARDS" ] || [ "$jobs" != "$FREE_SUITE_JOBS" ]; then
|
||||
echo "- Runner-sizing experiment: $shards shards on $runner at $jobs sub-shards each (defaults $FREE_SUITE_SHARDS on $FREE_SUITE_RUNNER at $FREE_SUITE_JOBS); not a PR or train Free Tests result" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
matrix=$(bun run scripts/test-free-shards.ts --ci-plan "$RUNNER_TEMP/free-plan.json" --shards "$shards")
|
||||
matrix=$(bun run scripts/test-free-shards.ts --ci-plan "$RUNNER_TEMP/free-plan.json" --shards "$shards" --shard-jobs "$jobs")
|
||||
echo "matrix=$matrix" >> "$GITHUB_OUTPUT"
|
||||
echo "runner=$runner" >> "$GITHUB_OUTPUT"
|
||||
- name: Seed growth ratchet (60 s ceiling, shrink-only allowlist)
|
||||
@@ -186,7 +200,8 @@ jobs:
|
||||
# code that compares a realpath with an unresolved path passes on Linux's
|
||||
# /tmp and fails here (#2982). TMPDIR is deliberately left at the runner's
|
||||
# default, and the job fails if that layout is not symlinked. It also sources
|
||||
# the Codex probe from zsh, macOS's default shell (#3024; no paid call).
|
||||
# the Codex probe from zsh, macOS's default shell (#3024; no paid call), and
|
||||
# runs ubi-runner under macOS's bsdtar and one-true-awk (#3680, #3679).
|
||||
macos-named-regressions:
|
||||
needs: reuse
|
||||
if: ${{ !cancelled() && (needs.reuse.result != 'success' || needs.reuse.outputs.reused != 'true') }}
|
||||
@@ -229,7 +244,7 @@ jobs:
|
||||
resolved="$(realpath "$tmp")"
|
||||
echo "temp root: $tmp -> $resolved"
|
||||
test "$resolved" != "${tmp%/}"
|
||||
files=(test/gstack-design-detect.test.ts browse/test/chromium-profile-isolation.test.ts test/cso-git-hardening.test.ts test/plan-count-file-permission.test.ts test/spec-quality-gate-secret-sink.test.ts test/gstack-memory-ingest.test.ts test/regression-issue3024-zsh-sourced-helpers.test.ts test/codex-probe-subcommands.test.ts browse/test/proxy-env-daemon.test.ts browse/test/proxy-direct-launch-args.test.ts)
|
||||
files=(test/gstack-design-detect.test.ts browse/test/chromium-profile-isolation.test.ts test/cso-git-hardening.test.ts test/plan-count-file-permission.test.ts test/spec-quality-gate-secret-sink.test.ts test/gstack-memory-ingest.test.ts test/regression-issue3024-zsh-sourced-helpers.test.ts test/codex-probe-subcommands.test.ts browse/test/proxy-env-daemon.test.ts browse/test/proxy-direct-launch-args.test.ts test/regression-issue3680-ubicloud-bsd-userland.test.ts)
|
||||
for file in "${files[@]}"; do test -f "$file"; done
|
||||
bun test "${files[@]}"
|
||||
|
||||
|
||||
@@ -42,6 +42,10 @@ on:
|
||||
description: Record per-file Windows durations (artifact) instead of running the lane
|
||||
type: boolean
|
||||
default: false
|
||||
windows_jobs:
|
||||
description: 'Sub-shard experiments only: sub-shards per Windows shard (--shard-jobs), 1-4 (empty keeps WINDOWS_FREE_JOBS). Never cite such a run as a PR result.'
|
||||
type: string
|
||||
default: ''
|
||||
# free-durations-record.yml calls the recording path weekly.
|
||||
workflow_call:
|
||||
inputs:
|
||||
@@ -49,6 +53,11 @@ on:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
# k in `--ci-plan --shard-jobs k`: each Windows shard runs min(k, its parallel
|
||||
# files) sandboxed sub-shards side by side (scripts/lib/shard-jobs.ts).
|
||||
env:
|
||||
WINDOWS_FREE_JOBS: '1'
|
||||
|
||||
concurrency:
|
||||
group: windows-free-${{ github.event.pull_request.number || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
@@ -105,8 +114,18 @@ jobs:
|
||||
# 4-vCPU Windows runner, so the lane lands near 4 min with setup.
|
||||
env:
|
||||
GSTACK_FREE_TEST_DURATIONS: scripts/free-test-durations-windows.json
|
||||
JOBS_OVERRIDE: ${{ inputs.windows_jobs }}
|
||||
run: |
|
||||
matrix=$(bun run scripts/test-free-shards.ts --windows-only --ci-plan "$RUNNER_TEMP/windows-plan.json" --shards 6)
|
||||
set -euo pipefail
|
||||
jobs="${JOBS_OVERRIDE:-$WINDOWS_FREE_JOBS}"
|
||||
case "$jobs" in
|
||||
''|*[!0-9]*) echo "::error::windows_jobs '$jobs' is not a whole number"; exit 1 ;;
|
||||
esac
|
||||
if [ "$jobs" -lt 1 ] || [ "$jobs" -gt 4 ]; then echo "::error::windows_jobs $jobs is outside 1-4"; exit 1; fi
|
||||
if [ "$jobs" != "$WINDOWS_FREE_JOBS" ]; then
|
||||
echo "- Sub-shard experiment: $jobs sub-shards per Windows shard (default $WINDOWS_FREE_JOBS); not a PR Windows Free Tests result" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
matrix=$(bun run scripts/test-free-shards.ts --windows-only --ci-plan "$RUNNER_TEMP/windows-plan.json" --shards 6 --shard-jobs "$jobs")
|
||||
echo "matrix=$matrix" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||
with:
|
||||
|
||||
Reference in new issue
Block a user