Continuous Integration¶
GitHub Actions runs .github/workflows/ci.yml on every pull request
into develop or main, on pushes to those branches, and on demand.
Job |
Runner |
What it runs |
|---|---|---|
Linux (check, bindings, e2e) |
Ubuntu 24.04 |
|
Desktop app smoke test (Linux) |
Ubuntu 24.04 |
|
macOS / Windows (build, test) |
macOS 15, Windows Server 2025 |
|
Documentation |
Ubuntu 24.04 |
|
Every pull request must be green before it is merged.
Smoke test of the real app¶
The end-to-end tests drive the UI in a browser against the development server; the smoke test checks the real Tauri window:
The window opens on the empty library; a library folder is set.
A folder with three fixture photos is added as a watched import folder; the photos appear in the library without reloading, and Activity shows each one imported.
One photo is picked with P.
The app is restarted: the three photos, the pick and the import folder are still there.
A new photo copied into the folder is imported on its own and appears in the library.
Run it locally with make smoke (the devcontainer has Xvfb, tauri-driver and
WebKitWebDriver). It starts its own Xvfb on :99 and clears
WAYLAND_DISPLAY, so no window appears on a real screen (an Xvfb
already running there is reused), and gives the app fresh data folders. Screenshots land in target/smoke-results.
Conventions¶
The Makefile is the interface. Jobs call the same
maketargets developers run locally. To change what CI checks, change the Makefile target, not the workflow.Locked dependencies. CI sets
CARGO_FLAGS=--locked, so a build fails ifCargo.lockis out of date;npm cidoes the same forpackage-lock.json.Pinned actions. Third-party actions are pinned to a commit SHA, with the release tag in a comment. Update both together.
Caching. Cargo builds are cached per job with
Swatinem/rust-cache; npm downloads withactions/setup-node.
Validate workflow changes locally with actionlint:
actionlint .github/workflows/*.yml
Cost¶
While the repository is private, Actions minutes count against the
account’s quota, and macOS minutes count ten times. The macOS job is the
first candidate to restrict (for example to pushes on develop) if the
quota runs low. Public repositories have no limit.