Skip to content

fix(ci): plumb semantic-release notes into GitHub Release body - #5317

Merged
avallete merged 5 commits into
developfrom
claude/wire-release-notes-publish
May 20, 2026
Merged

fix(ci): plumb semantic-release notes into GitHub Release body#5317
avallete merged 5 commits into
developfrom
claude/wire-release-notes-publish

Conversation

@avallete

Copy link
Copy Markdown
Member

Stage A (#prior PR) added @semantic-release/release-notes-generator to the plugin chain and a manual backfill workflow to validate the format. This change wires the same notes into the production release pipeline so future releases on develop/main come with a populated GH Release body instead of an empty page.

  • release.yml: capture new_release_notes from the plan job's cycjimmy/semantic-release-action step into a release_notes job output using a heredoc with a random delimiter. SR_NOTES is passed via env and emitted with printf (not echo) so attacker-influenced commit bodies / PR titles can't be interpolated as shell. The workflow_dispatch re-cut path skips semantic-release entirely, so release_notes is the empty string in that case - the operator can follow up with the backfill-release-notes workflow to populate the body afterwards.

  • release-shared.yml: new optional release_notes workflow_call input, wired as the body of the softprops/action-gh-release step that creates the draft release. No generate_release_notes: true - the action appends GitHub's auto notes to any supplied body, which would duplicate content.

What kind of change does this PR introduce?

Bug fix, feature, docs update, ...

What is the current behavior?

Please link any relevant issues here.

What is the new behavior?

Feel free to include screenshots if it includes visual changes.

Additional context

Add any other context or screenshots.

claude added 2 commits May 20, 2026 11:12
The plan job in release.yml runs cycjimmy/semantic-release-action in
dry-run mode purely to compute the next version, never reading
new_release_notes, and softprops/action-gh-release in release-shared.yml
gets no body. The result: GH Releases since the monorepo move publish
with empty bodies (e.g. v2.100.1).
A subsequent change will plumb release notes through the production
publish path. This commit lands the prerequisites only:
- apps/cli/package.json: add @semantic-release/release-notes-generator
to release.plugins. It's a default semantic-release plugin bundled in
cycjimmy/semantic-release-action's image, so no devDep is needed.
Without this, new_release_notes would be empty even after wiring.
- .github/workflows/backfill-release-notes.yml: workflow_dispatch with
tag and apply inputs. Re-stages the repo on develop/main at the tag's
commit (without the tag, so semantic-release computes it as the next
release), asserts the computed version matches the tag, dumps the
notes to the job summary, and only updates the GH Release body when
apply=true. Lets us validate the changelog format end-to-end against
an existing tag before touching the production publish path, and
doubles as a fix-forward tool for releases that ship with an empty
body (e.g. v2.100.1, the recent betas, or any future workflow_dispatch
re-cut).
Stage A (#prior PR) added @semantic-release/release-notes-generator to
the plugin chain and a manual backfill workflow to validate the format.
This change wires the same notes into the production release pipeline
so future releases on develop/main come with a populated GH Release
body instead of an empty page.
- release.yml: capture new_release_notes from the plan job's
cycjimmy/semantic-release-action step into a release_notes job output
using a heredoc with a random delimiter. SR_NOTES is passed via env
and emitted with printf (not echo) so attacker-influenced commit
bodies / PR titles can't be interpolated as shell. The
workflow_dispatch re-cut path skips semantic-release entirely, so
release_notes is the empty string in that case - the operator can
follow up with the backfill-release-notes workflow to populate the
body afterwards.
- release-shared.yml: new optional release_notes workflow_call input,
wired as the body of the softprops/action-gh-release step that
creates the draft release. No generate_release_notes: true - the
action appends GitHub's auto notes to any supplied body, which would
duplicate content.
Base automatically changed from claude/fix-ci-changelog-A0jgB to developMay 20, 2026 11:18
avalleteand others added 3 commits May 20, 2026 13:19
Added new inputs to the backfill-release-notes workflow for better control:
- `tag`: Required release tag for refreshing notes.
- `apply`: Optional flag to update the GitHub release body.
- `non_blocking`: Optional flag to allow workflow continuation on backfill failure.
Updated the workflow to use `continue-on-error` based on the `non_blocking` input, improving error handling during the backfill process.
@avallete
avallete marked this pull request as ready for review May 20, 2026 16:50
@avallete
avallete requested a review from a team as a code ownerMay 20, 2026 16:50
@avalleteavallete changed the title ci(release): plumb semantic-release notes into GitHub Release bodychore(ci): plumb semantic-release notes into GitHub Release bodyMay 20, 2026
@avallete
avallete enabled auto-merge (squash) May 20, 2026 16:51
@avalleteavallete changed the title chore(ci): plumb semantic-release notes into GitHub Release bodyfix(ci): plumb semantic-release notes into GitHub Release bodyMay 20, 2026
@avallete
avallete merged commit 72f03fa into developMay 20, 2026
14 of 15 checks passed
@avallete
avallete deleted the claude/wire-release-notes-publish branch May 20, 2026 16:56
Sign up for freeto 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.

3 participants

@avallete@Coly010@claude