Skip to content

ci: fix the pinned job on ubuntu-26.04 and the tip job's export data - #1

Closed
thesyncim wants to merge 3 commits into
mauri870:masterfrom
thesyncim:ci-qemu-user
Closed

thesyncim wants to merge 3 commits into
mauri870:masterfrom
thesyncim:ci-qemu-user

Conversation

@thesyncim

@thesyncim thesyncim commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

CI has been red since ubuntu-latest moved to 26.04, and on tip loopvec couldn't load any package. Three commits:

  1. ubuntu-26.04 no longer ships qemu-user-static, so the install step fails and the arm64 tsvc run, the golden check, fmt and lint never run. qemu-user has the static emulators there, just without the -static names, so install that and link qemu-aarch64-static when it's missing.

  2. Go tip writes export data in iexport v4 (exact float constants), which x/tools v0.51.0 and v0.52.0 can't read. Every script that runs loopvec on tip fails with unstable iexport format version 4, just rebuild compiler and std library. x/tools master reads it (golang/tools@966056e2637c), so go.mod points at master until there's a release.

  3. Pin go1.27.3, the latest 1.27. Its simd package is the same as 1.27.1's (caps_gen.go only changes in its header comment) and the -methods ICE is still there, so flag_methods_ice.txt still holds. go.mod stays at 1.27.1, the first release whose simd works with what loopvec generates.

One thing to know about the newer x/tools: for packages outside a module (std) it type-checks at the go command's version, and it reads that with GO111MODULE=off, which ignores GOTOOLCHAIN. So GOTOOLCHAIN=go1.27.3 loopvec std on a machine whose go is still 1.26 type-checks std at go1.26 and fails on generic methods (golang/go#68495). CI is fine because setup-go puts the right go on PATH.

I ran into all of this while trying loopvec on goav1, a pure-Go AV1 codec. Until this is in, CI fails on master and on every PR, mine included.

ubuntu-latest is now ubuntu-26.04, which has no qemu-user-static
package, so every run fails at the install step and skips the arm64
tsvc run, the golden check, fmt and lint. qemu-user ships the static
emulators there; link qemu-aarch64-static to it when the name is
missing, as the Makefile runs that name.
Go tip writes export data in iexport version 4, which encodes float
constants exactly. x/tools v0.51.0, and the v0.52.0 release, read only
up to version 3, so on tip go/packages fails for every package:

  cannot import "math" (unstable iexport format version 4, just rebuild
  compiler and std library), export data is newer version - update tool

and every script that runs loopvec fails in the tip job. x/tools master
reads version 4 (golang/tools@966056e2637c). Update to it until a release
includes it. The pinned toolchain is unaffected.
go1.27.3 is the latest 1.27 release. Its simd package is the same as
go1.27.1's, so the capability table only changes in its header, and
the -methods crash (golang/go#80657) is still there, as
flag_methods_ice.txt checks. go.mod keeps go 1.27.1: that is the first
release whose simd package loopvec's output compiles against
(go1.27.0's ShiftAllRight takes a uint8).
mauri870 added a commit that referenced this pull request Nov 3, 2026
This bumps the pinned toolchain from go1.27.1 to go1.27.3, the latest
1.27 release. It supersedes the go1.27.3 commit in #1.

That commit bumped only the Makefile. The script harness doesn't read
the Makefile: `script_test.go` runs every script with the toolchain
`go.mod` names (`goModToolchain`), and `actions/setup-go` reads the same
file. With only the Makefile changed, the scripts would still have run
on go1.27.1, including the `flag_methods_ice.txt` check behind the claim
that the crash is still in 1.27.3.

This PR:

- **Pins the toolchain in two places.** The Makefile now pins
`go1.27.3`, and `go.mod` gets a `toolchain go1.27.3` line.
- **Keeps the minimum at 1.27.1.** The `go` line stays at `1.27.1`, the
first release whose simd works with what loopvec generates: go1.27.0
compiles `ShiftAllRight` with a `uint8` count.
- **Regenerates `caps_gen.go`.** go1.27.3's simd package has the same
methods as 1.27.1's, so only the header comment changes.
- **Updates the version in `BUGS.md` and `flag_methods_ice.txt`.** The
`-methods` internal compiler error (golang/go#80657) still happens on
go1.27.3, and the script checks that now.

Tested locally:

- `make ci` passes on this commit: `test-update` leaves the goldens
unchanged, and the race suite, both arm64 qemu runs, bench fuzz seeds,
tsvc, fix and lint all pass.
- The script harness reports `GOTOOLCHAIN=go1.27.3`, and
`flag_methods_ice.txt` still gets the internal compiler error.
@mauri870

mauri870 commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Thanks! I ended up fixing most of this before I found this PR. The gotip issue is fixed by 5b1d2a0, and the toolchain bump to go1.27.3 is #15. The ubuntu issue doesn't affect us yet, since CI still runs on ubuntu-24.04 and is green. We'll take the qemu-user part when the runners move to 26.04.

@mauri870 mauri870 closed this Nov 3, 2026
mauri870 pushed a commit that referenced this pull request Nov 4, 2026
The runners have moved to ubuntu-26.04, so this is the qemu part of #1
you said you'd take when that happened. `qemu-user-static` has no
installation candidate there, so every PR now fails at that step and the
arm64 runs, the golden check, fmt and lint get skipped. You can see it
on #7, #9 and #19, where Build, Test and the amd64 tsvc run all pass
first. master's last run predates the move, so the next push will hit it
too.

`qemu-user` has the static emulators on 26.04, just without the
`-static` names, so this installs that and links `qemu-aarch64-static`
when it's missing, since the Makefile runs that name. It's been passing
on my fork's ubuntu-26.04 runners, and this PR's own CI runs it too.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants