# Race, Go. Dispatched by hand, and never a gate on a push or a tag: the release tag is # cut only after `just gates` has already raced the tree, so this workflow is the # explicit second opinion, not a step of the release. # # The race detector roughly doubles both time and memory, which the shared runner box # cannot afford on every push. Locally it belongs to `just gates`, which runs it once # per task; here it is an explicit decision rather than a routine. # # The matrix keeps the libm check the push pipeline once carried: the same linux/amd64 # oracle digests run against glibc (fedora, openeuler) and musl (alpine), which is # exactly where floating-point kernels can drift. Dispatched, because three full # sweeps are not affordable on every push. # # Every step is one command, so the step that fails is the gate that failed. name: Race 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: race: runs-on: ${{ matrix.runner }} timeout-minutes: 45 strategy: fail-fast: false matrix: include: - runner: fedora packages: dnf install -y git gcc perl - runner: alpine packages: apk add --no-cache git gcc perl musl-dev - runner: openeuler packages: dnf install -y git gcc perl steps: - name: Install git, gcc and Perl # The race detector needs cgo, hence gcc; alpine adds musl-dev for the same # reason. The installs are no-ops where the packages already exist. run: ${{ matrix.packages }} - uses: actions/checkout@v7 - uses: actions/setup-go@v6 with: go-version-file: go.mod cache: true - name: Oracle digests for this platform run: go test -run TestOracle -v . - name: Race # Equal to `packages` in the project's justfile: the logic packages, # the main-program examples aside. run: go test -race -count=1 -timeout 30m . ./internal/... ./grad/... ./integrate/... ./io/... ./linalg/... ./optim/... ./signal/... ./spmd/... ./stats/...