Skip to content

bob-cli CI

The reusable CI workflow checks Rust code, scripts, and package contents on Linux and macOS. The release train calls it with full=true for the exact SHA it plans to release.

Triggers

CI runs on pushes to master and ci/** branches, pull requests, manual workflow dispatches, and workflow_call. Manual dispatch accepts full, a boolean that defaults to false. The release workflow passes the SHA and full=true through workflow_call.

Jobs

Job Runner Checks Local equivalent
lint ubuntu-latest Format, clippy, scripts, and release-tool tests just fmt; just lint; just check-scripts; just check-release-tools
test ubuntu-latest and macos-latest Locked Rust test suite; macOS also lints macOS-only targets cargo test --locked --no-fail-fast; on macOS also just lint
package ubuntu-latest Package contents and archive size just package-check

The lint job runs release-tool unit tests through check-release-tools. The package job uses Cargo package verification, checks that required notices are included, and keeps the archive below its size thresholds. CI does not run docs-check; the docs publishing pipeline owns that gate.

When full=true, Linux installs zsh, pandoc, poppler utilities, TeX packages, fonts, and other tools needed by tests that otherwise self-skip. A ci/full* push also enables this set of tools. macOS installs Bash 5 for tests that need it while preserving its native BSD utilities.

Measured GitHub job times

The CI phase measured these wall times on GitHub Actions:

Run Lint Package Linux tests macOS tests
Normal, full=false 1m13s 1m15s 3m49s 7m10s
Full, full=true 1m43s 1m48s 7m10s 11m35s

Runner queues and cache state change these times; use them as a reference, not a service-level target.

Keep tests portable

Tests must not depend on a developer's HOME configuration, extra PATH tools, locale, or timezone. Give tests temporary configuration and directories, put any stub executable on a test-controlled PATH, and set an available UTF-8 locale or make text assertions locale-independent. Set TZ explicitly when a test depends on a date.

Run CI on a scratch branch

Push a ci/** branch to run the normal workflow without changing master. Use a branch starting with ci/full to run the extra Linux tools. Remove the scratch branch after review. For release workflow changes, use ci/release/**; those runs are always dry runs.

Tested rolling snapshot bob-cli 41afa14 bob-mac-capture 556bb67 bob-plugins af1e691 Built 2026-10-24T22:34:13Z (zensical) build.json