Repository navigation
test flakes tracker #2177
Description
CI Flakes Tracker
This tracks CI failures, usually in the merge queue.
COPR repo unavailable
Error: Failed to download metadata for repo
'copr:copr.fedorainfracloud.org:group_CoreOS:continuous':
Cannot download repomd.xml: All mirrors were tried
The COPR continuous repo is transiently unavailable during the container build,
causing dnf to fail. Happens specifically on centos-10 jobs that pull from
the CoreOS COPR. Retry would likely succeed.
quay.io 502
Error:
error: Installing to filesystem: Creating ostree deployment: Pulling:
Importing: Unencapsulating base: failed to invoke method GetBlob:
fetching blob: received unexpected HTTP status: 502 Bad Gateway
The in-VM install test hit a transient 502 from the container registry while
pulling an image. Pure network flake.
GHA runner killed mid-TMT
Symptom: Job ran unit tests successfully, TMT step started but produced no
conclusion after 2h15m. No artifact uploaded. Run marked failed with no logged
error. Runner appears to have been killed externally (OOM or host issue).
test_container_write_derive assertion failure
Frequency: Once (fedora-44, ostree, xfs, grub, bls, unsealed — Unit and container integration tests)
Error:
assertion `left == right` failed
left: "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
right: "newderivedfile v0"
at crates/ostree-ext/tests/it/main.rs:1713
File written into a derived container was read back as all null bytes. The same
test passed in fedora-43, ostree in the same queue batch. Likely a race
condition or tmpfs/storage timing issue on the fedora-44 runner; not seen
before or since.
Docs
Basically cargo binstall tries to fetch binaries from GitHub releases, but because we aren't passing in a GH_TOKEN into that inner job we can get rate limited. When that happens, cargo binstall falls back to trying to compile from source, which can then fail due to missing dependencies.
Package expiration
Our workflow splits package jobs from integration tests, if a PR sticks around too long the package artifacts expire, meaning all workflows need to be retried if a flake happens. I think we could extend package expiry to a week or potentially even longer.
Activity
jeckersb commentedon Jun 11, 2026
https://github.com/bootc-dev/bootc/actions/runs/27350791739/job/80817797747 we got:
in the
test-integration (centos-10, ostree, xfs, grub, bls, unsealed)jobcgwalters commentedon Jul 9, 2026
Yes, one issue here turns out to be that some GHA runners have 70G disks, whereas others have 140G and the assignment is random. I think #2293 will help reduce used disk space during CI runs, but there's more to do here for sure.
I think as of recently, we've mostly mitigated these flakes with anything that runs
podman, but we don't have retries on the bootc/composefs side, which is composefs/composefs-rs#348jeckersb commentedon Jul 10, 2026
Also very hostile to efforts to parallelize tests, which is by nature going to require more peak disk usage and blur the lines on when it may or may not be safe to throw data out to save space.
cgwalters commentedon Jul 10, 2026
OK i just forced in a few PRs, especially #2293 but also a few other non-risky ones.
cgwalters commentedon Jul 10, 2026
#2306
jeckersb commentedon Jul 28, 2026
Over in https://github.com/bootc-dev/bootc/actions/runs/30287090523/job/90057479263 we have:
Which although rare I'm sure I've seen before. AI suggests it might be a race between rpm2cpio and cpio through a pipe.
Edit: ah found it - #1896
cgwalters commentedon Jul 30, 2026
Agent investigation on the reboot failures points at teemtee/tmt#5068
cgwalters commentedon Jul 31, 2026
Generated-by: https://github.com/cgwalters/cgwalters#llms
Merge queue stall, 2026-07-31
Snapshot of https://github.com/bootc-dev/bootc/queue/main today: 4 PRs queued (#2354, #2357, #2342, #2315), all effectively stuck for 2-8h. Traced through the actual
merge_groupCI runs:bootc install to-filesystemtimed out pullingquay.io/centos-bootc/centos-bootc:stream10(dial tcp ...: i/o timeout). Same class as the quay.io 502 already logged above. This PR needs to be fixed/retried or manually dequeued; it's blocking everything behind it.merge_grouprun inherited ci: Pin tmt version (to older release) instead of always installing latest #2354. It failed on something new:bootc container lint --fatal-warningsreportsvar-tmpfiles: Found content in /var missing tmpfiles.d entries: d /var/roothome/.sshon thecomposefs/uki/systemdlegs. Not caused by Workaround SIGPIPE with cpio #2357's diff — looks like a new, previously-untracked regression (base image drift is my guess).timeout-minutesset ontest-integration). It's also now reporting a real merge conflict against ci: Pin tmt version (to older release) instead of always installing latest #2354 intmt/plans/integration.fmf/tmt/tests/tests.fmf, since both touch those files and ci: Pin tmt version (to older release) instead of always installing latest #2354 is ahead of it in queue.Why failures take hours to surface, and whether we need "fail fast"
All the heavy jobs (
test-integration,test-upgrade,test-baseconfigs,package) run withfail-fast: falseacross ~35+ matrix legs, which is good for full PR diagnostic signal. But the actual required gate for the queue,required-checks-merge, doesneeds: [...] if: always()on all of those matrix jobs —needs:on a matrix job blocks until every leg reaches a terminal state. Combined with notimeout-minutesontest-integration(defaults to GitHub's 6h), a failure that's detected in the first 20-40 minutes (e.g. the roothome lint error above, which fails during container build before any boot/TMT test even runs) isn't visible to the merge queue until the slowest unrelated leg finishes or times out hours later.Suggested fixes, roughly by impact/effort:
timeout-minutesontest-integration/test-upgrade/test-baseconfigs(TMT plan durations are mostly 30m; 60-90m should be plenty). Would have turned UKI print dump diff #2315's 6h stall into ~1.5h.fail-fast: true— that would cancel ~35 healthy legs on a single flake, which given how flaky these jobs already are would waste more CI than it saves.merge_group: a lint-only container build (bootc container lint --fatal-warnings, no TMT boot) that runs in minutes ahead of the expensive matrix, so deterministic build/lint failures get caught once instead of being silently rediscovered on N legs hours later.bootc install to-filesystemin the TMT tests isn't covered by the existingBOOTC_CI_RETRIES/BOOTC_CI_DELAYwrapper (that only wraps the pre-buildpodman pullin the Justfile) — extending retry coverage there would directly address the ci: Pin tmt version (to older release) instead of always installing latest #2354 flake class.Immediate action needed: fix/dequeue #2354, rebase #2315 onto a resolved queue tip, and track down the
/var/roothome/.sshvar-tmpfiles regression on the UKI+systemd variant (new, not seen before today).lint: Ignore `/var/roothome/buildinfo/content-sets.json`
lint: Ignore `/var/roothome/buildinfo/content-sets.json`
lint: Ignore `/var/roothome/.ssh`
lint: Ignore `/var/roothome/.ssh`
cgwalters commentedon Aug 3, 2026
OK we discussed having a
ci/skip-integrationstyle label which would bypass all the integration testing in the merge queue. Some research says this is somewhat nontrivial to do because the binding between the originating PR (and its labels) requires some complex backreferencing from the merge queue.I guess I lean towards going back to merging individual PRs until we can make the queue much more reliable. And there a
ci/skip-integrationlabel would bypass all the integration testing jobs.Johan-Liebert1 commentedon Aug 4, 2026
Another case where the GitHub runner just gives up https://github.com/bootc-dev/bootc/actions/runs/30875522062/job/91891077870?pr=2342
This probably has to do with the runner itself
cgwalters commentedon Aug 4, 2026
FTR this is done now, however we are also now I realize not gating on integration tests at all for merging.
16 remaining items
deploy: Retry transient registry blob pulls
install: Use retrying pull for OSTree installs
install: Use retrying pull for OSTree installs
deploy: Retry transient registry blob pulls
install: Use retrying pull for OSTree installs
ci: Keep package artifacts for a week instead of a day
ci: Keep package artifacts for a week instead of a day
ci: Keep package artifacts for a week instead of a day
ci: Keep package artifacts for a week instead of a day
ci: Keep package artifacts for a week instead of a day
jeckersb commentedon Oct 7, 2026
From https://github.com/bootc-dev/bootc/actions/runs/37623963296/job/112817153092?pr=2553:
Looks like we need to do a better job of waiting/retrying/killing so the unmount succeeds
cgwalters commentedon Oct 7, 2026
umount -lis the right default for cases like thistest: Unmount using `umount -l`
test: Unmount using `umount -l`
test: Unmount using `umount -l`