ci: shrink the push pipeline to the affordable gate set
Test / test (push) Failing after 5m26s

Assisted-by: GLM 5.3 Flash
This commit is contained in:
2026-10-02 16:47:52 +02:00
parent b4c1e133c0
commit 02a6359c1f
3 changed files with 67 additions and 29 deletions
+42
View File
@@ -0,0 +1,42 @@
# FreeBSD compile gates. Dispatched by hand, never on a push.
#
# The debugger's ptrace surface and the JIT substrate are the two
# FreeBSD-portable layers the tree carries; the forge has no FreeBSD runner,
# so they can only be compile-gated, and three foreign-GOOS builds of the
# whole module are minutes of one-core work the push pipeline's budget cannot
# carry. The push pipeline stays fast and light; this workflow is the
# deliberate run, before a release or after touching the ported layers.
# Running the ptrace suite itself needs real FreeBSD hardware.
#
# A dispatched workflow takes no concurrency block: it is one deliberate run.
name: FreeBSD build
on:
workflow_dispatch:
env:
# One core: parallelism buys no speed here and costs memory the box does not have.
GOFLAGS: -p=1
GOMAXPROCS: "2"
jobs:
build:
runs-on: fedora
timeout-minutes: 10
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v6
with:
# The module is the source of truth for the version, so it cannot drift.
go-version-file: go.mod
cache: true
- name: FreeBSD build (amd64)
run: GOOS=freebsd GOARCH=amd64 go build ./...
- name: FreeBSD build (arm64)
run: GOOS=freebsd GOARCH=arm64 go build ./...
- name: FreeBSD build (riscv64)
run: GOOS=freebsd GOARCH=riscv64 go build ./...
+16 -29
View File
@@ -6,6 +6,11 @@
# everything runs in one job. Extra jobs would duplicate the checkout, the Go setup and
# the dependency download three times without buying any parallelism.
#
# The budget is part of the contract: a push run is fast and light, about two minutes,
# and nothing that cannot run natively on the runner belongs here. The FreeBSD compile
# gates live in freebsd.yml behind workflow_dispatch for that reason; the GOOBJ link
# parity campaign is an opt-in local verification (just link-parity).
#
# Every step is one command, so the step that fails is the gate that failed, and no shell
# option has to be trusted for the run to stop. The scripted steps are Perl, not shell and
# not Python: Perl behaves the same on both runner images, there is no bashism to trip over
@@ -56,28 +61,6 @@ jobs:
- name: Build
run: go build ./...
- name: FreeBSD build (amd64)
# The debugger's ptrace surface and the JIT substrate are the two
# FreeBSD-portable layers the tree carries; the forge has no FreeBSD
# runner, so a push can only compile-gate them. Running the ptrace
# suite needs real FreeBSD hardware.
env:
GOOS: freebsd
GOARCH: amd64
run: go build ./...
- name: FreeBSD build (arm64)
env:
GOOS: freebsd
GOARCH: arm64
run: go build ./...
- name: FreeBSD build (riscv64)
env:
GOOS: freebsd
GOARCH: riscv64
run: go build ./...
- name: Format
run: |
perl -e '
@@ -104,7 +87,11 @@ jobs:
# command, so the floor is the same number everywhere. ./verify/... carries the
# live oracle-parity comparison against `go tool asm` (the TestGroundTruth
# suites); the runner's Go setup provides both the tool and GOROOT.
run: go test -count=1 -timeout 10m -coverprofile=coverage.out ./arch/... ./asm/... ./ast/... ./disasm/... ./format/... ./lexer/... ./lint/... ./lsp/... ./parser/... ./token/... ./verify/...
# -short skips the deliberate-run categories inside the suites (the live
# ptrace sessions above all): they need the machine to themselves and a
# starved single-core runner turns each into a timeout the budget cannot
# carry. The local `just test` gate runs everything, in full.
run: go test -short -count=1 -timeout 10m -coverprofile=coverage.out ./arch/... ./asm/... ./ast/... ./disasm/... ./format/... ./lexer/... ./lint/... ./lsp/... ./parser/... ./token/... ./verify/...
- name: Tests outside the coverage set
# The CLI and the debugger sit outside `packages` because a thin main and a
@@ -112,12 +99,12 @@ jobs:
# shipped surfaces: the command exit codes, the manual pages against the
# binary's own help, and the debugger's architecture-neutral units. They run
# here so the floor stays a product measure and nothing is left untested.
run: go test -count=1 -timeout 10m ./cmd/... ./debug/...
- name: Oracle parity
# Re-run the live go-tool-asm comparison as its own step so that a parity
# regression names the gate that failed instead of hiding inside the suite.
run: go test -count=1 -timeout 10m -run 'TestGroundTruth' ./verify/...
# -short skips the debugger's live ptrace sessions, the deliberate-run
# category the runner cannot starve-proof. The live go-tool-asm oracle
# comparison (TestGroundTruth in ./verify/...) runs inside the coverage
# sweep above; it is not re-run as its own step, because every second on
# this box is budget.
run: go test -short -count=1 -timeout 10m ./cmd/... ./debug/...
- name: Coverage floor
run: |
+9
View File
@@ -18,8 +18,17 @@ import (
)
// buildGasm produces the gasm binary the debugger spawns as its debuggee.
// Every live ptrace test funnels through here, so this is also where the
// deliberate-run boundary sits: under -short (the push pipeline's mode) the
// live sessions skip, because a real debuggee's launch handshake needs the
// machine to itself and a starved single-core runner turns each one into a
// timeout that burns the step's whole budget. The local test gate and the
// dispatched workflows run them in full.
func buildGasm(t *testing.T) string {
t.Helper()
if testing.Short() {
t.Skip("live ptrace session: skipped in -short mode")
}
if p := os.Getenv("GASM_TEST_BIN"); p != "" {
return p
}