Skip to content

ci(pr): PR pipeline → ubuntu-26.04 + distro Meson - #2306

Open
justinjoy wants to merge 3 commits into
mainfrom
ci/2604-pr-ci-distro-meson
Open

justinjoy wants to merge 3 commits into
mainfrom
ci/2604-pr-ci-distro-meson

Conversation

@justinjoy

@justinjoy justinjoy commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Scope (PR CI only)

  • .github/workflows/ci-pr.yml: all ubuntu legs → ubuntu-26.04 / ubuntu-26.04-arm (runs-on, job names, matrix, comments); 7 Set up Meson 1.12.0 step blocks removed — every meson-invoking job now installs the distro-provided meson per OS (apt ×7, brew ×2, choco ×1).
  • .github/workflows/lint-pr.yml: runs-on → ubuntu-26.04 (job names untouched — branch-protection contexts).
  • Lockstep updates (required, verified): 6 ci-telemetry-fixtures/run-*-jobs.json + test-ci-run-telemetry.py (test reads the live ci-pr.yml), test-ci-pr-build-timeouts.py, test-early-size-gate.sh, RELEASE_PROCESS.md required-context list, collect-size-attribution.py policy-identity token (+ clarifying comment), 2 comment-only arm renames.
  • Intentionally untouched: setup-meson action (still used by android/ios/size-attribution/ci-main), ci-main.yml, release-tag.yml, tier1-sanitizers.yml, perf/fuzz/size-attribution workflows, frozen size-baseline records (verify-size-baseline.py, test-size-baseline-provenance.py).

Live-run fixes (first PR CI run 40888053298)

The first live run validated the 26.04 legs (all started and passed: TSan, TSan-native, Sanitizers/macos, both lints, RC gate — runner-label risk fully retired) and exposed exactly two distro-meson incompatibilities, both fixed in 9a62e4ea:

  1. meson test --exclude does not exist in distro meson 1.10.1 (unrecognized arguments: --exclude killed the sanitizer-matrix leg). The step now derives "everything except sbom_snapshot" at run time from meson introspect --tests builddir-san (positional dir in 1.10.x) + grep -Fxv sbom_snapshot, so the other sbom-suite contract tests still run (which is why --no-suite sbom was the wrong tool). test-required-gates.sh gains a sanitizer_excludes_snapshot_dynamic assertion for the PR workflow; ci-main.yml and tier1-sanitizers.yml keep the original --exclude assertion untouched (they stay on pinned meson 1.12 via setup-meson).
  2. SBOM baseline drift — removing the setup-meson action references from ci-pr.yml dropped the scanned local-action entries (12 → 11 workflow references); sbom/snapshot.txt regenerated with CI's pinned syft 1.50.0 and now byte-matches a clean CI checkout scan (verified by running the gate's exact pipeline; the failed run's own diagnostic showed 11).

Live-run fixes (second PR CI run 40932685444 — 18/19 green)

Every ubuntu-26.04 leg, both macOS legs, and all lints/gates were green; the only failure was Build / windows-latest / msvc: choco install meson succeeds (official 1.12.1 MSI) but the MSI writes its PATH entry into the machine registry, which the job's already-snapshotted environment never sees, and chocolatey creates no shim for MSI packages — so meson was unresolvable at Configure ("The term 'meson' is not recognized", job log 40932685444). Fixed in 68dcd011 (.github/workflows/ci-pr.yml, Windows install step only):

  1. Resolve the MSI install dir explicitly — chocolatey's own HKLM:\SOFTWARE\chocolatey\installed\meson record first, then the MSI's documented default locations (C:\Program Files{, (x86)}\Meson{, meson}), then a bounded scan as last resort; throws if nothing is found (fail-loud).
  2. Verify before publishing — meson.exe --version and ninja --version executed by absolute path (or shim) with $LASTEXITCODE checks, because GITHUB_PATH only takes effect in later steps; the verified dir is then appended to GITHUB_PATH — the same mechanism the former setup-meson action used.
  3. ninja is now explicitly in the choco install list and its resolvability is asserted, so meson setup can find it in every delivery mode (MSI-bundled beside meson, or chocolatey shim on base PATH).

Rerun note: the first attempt of this commit failed only on the pkgconfiglite download (SourceForge mirror timeout — exited 404, transient infra); the new $LASTEXITCODE check caught it and failed the step loudly, exactly as designed (meson/ninja had already landed). The targeted re-run (gh run rerun --failed) passed: 19/19 jobs green, with meson 1.12.1 resolved from the documented install dir and ninja 1.13.2 (base-image shim) verified in-step before GITHUB_PATH publication.

First run of 68dcd011 (40978095312): all 18 non-Windows legs green on the first attempt; the Windows leg failed only because the SourceForge mirror for pkgconfiglite timed out mid-download (transient infra, exited 404) — the new $LASTEXITCODE check caught it and failed the step loudly, exactly as designed. The targeted re-run (gh run rerun --failed) then passed: 19/19 jobs green, with meson 1.12.1 resolved via the documented candidate dir and ninja (base-image 1.13.2 shim) verified in-step.

Accepted trade-offs (documented)

  1. Meson version drift — PR legs now run the distro meson (unpinned), as directed. Mitigants: meson.build only requires >=0.62.0; gate scripts are version-tolerant by design (check-shell-gate-walltime joins on command, check-required-correctness accepts both name forms); the two "Verified on meson 1.12.0" comments are reworded to historical-verification phrasing.
  2. ninja parallelism cap (setup-meson/ninja-cap.py, NINJA/WIRELOG_NINJA_REAL) dropped from PR legs — zero consumers in ci-pr.yml/meson.build; accepted.
  3. Runner labels — ubuntu-26.04 / ubuntu-26.04-arm: confirmed present by the first live run (every 26.04 leg scheduled and started).
  4. Follow-up hardening (accepted residual, non-blocking): the dynamic-exclusion gate assertion uses substring matching (a superstring exclusion target would still pass; worst case is the redundant SBOM scan running under sanitizers → visible timeout, never a silent skip), and the introspect pipeline has no pipefail (broken introspect ⇒ empty list ⇒ full suite runs, fail-visible). Both bounded; candidate for a later PR.

⚠️ Maintainer action required

Re-point branch-protection required-check contexts to the new job names, e.g. Build / ubuntu-latest / gcc → Build / ubuntu-26.04 / gcc, Build / ubuntu-24.04-arm / gcc → Build / ubuntu-26.04-arm / gcc (full list already updated in docs/RELEASE_PROCESS.md). Until then, old-name required checks will block merges.

Size gate note

PR size gate is advisory mode; the baseline (428046) was calibrated on the 24.04/gcc-13.3/meson-1.12 profile — re-verify on the 26.04 profile before flipping to enforced.

Validation (all green, uv venv)

test-required-gates.sh (26 assertions), test-gate-skip-exit-codes.sh, test-early-size-gate.sh, test-generate-sbom.sh, test-sbom-venv-exclusion.sh, check-sbom-wrap-pin.sh, check-sbom-snapshot-locale.sh, check-sbom-snapshot.sh (118 packages, syft 1.50.0), test-check-shell-gate-walltime (17), test-ci-run-telemetry (41 + subtests), test-size-attribution (41), test-branch-protection-contract (13), test-tsan-timeout-policy (11), test-size-baseline-provenance; all three workflow YAMLs parse. The meson-1.10.1 mechanics were additionally exercised end-to-end on a scratch project by the review roles (--exclude rejected as in CI; positional introspect + exact-name meson test selection works; other sbom-suite tests retained). Pre-existing base failures (not caused by this change, verified on clean tree): test-ci-build-cap 1 fail (path canonicalization), test-required-correctness 1 error (subprocess launch).

- ci-pr.yml: all ubuntu legs -> ubuntu-26.04 / ubuntu-26.04-arm
- remove 7 pinned setup-meson (1.12.0) steps; install distro meson per OS
- lockstep: telemetry fixtures + test-ci-run-telemetry, build-timeouts,
  early-size-gate, RELEASE_PROCESS required contexts, size-attribution
  policy-identity token
- setup-meson action retained (android/ios/size-attribution/ci-main)

Approved candidate tree: 1f74b21
Live PR CI (run 40888053298) exposed two distro-meson incompatibilities:

1. meson 1.10.1 has no 'meson test --exclude', so the sanitizer-matrix
   step now derives 'everything except sbom_snapshot' at run time from
   'meson introspect --tests' (positional dir in 1.10.x) + grep -Fxv,
   keeping the other sbom-suite contract tests running. The PR-workflow
   assertion in test-required-gates.sh moves to a new
   sanitizer_excludes_snapshot_dynamic helper; ci-main.yml and
   tier1-sanitizers.yml keep the original --exclude assertion (pinned
   meson 1.12 via setup-meson).

2. sbom/snapshot.txt regenerated for the 26.04 profile: removing the
   setup-meson action references from ci-pr.yml drops the scanned
   local-action entry (12 -> 11 workflow references); the baseline now
   byte-matches a clean CI checkout scan (syft 1.50.0).
The Chocolatey meson package is an MSI whose PATH entry is written to
the machine registry -- invisible to the job's already-snapshotted
environment -- and it creates no chocolatey shim, so every later step
on windows-latest failed with "The term 'meson' is not recognized"
(run 40932685444).

Resolve the install dir (choco registry record first, documented
default locations next, bounded scan last), verify meson and ninja by
absolute path with exit-code checks, and publish the dir on
GITHUB_PATH -- the same mechanism the former setup-meson action used.
Fails loudly if either tool is missing or broken.

This branch has not been deployed

No deployments
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.

1 participant