Repository navigation
Conversation
Implements the release-automation design discussed in #4829. Model: contributor PRs squash-merge into `develop` with Conventional-Commit titles; a human opens+merges `develop -> main` (merge commit) to cut a release; the merge to `main` triggers full automation (svu computes the version, tags it, GoReleaser publishes). Added: - .github/workflows/pr_conventional_title.yml: enforce Conventional-Commit PR titles on PRs into `develop` (amannn/action-semantic-pull-request). - .github/workflows/release_gate.yml: run the full longtest integration suite as a required check on `develop -> main` PRs, with a `skip-longtest` label as an auditable emergency bypass. - .github/workflows/release_on_merge.yml: on push to `main`, svu computes the next semver (feat->minor, fix->patch, `!`->major; chore/ci/docs->no release), tags it, and runs GoReleaser. Gated behind the AUTO_RELEASE_ENABLED repo variable so it lands dormant. Changed: - .goreleaser.yml: publish directly (draft:false); replace the hand-maintained provider-name regexp in the changelog with a permanent `p/<name>` scope rule, so adding a provider needs no changelog edits. Groups tightened to Conventional-Commit types (verified end-to-end with `goreleaser`). - documentation/release/release-engineering.md: rewritten around the new flow; the manual dispatch/tag escape hatch and all Tips are preserved. The existing release_draft.yml (workflow_dispatch / tag push) is kept as the manual escape hatch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refine the release flow so cutting a release is a single command and the merge itself is automatic once tests pass. - bin/auto_release.sh: opens (or reuses) the develop->main PR and enables GitHub auto-merge with a MERGE COMMIT (never squash). When the release gate (full longtest) passes, GitHub merges automatically and the release publishes. Flags: -y (no prompt), -w (watch checks), --skip-longtest (emergency bypass). Warns if AUTO_RELEASE_ENABLED is not set. - docs: the "how to cut a release" step is now `bin/auto_release.sh`; note that auto-merge must use a merge commit and that "Allow auto-merge" must be enabled. Clarify that there is no "Release vX.Y.Z" commit -- the version lives only in the tag. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Clarify that main protection requires one approval, so cutting a release is two human actions (run bin/auto_release.sh, then a *different* maintainer approves the PR); the gate + approval let GitHub auto-merge, and the rest is automatic. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
@TomOnTime FYI: #4899 updates the contributor docs for the Conventional Commits titles ( One thing I noticed: this pull request adds |
|
FYI: I've decided that the develop -> main split adds complexity without much benefit. See #4829 (comment) As far as I'm not sure what release process I want at this time. |
Since #4873 the `PR: Commitlint` check requires Conventional Commits pull request titles, but the contributor documentation still describes the old uppercase prefixes. A contributor who follows `CONTRIBUTING.md`, the pull request template or the requested provider guide ends up with a title like `DOCS: Added requested provider ...`, which the check rejects. This updates those places: - `CONTRIBUTING.md` replaces the `FEATURE:`/`BUG:`/`PROVIDERNAME:` table with the types from `commitlint.config.js`, the `p/PROVIDERNAME` scope, the lowercase subject rule and a local `npx commitlint` example. - The pull request template uses Conventional Commits examples. - `documentation/developer-info/provider-request.md` uses a `docs: add requested provider ...` commit, so the auto-filled title passes the check. - `documentation/developer-info/github-actions.md` lists the `PR: Commitlint` workflow next to the other pull request checks. `documentation/release/release-engineering.md` still has the `CHORE:` commands and the all-caps provider rule for release notes. I left that file out on purpose, because #4848 rewrites it. Once that one lands, #4266 can be closed. I checked every example title in the changed files with `npx commitlint` (all pass), and confirmed that `fix(p/ROUTE53): Fix TTL` and `DOCS: Fixed table` fail, as the new text says. Refs #4266 ## AI-attributie Assisted-by: Claude Code:claude-opus-5 --------- Co-authored-by: Tom Limoncelli <tal@whatexit.org>
|
@TomOnTime agreed, one title check is enough. Before removing
Which one would you like to keep? If it's |
|
Closing this PR. Until I know what I want, it doesn't make sense to leave this open. |
Implements the release-automation design from #4829. Draft — needs review, the one-time repo settings below, and a live dry-run before it goes live.
Model
developwith Conventional-Commit titles (enforced).develop → mainas a merge commit to cut a release (this is the only manual step).maintriggers full automation:svucomputes the next semver → tag → GoReleaser publishes.What's here
pr_conventional_title.yml— enforces Conventional-Commit PR titles on PRs intodevelop(amannn/action-semantic-pull-request@v6). Types that release:feat→minor,fix→patch,!/BREAKING→major.chore/ci/docs/…→no release.release_gate.yml— runs the fulllongtestsuite as a required check ondevelop → mainPRs; askip-longtestlabel is an auditable emergency bypass (single always-runningrelease-gatecheck so branch protection never sticks on a skipped job).release_on_merge.yml— on push tomain:svu→ tag → GoReleaser. Skips entirely if nothing releasable landed. Gated behind theAUTO_RELEASE_ENABLEDrepo variable so this PR can merge dormant..goreleaser.yml—draft: false(auto-publish), and the hand-maintained provider-name regexp is replaced by a permanentp/<name>scope rule (fix(p/route53): …) → no per-provider list to maintain ever again.release-engineering.md— rewritten around the new flow; manual dispatch/tag escape hatch and all Tips preserved.Provider changelog: how the giant regexp went away
Provider changes use the
p/<name>scope. The changelog group is now a permanent one-liner. Because the type staysfeat/fix,svuand the title-linter need zero special knowledge. I verified GoReleaser's routing end-to-end (matching is by list order, display byorder):Validation done
svubump semantics probed on a scratch repo (chore/ci/docs → no bump; fix→patch; feat→minor;!→major).goreleaser checkpasses on the real.goreleaser.yml; all workflows passactionlint.The workflows only run in GHA. Before enabling: cut a throwaway
-rc(or run on a fork) to confirmrelease_on_mergetags + GoReleaser publishes correctly.One-time rollout (settings + order)
developfrommain; point contributions at it.develop→main) and squash (for feature PRs); create theskip-longtestlabel.release-gateonmain; requirePR: Conventional titleondevelop.AUTO_RELEASE_ENABLEDunset).AUTO_RELEASE_ENABLED=trueand do a controlled firstdevelop→mainrelease.Note: the existing
release_draft.yml(dispatch / tag push) stays as the manual escape hatch. There's some GoReleaser-step overlap between it andrelease_on_merge.yml; happy to DRY it into aworkflow_callreusable in a follow-up once this is proven.🤖 Generated with Claude Code
Update: one-command releases + auto-merge
bin/auto_release.shopens/reuses thedevelop → mainPR and enables GitHub auto-merge (as a merge commit, never squash). Once therelease-gatepasses, GitHub merges automatically and the release publishes — the only human action is running the script. Flags:-y,-w(watch),--skip-longtest(emergency).Release vX.Y.Zcommit is needed: the version is computed bysvuand lives only in the tag; the merge commit is filtered out of the changelog.mainprotection should requirerelease-gatebut not a review approval.