cargo-changeset
⚠️ This project is in a very early stage of development and is not yet ready for production use.
What is cargo-changeset?
cargo-changeset is a tool for managing versioning and changelogs in Cargo projects and workspaces. It helps teams coordinate releases by allowing contributors to declare intent to release packages along with a summary of changes.
How it works
- Add changesets: When making changes, developers add a changeset file describing what changed and which packages should be released
- Track changes: The tool tracks pending changesets and shows which packages need releases
- Bump versions: When ready to release,
cargo-changesetautomatically bumps package versions according to semantic versioning rules - Generate changelogs: Changelog entries are automatically generated from changeset summaries
CI Usage
Automatic CI Detection
cargo-changeset automatically detects when it's running in a CI environment and disables interactive prompts. When CI is detected, commands that require user input will fail with a helpful error message explaining which flags to use.
The following CI environment variables are detected:
CI(generic)GITHUB_ACTIONSGITLAB_CICIRCLECITRAVISJENKINS_URLBUILDKITETF_BUILD(Azure DevOps)
Environment Variables
| Variable | Description |
|---|---|
CARGO_CHANGESET_NO_TTY |
Disable interactive mode (highest priority) |
CARGO_CHANGESET_FORCE_TTY |
Force interactive mode (ignored in CI) |
Non-Interactive Commands
When running in CI, provide all required arguments:
# Add a changeset non-interactively
# Add a changeset for multiple packages
Integration
Git Hook (Manual)
To enforce changeset coverage before every commit, add the following script to your repository:
.git/hooks/pre-commit (or scripts/pre-commit to commit alongside your code):
#!/usr/bin/env bash
BASE=""
if ! ; then
fi
Then make it executable and install it:
To override the default base branch, set the CHANGESET_BASE environment variable:
CHANGESET_BASE=develop
pre-commit Framework
If your project uses the pre-commit framework, add a local hook to your .pre-commit-config.yaml:
repos:
- repo: local
hooks:
- id: cargo-changeset
name: Verify changeset coverage
language: system
entry: cargo changeset verify
pass_filenames: false
always_run: true
This calls the locally-installed cargo-changeset binary directly. Install or update the hook with:
Docker Image
Pre-built Docker images are available for linux/amd64 and linux/arm64:
| Registry | Image |
|---|---|
| GHCR | ghcr.io/lukidoescode/cargo-changeset |
| Docker Hub | lukidoescode/cargo-changeset |
Tags: latest, or a specific version like 0.1.0.
GitHub Actions — Verify Action
Use the verify action to check changeset coverage on pull requests. No Rust toolchain or compilation required.
name: Verify Changeset Coverage
on:
pull_request:
branches:
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: lukidoescode/cargo-changeset/.github/actions/verify@v1
with:
base: ${{ github.event.pull_request.base.ref }}
Note:
fetch-depth: 0is required so thatcargo-changesetcan compare against the base branch.
Inputs:
| Input | Default | Description |
|---|---|---|
base |
main |
Base branch to compare against |
GitHub Actions — Release Workflow
Use the reusable release workflow to automate version bumps, changelog generation, and git tagging.
jobs:
release:
uses: lukidoescode/cargo-changeset/.github/workflows/release-workflow.yml@v1
permissions:
contents: write
With dry-run preview:
jobs:
release:
uses: lukidoescode/cargo-changeset/.github/workflows/release-workflow.yml@v1
permissions:
contents: write
with:
dry-run: true
Inputs:
| Input | Type | Default | Description |
|---|---|---|---|
dry-run |
boolean | false |
Preview without modifying files |
version |
string | latest |
Docker image version tag |
git-user-name |
string | github-actions[bot] |
Git user for commits |
git-user-email |
string | github-actions[bot]@users.noreply.github.com |
Git email for commits |
GitHub Actions CI (Install from Source)
If you prefer to install from source instead of using the Docker-based action:
- name: Install cargo-changeset
run: cargo install cargo-changeset
- name: Verify changeset coverage
run: cargo changeset verify --base ${{ github.event.pull_request.base.ref }}
With caching to avoid reinstalling on every run:
- name: Cache cargo-changeset
uses: actions/cache@v4
with:
path: ~/.cargo/bin/cargo-changeset
key: cargo-changeset-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
- name: Install cargo-changeset
run: cargo install cargo-changeset
- name: Verify changeset coverage
run: cargo changeset verify --base ${{ github.event.pull_request.base.ref }}
GitHub Actions Example (Adding Changesets)
name: Add Changeset
on:
workflow_dispatch:
inputs:
package:
description: "Package to release"
required: true
bump:
description: "Bump type (major, minor, patch)"
required: true
type: choice
options:
- patch
- minor
- major
message:
description: "Change description"
required: true
jobs:
add-changeset:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install cargo-changeset
run: cargo install cargo-changeset
- name: Add changeset
run: |
cargo changeset add \
--package ${{ inputs.package }} \
--bump ${{ inputs.bump }} \
-m "${{ inputs.message }}"
- name: Commit changeset
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .changeset/
git commit -m "Add changeset for ${{ inputs.package }}"
git push
GitLab CI
Use the Docker image directly in GitLab CI pipelines.
Verify changeset coverage on merge requests:
verify-changesets:
image: ghcr.io/lukidoescode/cargo-changeset:latest
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- cargo-changeset verify --base $CI_MERGE_REQUEST_TARGET_BRANCH_NAME --quiet
Release workflow:
release:
image: ghcr.io/lukidoescode/cargo-changeset:latest
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
script:
- git config user.name "gitlab-ci[bot]"
- git config user.email "gitlab-ci[bot]@users.noreply.gitlab.com"
- cargo-changeset release
- git push origin HEAD:$CI_COMMIT_BRANCH --tags