Skip to content

ci(linux): start the AppImage and the .deb, not only build them - #78

Merged
EVMCOD merged 4 commits into
mainfrom
ci/linux-smoke
Oct 30, 2026
Merged

EVMCOD merged 4 commits into
mainfrom
ci/linux-smoke

Conversation

@EVMCOD

@EVMCOD EVMCOD commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

What and why

The Linux bundles workflow built the AppImage and the .deb but nothing ever started them: no one had run the Linux app yet (docs/PORTABILITY.md marks it untested on a real desktop). This adds a smoke test that starts both, as a new user would.

scripts/linux-smoke.sh deb|appimage <file>:

  • installs the .deb with apt, or runs the AppImage with --appimage-extract-and-run (no FUSE);
  • starts the app on Xvfb with env -i, an empty temporary HOME and no session bus (so no Secret Service: the app must say so and keep working);
  • checks: the server answers /api/health within 120 s; /api/platform says linux with the in-app browser off (and prints the sandbox and keychain state); /api/onboarding/state is fresh and /welcome is served; a ConductLoop window is on the display; closing the app stops the server within 15 s;
  • saves a screenshot of the display and the app's output.

It only talks to 127.0.0.1:7777 with GETs and publishes nothing. It also works by hand on a Linux machine.

Where it runs:

  • in the linux-bundles job (ubuntu-22.04, the build image), after the bundles are uploaded, so they are kept even when a check fails;
  • in a new linux-smoke job on ubuntu-latest, from the uploaded artifacts: the bundles are built on 22.04 for an older glibc, so this checks they start on a newer system too.

The .deb check runs even if the AppImage one fails, and the screenshots and logs are uploaded either way (!cancelled(), 3 days).

Also: the changelog line of #76 (Windows CI) had landed inside the published 1.2.3 section; it moves to a new Unreleased section.

How it was tested

  • bash -n and shellcheck clean (two findings annotated: the apt log is written by the user, /etc/os-release is a system file).

  • tests/test_linux_bundles_workflow.py updated and extended (both jobs, order after the uploads, artifacts, !cancelled(), the script only reading the local server and using a temporary HOME); tests/test_workflows_guard.py green (SHA pins, timeout-minutes, hosted runners; actions/download-artifact pinned to v8.0.2).

  • The script can only run on Linux, so this PR's own runs were its real test. The first time the Linux app was ever started:

    Ubuntu 22.04 (build image) ubuntu-latest (24.04)
    AppImage all 5 checks pass (server in 3–4 s) all 5 pass
    .deb all 5 pass (server in 2 s) all 5 pass

    On both, /api/platform says linux, browser off, and no keychain (no session bus here) with the explanation and the encrypted-vault fallback. Code execution is available on 22.04 and off on 24.04 (sandbox_missing: bwrap missing or blocked there), with the message saying so. The welcome page renders in the window (screenshots in the conductloop-linux-smoke-* artifacts).

    What the first runs found, all fixed here: dpkg-deb -c lists usr/bin/x without ./ (the binary path came out relative); the port closes a moment before the server exits (now waits for both); and the AppImage needs the system's libEGL/libGL like every AppImage, which a desktop has and the server runner image does not (libEGL.so.1: cannot open shared object file), so the ubuntu-latest job installs them.

    Seen, not changed here: the welcome page says the key "is stored in the Keychain of this Mac" on Linux too.

Checklist

  • Verified locally (static checks; the runtime check is this PR's CI run).
  • Tests added or updated.
  • No migrations.
  • CHANGELOG.md entry under Unreleased.
  • No personal data and no secrets.

🤖 Generated with Claude Code

scripts/linux-smoke.sh starts a Linux bundle on a virtual display (Xvfb)
with an empty HOME and no session bus, and checks that the local server
answers, /api/platform says linux with the browser off, it is a first run
with /welcome served, a ConductLoop window exists, and closing the app stops
the server. It runs in the bundles job (ubuntu-22.04, after the uploads) and
in a new linux-smoke job on ubuntu-latest from the uploaded artifacts;
screenshots and logs are kept for 3 days. Publishes nothing.

The changelog line of #76 (Windows CI) had landed in the published 1.2.3
section; it moves to Unreleased.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-29T19:46:24.122481Z 4a86b65 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

EVMCOD and others added 3 commits October 29, 2026 20:52
First run on CI: the AppImage came up (server in 2 s, linux, browser off,
first run, window on screen). Two script bugs: dpkg-deb lists paths as
"usr/bin/x" (no "./"), so the binary path came out relative; and the port
closed a moment before the server process exited, which counted as "kept
running". Wait up to 15 s for both, and show the process if one is left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aries

The AppImage did not start on ubuntu-latest: "libEGL.so.1: cannot open
shared object file". AppImages take libEGL/libGL from the system (they are
on the AppImage exclude list) and every desktop has them; the runner image
is a server without them. The .deb passed there (apt pulls them in), and on
22.04 they came with the build dependencies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@EVMCOD
EVMCOD merged commit f10cb7c into main Oct 30, 2026
6 checks passed
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