Skip to content

chore: adopt release-please + mise-driven CI - #92

Merged
perfectra1n merged 5 commits into
mainfrom
chore/release-please-mise
Jul 13, 2026
Merged

chore: adopt release-please + mise-driven CI#92
perfectra1n merged 5 commits into
mainfrom
chore/release-please-mise

Conversation

@perfectra1n

Copy link
Copy Markdown
Owner

What this does

mise (mise.toml) is now the single source of truth for toolchain + tasks:

  • Rust pinned at 1.96 in lockstep with the Dockerfile builder image (Renovate rule added to bump both together)
  • cargo-tarpaulin / cargo-audit pinned as mise tools (installed via cargo-binstall — prebuilt, no compiling in CI)
  • Every dev/CI command is a task: mise run ci locally runs the same fmt-check/lint/build/test gates CI runs

CI consolidated: ci.yml, build.yml, unit-tests.yml, integration-tests.yml (which ran the same tests 2-3x per push) are now ONE ci.yml with jobs: test (3-OS matrix), quality, test-scm, e2e, coverage, audit — all calling mise run <task> via jdx/mise-action. Manual triple actions/cache replaced with Swatinem/rust-cache.

release-please replaces manual tagging: release.yml runs 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 on release_created — in the same workflow, so no PAT is needed for tag-triggered workflows. The tag==Cargo.toml guard is structurally obsolete.

Intentionally dropped

  • Rust beta matrix legs (stable only now)
  • Per-PR multi-target binary artifact builds (binaries build on release only)
  • cargo-outdated job (Renovate covers it)
  • Duplicate audit/coverage/fmt/clippy runs across the old workflows
  • fmt/clippy are now enforcing (previously || true / continue-on-error); tree brought to rustfmt-clean in the first commit

Verified

  • mise run ci green locally (fmt-check, clippy -D warnings, build, full single-threaded test suite)
  • actionlint clean on all three workflows
  • release-please release-pr --dry-run against this branch: finds v0.3.2 as ancestor, parses config, correctly proposes no release for these chore/style commits
  • Repo setting "Allow GitHub Actions to create and approve pull requests" is already enabled

After merge

  • release.yml will only maintain a release PR — nothing publishes until that PR is merged
  • First feat:/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

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.
@perfectra1n
perfectra1n merged commit 67fb73b into main Jul 13, 2026
8 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