ci: tag-driven release with auto-generated notes#12
Merged
singaraiona merged 1 commit intomainfrom May 1, 2026
Merged
Conversation
Rewrite publish.yml to be triggered by `vX.Y.Z` tag pushes (or a
manual dispatch for dry-run). On a real release tag, the workflow:
1. Verifies the tag matches Cargo.toml's version field, fails
loudly if they drift.
2. Vendors rayforce at the pinned SHA (existing behavior).
3. Runs `cargo test`.
4. Publishes to crates.io, idempotent (skips if the version is
already there).
5. Generates release notes by grouping conventional-commit
subjects since the previous tag into Features / Bug fixes /
Performance / Refactoring / Documentation / Build & CI /
Chores / Other, with a "Full changelog" link.
6. Creates the GitHub Release with those notes (or updates the
notes on a pre-existing release).
7. Smoke-tests the published crate (`cargo install raysense
--version <X>` plus a downstream `cargo check`).
Bug fixes vs the prior workflow:
- `version_of` previously read from `crates/raysense/Cargo.toml`,
which never existed in the single-crate layout. Now reads from
the root Cargo.toml.
- Trigger was `release: published`, which required hand-creating
the GitHub Release before any automation could run. Now the
tag IS the trigger, and the release is created automatically
with auto-generated notes.
Manual dry-run path kept via `workflow_dispatch` with
`dry_run: true` (default) -- runs `cargo package` + `cargo publish
--dry-run` and skips release creation and smoke test.
Permissions: workflow now declares `contents: write` so the
GITHUB_TOKEN can call `gh release create` / `gh release edit`.
Prerequisite for the next real release: `CARGO_REGISTRY_TOKEN`
secret must be set on the repo (it was already referenced by the
prior workflow).
singaraiona
added a commit
that referenced
this pull request
May 1, 2026
The CI vendor step clones rayforce into vendor/rayforce/ at run time, but vendor/ is gitignored (the source of truth lives in upstream rayforce + .rayforce-version, not the committed tree). cargo package would otherwise refuse to ship what it sees as 'uncommitted changes' from those untracked files. Caught by the dry-run dispatch on PR #12's merge commit; the workflow exited with status 101 listing every vendor/rayforce/ file as untracked. Co-authored-by: Anton <anton.kundenko@gmail.com>
singaraiona
added a commit
that referenced
this pull request
May 1, 2026
Rewrite publish.yml to be triggered by `vX.Y.Z` tag pushes (or a
manual dispatch for dry-run). On a real release tag, the workflow:
1. Verifies the tag matches Cargo.toml's version field, fails
loudly if they drift.
2. Vendors rayforce at the pinned SHA (existing behavior).
3. Runs `cargo test`.
4. Publishes to crates.io, idempotent (skips if the version is
already there).
5. Generates release notes by grouping conventional-commit
subjects since the previous tag into Features / Bug fixes /
Performance / Refactoring / Documentation / Build & CI /
Chores / Other, with a "Full changelog" link.
6. Creates the GitHub Release with those notes (or updates the
notes on a pre-existing release).
7. Smoke-tests the published crate (`cargo install raysense
--version <X>` plus a downstream `cargo check`).
Bug fixes vs the prior workflow:
- `version_of` previously read from `crates/raysense/Cargo.toml`,
which never existed in the single-crate layout. Now reads from
the root Cargo.toml.
- Trigger was `release: published`, which required hand-creating
the GitHub Release before any automation could run. Now the
tag IS the trigger, and the release is created automatically
with auto-generated notes.
Manual dry-run path kept via `workflow_dispatch` with
`dry_run: true` (default) -- runs `cargo package` + `cargo publish
--dry-run` and skips release creation and smoke test.
Permissions: workflow now declares `contents: write` so the
GITHUB_TOKEN can call `gh release create` / `gh release edit`.
Prerequisite for the next real release: `CARGO_REGISTRY_TOKEN`
secret must be set on the repo (it was already referenced by the
prior workflow).
Co-authored-by: Anton <anton.kundenko@gmail.com>
singaraiona
added a commit
that referenced
this pull request
May 1, 2026
The CI vendor step clones rayforce into vendor/rayforce/ at run time, but vendor/ is gitignored (the source of truth lives in upstream rayforce + .rayforce-version, not the committed tree). cargo package would otherwise refuse to ship what it sees as 'uncommitted changes' from those untracked files. Caught by the dry-run dispatch on PR #12's merge commit; the workflow exited with status 101 listing every vendor/rayforce/ file as untracked. Co-authored-by: Anton <anton.kundenko@gmail.com>
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 changes
Rewrite
.github/workflows/publish.ymlso that pushing avX.Y.Ztag triggers a full release pipeline:Cargo.toml's version field (fail loudly on drift).cargo test.cargo installplus downstreamcargo check).Bug fixes vs the prior workflow
version_ofpreviously readcrates/raysense/Cargo.toml, which never existed in the single-crate layout. Now reads the rootCargo.toml.release: published, requiring you to hand-create the GitHub Release before automation kicked in. Now the tag IS the trigger, and the release is created automatically with auto-generated notes.Manual dry-run
Actions -> publish -> Run workflowwithdry_run: true(default) runscargo package+cargo publish --dry-runand skips release creation and smoke test. Validates the pipeline without actually publishing.Prereq for the first real release
CARGO_REGISTRY_TOKENsecret must be set on the repo (Settings -> Secrets and variables -> Actions). The prior workflow already referenced it; if it's set, you're done.After this PR merges
Cut the first release with:
The workflow handles the rest. Inspect the resulting release and verify notes look right; if not, the workflow can be re-run with
Actions -> publish -> Run workflow -> dry_run: trueto iterate on the formatting.Test plan
Actions -> publish -> Run workflow -> dry_run: trueonce to confirmcargo packageandcargo publish --dry-runsucceed end-to-end on the runner.v0.2.0and verify: release is created with grouped commit notes, crates.io shows raysense 0.2.0, post-release smoke step succeeds.