镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

fix(dev): fail fast on missing Linux desktop system libraries - #8422

Open
Muller-Castro wants to merge 1 commit into
block:mainfrom
Muller-Castro:fix/linux-desktop-deps-preflight
Open

Muller-Castro wants to merge 1 commit into
block:mainfrom
Muller-Castro:fix/linux-desktop-deps-preflight

Conversation

@Muller-Castro

@Muller-Castro Muller-Castro commented Oct 18, 2026 •

Copy link
Copy Markdown

Problem

On a fresh Linux machine, just dev compiled hundreds of crates before failing inside *-sys build scripts when GTK/WebKitGTK/ALSA development packages were absent. The failure named one pkg-config module and did not say how to install the rest:

error: failed to run custom build command for `gdk-sys v0.18.2`
Package 'gdk-3.0' not found

Fix

  • Add scripts/check-linux-desktop-deps.sh:
    • checks every pkg-config module the desktop crate needs (gtk+-3.0, webkit2gtk-4.1, javascriptcoregtk-4.1, libsoup-3.0, alsa, openssl, librsvg-2.0, ayatana-appindicator3-0.1);
    • prints all missing modules plus the exact install command for apt/dnf/pacman/zypper;
    • --install performs the install explicitly (no silent sudo);
    • no-op off Linux.
  • Wire the check before Tauri build/check/test recipes via _ensure-sidecar-stubs.
  • Add just linux-deps and just linux-deps-check.
  • Update CONTRIBUTING.md and include pkg-config in the desktop CI package list.
  • Add a regression test covering fail-closed behavior, exact-token distro detection (solus must not match Oracle Linux's ol), and the non-Linux no-op.

Testing

  • just linux-deps-check passes on a provisioned machine.
  • scripts/test-check-linux-desktop-deps.sh passes.
  • shellcheck scripts/check-linux-desktop-deps.sh scripts/test-check-linux-desktop-deps.sh clean.
  • Simulated missing-module runs produce the expected apt and dnf install commands; --install on an unknown distro exits 2 with guidance.

Human test

Run just linux-deps-check (expected: silent success). To exercise the failure path, temporarily hide one module or run on a machine missing the packages; the check should name it and print the install command.

🤖 Generated with Claude Code

Human test: just linux-deps-check on the submitter machine exited 0.

buzz-review-completed

`just dev` compiled hundreds of crates before failing in `*-sys` build scripts
when GTK/WebKitGTK/ALSA development packages were absent, with a pkg-config
error that did not say how to install them.

Add a preflight (`just linux-deps-check`, `just linux-deps`) that checks the
pkg-config modules the desktop crate needs, prints every missing module plus
the exact install command for apt/dnf/pacman/zypper, and runs before Tauri
build, check, and test recipes. It is a no-op off Linux, and `--install` is
explicit rather than silently invoking sudo.

Document the recipes in CONTRIBUTING, include pkg-config in the desktop CI
package list, and add a regression test covering fail-closed behavior and
exact-token distribution detection.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Muller-Castro <37383316+Muller-Castro@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

🔐 Codex Security Review

Status: review required for the current range.

The current range is a96ace4e55baa9c943cfbbfc323502ff2eff05f3...b81aa73ab045b8065c5635aff902563abcf9c4ec.
A new review must complete for this exact range. When manual authorization
is required, a user with write access must comment exactly
@buzz-security-review b81aa73ab045b8065c5635aff902563abcf9c4ec to authorize a new review.
Any previous review applies only to its recorded range.

@Muller-Castro
Muller-Castro marked this pull request as ready for review October 18, 2026 05:17
@Muller-Castro
Muller-Castro requested a review from a team as a code owner October 18, 2026 05:17
matt2e added a commit that referenced this pull request Oct 29, 2026
…cap (#8679)

## Summary

Fixes the two CI workflow defects that turned `main` red most often in
the 21–28 Oct 2026 audit:

- **Desktop Tauri:** the lane now caches its apt `.deb`s. It no longer
re-downloads 62 MB from a slow Ubuntu mirror on every run.
- **Windows Rust:** the lane drops a duplicate `cargo check` and gets a
60 min cap, so a cold run can save its cache.

It also updates #8613's `scripts/flake-check.test.mjs`, which breaks
once the Tauri package list moves into an env var. There are no product
code or test-behaviour changes.

This is one of seven PRs split out of the `flakey-tests` branch
(siblings below).

### Related issue

None found. #8613 touched both workflows after the audit, but not these
steps. No open PR changes how the Tauri packages are fetched, the
Windows timeout, or its Check (workspace) step:

- #8422, #8321 and #8373 only add packages to the list, and would now
add them to `TAURI_APT_PACKAGES`.
- #8414 adds two mesh-llm Tauri steps to the Windows job. If it lands,
they must fit the cold budget below.

### CI failures fixed

| Lane / test | Failing runs | Cause | Change |
|---|---|---|---|
| Desktop Tauri, "Install Tauri dependencies (Linux)"
(`_ci-desktop.yml`) | 62 jobs in 51 run attempts, 22–27 Oct. On main:
39821769576, 39822883395, 39827234118, 40333705511, 40342468627,
40348069929, 40353619362, 40368315739, 40373404267, 40374519539,
40556742929 | All 3 `ci-apt-retry.sh` attempts hit their 420 s limit
while `azure.archive.ubuntu.com` served the 62 MB at 20–65 KB/s. The
25.5 MB `libwebkit2gtk-4.1-0` alone takes a whole attempt, and each
attempt loses its partial download. | The package list moves to a
job-level `TAURI_APT_PACKAGES`. A new "Resolve Tauri apt archives" step
builds the cache key from `apt-get install --print-uris -o
Acquire::ForceHash=SHA256` (name, size and SHA256 per file).
`actions/cache/restore` uses that key. The install step copies only the
restored files whose SHA256 matches the signed index, because apt 2.8.3
reuses any same-size cached `.deb` without hashing it. A best-effort
rebuild keeps exactly the listed files. `actions/cache/save` runs only
on core-lane pushes after a successful rebuild; PR runs never save. |
| Windows Rust (`_ci-rust.yml`) | All on main: 39796569342 (job
119885795086), 39821769576 (119975358772), 39827234118 (119994286695),
39865872891 (120128351939), 40402556064 (121852634685) | Every test
passed. Cold steps take 41.3–43.5 min, so the 45 min cap cancelled the
`Swatinem/rust-cache` post-run save 1.6–3.7 min in. No cache was
written, and the next push was cold again. | Delete "Check (workspace)".
The clippy step before it covers the same `--workspace --all-targets`
set with `-D warnings`, which saves 2.0–2.8 min. Raise `timeout-minutes`
from 45 to 60, with the measured breakdown in a comment: 39–41 min of
steps, a ~4.5 min save and ~15 min of margin. |
| `scripts/flake-check.test.mjs` "repeat invocations mirror the lanes
they stand in for" | None in CI yet: it fails only with this change
applied | #8613 added this test after `flakey-tests` branched. It checks
that the advisory `flake-tauri` lane installs the same packages as the
Desktop Tauri core lane, by regex-matching the inline `apt-get install
-y --no-install-recommends \` list in `_ci-desktop.yml`. That list now
lives in `TAURI_APT_PACKAGES`, so the regex matched nothing and the test
failed with "Desktop Tauri apt packages". | Read `TAURI_APT_PACKAGES`
from `_ci-desktop.yml` and compare package names (12 on each side) with
`_ci-flake.yml`'s list. Renaming one package in `_ci-flake.yml` still
fails the test. Giving the `flake-tauri` lane the same read-only `.deb`
restore is a follow-up. |

Local evidence is from the original `flakey-tests` commit (9aa768a3b):

- The apt steps ran verbatim in Ubuntu 24.04 containers with apt 2.8.3,
with the cache restore and the save step's `if:` emulated.
- On a miss, the install fetches everything ("Need to get 254 MB"). On
an exact hit with the network down, it fetches nothing ("Need to get 0
B/254 MB").
- On a fallback with one `.deb` missing and one corrupted at the same
size, the hash check rejects the corrupt file, and apt re-fetches only
the corrupt and missing files.
- The key was identical in all four simulated jobs.
- The Windows numbers come from the jobs API for the five runs above.

On this branch, the split session ran the `scripts/` node tests:
`ci-selection`, `ci-required-gates`, `ci-apt-retry` and `flake-check` on
macOS gave 84 pass, 0 fail and 8 skipped (Linux-only). Before the
`flake-check.test.mjs` fix, that test failed 1 case. The same session
ran actionlint 1.7.12 with shellcheck, which was clean, and the
rust-cache contract scripts, which passed.

### Verification

This branch was pushed without further local re-verification, by the
user's choice: local test runs were overloading the machine and failing
for that reason. **Hosted CI is the check.** It was pushed with `git
push --no-verify` over SSH. The pre-push hook runs tests, and the HTTPS
token lacks the `workflow` scope.

Only hosted CI can show:

- The runner's real package list (about 62 MB) and the same key in all
three Tauri lanes.
- The `actions/cache` round trip. The first PR run misses, because
`main` has no key yet. After merge, the first push to `main` saves it.
- A cold Windows run saving its cache within the new cap. The next
toolchain bump or cache eviction will show it.

Remaining risk: after Ubuntu updates a large package, runs fetch it from
the mirror until a push to `main` saves a new key.

### Readiness

CI-only change. AGENTS.md's readiness steps (agent review, then human
confirmation) are still outstanding, so `buzz-review-completed` is not
set.

### Merge order

Independent of the other six. It merges cleanly onto `main`, and with
every sibling, in any order.

### Sibling PRs

Split from `flakey-tests` (one PR per area): #8676 (PostgreSQL lease +
lane), #8677 (relay E2E helper + Windows shell), #8678 (mobile), #8680
(desktop product races), #8681 (desktop E2E state gates), #8682 (desktop
E2E composer + row actions).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Signed-off-by: Matt Toohey <contact@matttoohey.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

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