chore: adopt release-please + mise-driven CI - #92
Merged
Conversation
fmt was never enforced in CI (checks ran with '|| true'); the consolidated CI makes it a hard gate, so bring the tree to rustfmt-clean first.
mise.toml pins the Rust toolchain (in lockstep with the Dockerfile builder image) plus cargo-tarpaulin/cargo-audit, and defines every dev/CI task (fmt, lint, build, test variants, audit, coverage, doc, e2e). ci: consolidate 4 overlapping workflows into one mise-driven ci.yml and replace tag-triggered releases with release-please. release.yml runs release-please on every main push; merging its release PR creates the tag + GitHub Release and fans out binary/crates.io/Docker publishing gated on release_created. The tag==Cargo.toml guard is obsolete: release-please owns version bumps (Cargo.toml, Cargo.lock, CHANGELOG.md).
test_file_permissions and test_symlink_handling use std::os::unix APIs and never compiled on Windows (pre-existing; the old Windows CI legs were red on main too). Gate both with #[cfg(unix)]. tarpaulin runs test binaries in parallel by default, racing on the shared env vars this suite requires to be serial (CLAUDE_CODE_SYNC_CONFIG_DIR, XDG_CONFIG_HOME) — config::tests::test_xdg_config_home_respected failed under coverage. Pass --test-threads=1 through, matching every other test invocation in this repo.
The e2e tests fake per-machine homes by overriding HOME, but dirs::home_dir() resolves the profile via the known-folder API on Windows and ignores the environment, so both simulated machines collapsed onto the real runner profile (0 sessions discovered, no convergence). Give claude_home_dir() a CLAUDE_CODE_SYNC_CLAUDE_DIR override — the same escape hatch config resolution already has with CLAUDE_CODE_SYNC_CONFIG_DIR — and have the test harness set it alongside HOME. These tests had never executed on Windows before: every prior run died compiling tests/integration_tests.rs first.
On a mise-action cache hit the rust toolchain is not in the restored cache (~/.rustup is outside it), so the runner's preinstalled rustup lazily reinstalls it with profile=minimal on first use — without rustfmt or clippy. rustup component add is a no-op when they are already present.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
mise (
mise.toml) is now the single source of truth for toolchain + tasks:cargo-tarpaulin/cargo-auditpinned as mise tools (installed via cargo-binstall — prebuilt, no compiling in CI)mise run cilocally runs the same fmt-check/lint/build/test gates CI runsCI consolidated:
ci.yml,build.yml,unit-tests.yml,integration-tests.yml(which ran the same tests 2-3x per push) are now ONEci.ymlwith jobs: test (3-OS matrix), quality, test-scm, e2e, coverage, audit — all callingmise run <task>viajdx/mise-action. Manual tripleactions/cachereplaced withSwatinem/rust-cache.release-please replaces manual tagging:
release.ymlruns on every push to main. It maintains a release PR (version bump in Cargo.toml + Cargo.lock, CHANGELOG.md) from conventional commits. Merging that PR creates the tag + GitHub Release, then binary builds (same 5 targets, same asset names), crates.io publish, and ghcr.io Docker push run gated onrelease_created— in the same workflow, so no PAT is needed for tag-triggered workflows. The tag==Cargo.toml guard is structurally obsolete.Intentionally dropped
cargo-outdatedjob (Renovate covers it)|| true/continue-on-error); tree brought to rustfmt-clean in the first commitVerified
mise run cigreen locally (fmt-check, clippy-D warnings, build, full single-threaded test suite)actionlintclean on all three workflowsrelease-please release-pr --dry-runagainst this branch: finds v0.3.2 as ancestor, parses config, correctly proposes no release for these chore/style commitsAfter merge
release.ymlwill only maintain a release PR — nothing publishes until that PR is mergedfeat:/fix:commit produces the 0.3.3/0.4.0 release PR; verify its diff touches Cargo.toml, Cargo.lock, CHANGELOG.md, .release-please-manifest.json