ci: run CI on the forge's Arch native runner #12
Loading…
Reference in a new issue
No description provided.
Delete branch "fm/fm-ci-forgejo-arch"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Firstmate's CI has never actually executed. The workflows were written for GitHub-hosted runners and GitHub-supplied JS actions, and the fleet's own forge runner is a native Arch host with neither. So every workflow file in this repo described a pipeline that could not start, and the test suite behind it had been drifting unchecked for as long as that was true.
This converts CI to run on the forge's own Arch native runner, and then makes the suite actually pass on it.
What changed
A real runner image.
.github/ci/Dockerfilebuilds an Arch image carrying the suite's true dependencies. Several were discovered only by running it:diffutils,sqlite, andlsof— the last becausefm-teardown.sh's leaked-process detection depends on it. The image runs as a non-rootciuser, because the permission-semantics tests are meaningless as root, and setsgit safe.directoryso git does not reject the checkout as dubiously owned.Rewritten workflows.
ci.ymlandno-mistakes-required.ymlnow useruns-on: nativeand build/run that image directly. No JS actions anywhere — the native runner has no node to execute them with.Twelve pre-existing test bugs, fixed. These are not migration fallout; they are the accumulated cost of a suite whose CI never ran. Two root causes:
fm_git_worktreeandfm_git_init_commitnever set anoriginremote. Under--mode no-mistakesthat hard-fails a genuine delivery-target check — a check that was correct all along and had simply never been reached.nodeexists, which was true on the old runner and is false on Arch, defeating its PATH-isolation simulation.Left unfixed, each of these turns the first real run red for reasons unrelated to this change, which is the worst possible first impression for a gate nobody yet trusts.
Decisions worth understanding
The macOS Bash 3.2 job is dropped, deliberately. Compiling bash 3.2 requires a pre-GCC-14 toolchain Arch does not carry, and no faithful prebuilt image exists. This is a real reduction in coverage — the suite no longer proves portability to the oldest bash — and it is recorded as such in both
CONTRIBUTING.mdandci.ymlrather than quietly omitted.Verification was done against a live container, not inferred. Lint, the coverage guard, both portable-parallel shards, and all four portable-serial shards were each confirmed green inside a real Arch container built from this Dockerfile.
Still open
The Herdr E2E lane has not been validated locally. It needs the pinned herdr 0.7.4 that the workflow installs; the local environment has 0.7.5, which gives non-representative results. That lane's correctness rests on the pinned install behaving as written, and the first forge run is what will actually prove it.
More generally: this branch is the first thing that will ever exercise this pipeline for real. A green run here is the acceptance criterion, and it has to be observed on the forge rather than concluded from the local gate.
strategy.job-total is a GitHub Actions-only expression; this forge's act_runner (v13) evaluates it empty, dropping the shard count from FM_SERIAL_LANE ("portable-serial-1of" instead of "...1of4") and failing every portable-serial shard with "unknown lane" on the very first real forge CI run (PR #12). Use a literal instead - bin/fm-test-run.sh's own refusal of a mismatched "ofN" (docs/fm-test-portable-shards.md) is the actual protection against the matrix and the shard count drifting apart, and it does not depend on this expression at all.