Skip to content
lake
Browse this documentation section

Mise + GitHub CI Standards

This guide is the source of truth for local tool setup, Bun shell scripts, and GitHub Actions. If an agent edits mise.toml, .pre-commit-config.yaml, scripts under scripts/, or .github/workflows/*.yml, it MUST read this file first.

Goals

Ownership

Tool Version Rules

Task Rules

Bun Shell Rules

GitHub Actions Rules

Conventional Commits

Repository releases

Release Please maintains one repository release for the entire lake workspace. It does not publish the internal crates, which remain publish = false.

The workflow uses GitHub’s short-lived built-in GITHUB_TOKEN; no long-lived release credential is stored. This matches the repository’s local-first model: generated release PRs do not trigger a separate pull-request workflow. Maintainers review the version/changelog diff and run mise run gate before merge, while the existing main-only CI remains the post-merge backstop.

Release Please continuously updates one release PR from Conventional Commits. Merging that PR updates the changelog and versions, creates vX.Y.Z without a component prefix, and publishes the matching GitHub Release. When that root release is created, the same short-lived token automatically dispatches the existing image workflow with the exact release tag. The image workflow still checks out and validates that published immutable tag before it publishes the multi-platform GHCR image. Its 180-minute job budget leaves room for a cold QEMU build while making a stalled release a finite, actionable failure instead of relying on the GitHub Actions default.

The release event created by GITHUB_TOKEN intentionally does not trigger a second workflow, so this workflow_dispatch handoff is required rather than optional wiring. For a release made before the handoff existed, run the manual image backfill with the published release tag:

gh workflow run release-image.yml --ref main -f tag=vX.Y.Z

The workflow checks out two immutable revisions. release-source is always the published tag and is the sole Docker build context; it is validated against the GitHub Release target SHA and remains org.opencontainers.image.revision. build-recipe is the workflow revision: on a normal release event GitHub supplies the tag revision, while the documented manual command dispatches main and therefore supplies the current Cargo-chef Dockerfile to rebuild an older immutable source. The distinct io.rararulab.lake.build-recipe.revision OCI label records that recipe SHA; it does not change the source identity or release tag.

Cargo-chef derives recipe.json from that release-source context. When the workspace recipe names a local path dependency, the builder must copy that exact dependency from the planner before cargo chef cook; copying only the recipe makes Cargo resolve a path that is absent from the builder filesystem. Keep this transfer narrower than the later application-source copy so normal source changes do not invalidate the exportable cooked-dependency layer. A historical backfill repair is not complete until a native --target builder build against the immutable tag reaches the builder stage, rather than merely proving that the planner can emit a recipe.

Wait for the Publish release image run to complete, then resolve the manifest-list digest and verify both linux/amd64 and linux/arm64 before updating a production deployment.

Review Checklist

Before approving a PR that changes the toolchain, scripts, or CI: