Tag and release the site when a deploy publishes a new version - #172
Merged
Conversation
The site has published to Pages on every push to main and daily since the
Astro rebuild, but nothing recorded what went out when: no releases, no
version tags, and package.json stuck at 2.0.0.
deploy.yml gains a `release` job that runs once the Pages deploy succeeds
and creates tag v<package.json version> plus a GitHub Release with
generated notes — but only when that version has no release yet, so
package.json is the trigger and every other push is a no-op. It is gated
to pushes: the daily cron rebuild republishes identical content, so
releasing on it would add a release a day for no change.
Supporting changes:
- .github/release.yml groups the generated notes by label, so meetup
listings don't read the same as a feature change.
- process-suggestion.yml now labels the PR it opens, not just the
issue — the Listings category would otherwise match nothing.
- ci.yml prints a non-blocking notice when a PR changes files outside
src/content/meetups/** without bumping the version. Advisory by
design: content PRs are the common case and shouldn't show a
contributor a red check.
Bumped to 2.1.0 so the first automated release has a version of its own.
Its notes will span the whole history, there being no earlier tag to
bound them; later releases are scoped to the previous one.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D46yvMekBML3gD9k4xSeZ3
Contributor
There was a problem hiding this comment.
Pull request overview
This PR adds an automated release/tagging step to the GitHub Pages deploy workflow so that production deployments can be referenced by version (v<package.json version>) and get generated release notes.
Changes:
- Add a
releasejob to.github/workflows/deploy.ymlthat creates a GitHub Release (and tag) on pushes tomain, but skips scheduled/dispatch deploys. - Add
.github/release.ymlto group generated release notes by PR labels (Listings/Dependencies/Changes), and ensure suggestion PRs get theevent-suggestionlabel. - Add a CI
::notice::reminder when a PR changes non-listing files without bumpingpackage.jsonversion; bump version to2.1.0and document the flow inCLAUDE.md.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| package.json | Bumps site version to 2.1.0 as the release trigger. |
| CLAUDE.md | Documents the new deploy/release workflow and version-bump contract. |
| .github/workflows/process-suggestion.yml | Labels auto-opened suggestion PRs as event-suggestion to support release note grouping. |
| .github/workflows/deploy.yml | Adds a post-deploy release job to create a release/tag based on package.json version (push-only). |
| .github/workflows/ci.yml | Fetches full git history and adds a non-blocking version-bump reminder notice for code-changing PRs. |
| .github/release.yml | Configures release note categories for --generate-notes based on labels. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Co-authored-by: sdh100shaun <79883+sdh100shaun@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Suppressed comments (1)
CLAUDE.md:141
- In this new deployment/release documentation,
process-suggestion.ymlandci.ymlare referenced without their.github/workflows/path, while surrounding bullets use full workflow paths. Using the full paths here too avoids ambiguity and keeps the section consistent.
`process-suggestion.yml` labels the PR it opens and not just the issue.
`ci.yml`'s `build` job prints a non-blocking `::notice::` when a PR changes
adam-blakey
reviewed
Aug 30, 2026
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
thebiggh
approved these changes
Aug 31, 2026
adam-blakey
approved these changes
Sep 2, 2026
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.
Why
The site has published to Pages on every push to
mainand daily since the Astro rebuild, but nothing recorded what went out when —gh release listis empty, the only tag isbackup/pre-split-chore-dependabot-batch, andpackage.jsonhas sat at2.0.0. There's no version to point at, no changelog, and nothing to roll back to by name.What this does
deploy.ymlgains a third job,release, that runs once the Pages deploy succeeds:package.jsonis the source of truth. It creates tagv<version>and a Release with generated notes, but only when that version has no release yet — so a release happens exactly when someone bumps the version in a PR, and every other push is a no-op.mainonly. The daily 06:00 cron rebuild andworkflow_dispatchdeploy exactly as before but skip the job, since they republish identical content. Releasing on the cron would mean ~365 releases a year for no change.It checks for the release rather than the tag, which keeps re-runs idempotent and self-heals a tag left behind without one.
gh release createcreates the tag at--targetitself, so there's no separategit tag && git pushto keep in sync.Supporting changes
.github/release.ymlevent-suggestion) → Dependencies (dependencies) → Changes (*, catch-all last), so meetup listings don't read the same as a feature change.process-suggestion.ymllabels: event-suggestionto thecreate-pull-requeststep. The label was only ever applied to the issue, so the Listings category would have matched nothing.ci.ymlfetch-depth: 0on thebuildcheckout, plus a non-blocking::notice::when a PR touches files outsidesrc/content/meetups/**without a version bump.package.json2.0.0→2.1.0.CLAUDE.mdVerified locally
deploy.ymlexposesbuild, deploy, releasewith the expectedneeds/if/permissions, and the suggestion step'slabelsreads back asevent-suggestion.::notice::when the version is simulated as unchanged. A touched meetup file is correctly filtered out of the "code changes" list.gh release view v2.1.0exits 1, so the first deploy after merge will create the release rather than skip.npm run buildpasses.Two things to know before merging
The first release will have long notes. There's no prior release for
--generate-notesto bound against, sov2.1.0picks up the whole history. One-off; later releases are scoped to the previous tag.The version bump is manual, and the CI notice is the only nudge. That's deliberate — content PRs are the common case, shouldn't bump anything, and shouldn't show a contributor a red check. If it proves too easy to ignore, the follow-up is making it a required check, not auto-bumping.
🤖 Generated with Claude Code
https://claude.ai/code/session_01D46yvMekBML3gD9k4xSeZ3