Repository navigation
ci: release the skeleton with release-please - #66
Conversation
Dependabot copies build(deps) from history. release-please treats every type with a visible changelog section as releasable, so pin chore to keep dependency bumps from cutting a release on their own.
Pull request titles, already checked by pr-title.yml, become the Conventional Commit subjects on main. release-please reads them, keeps a release pull request open that bumps package.json, package-lock.json and the plugin header Version, and writes CHANGELOG.md; merging it tags vX.Y.Z and publishes the release. - release.yml, with changelog sections mapped to Keep a Changelog - "## Unreleased" stays for projects' npm run release:changelog; release-please inserts below it - init cleanup is switched on, removing only the release workflow and config, so a new plugin does not inherit the skeleton's history - PROJECT_NAME_FEATURES_VERSION is left out of the bump on purpose: init does not rewrite it, so it must stay at the project start version - contributing, initialization and maintainer docs follow the new flow
Init used to remove the release workflow and config, so a new plugin fell back to release:bump and release:changelog. A new "release" feature (on by default, under Developer Tooling) now sets the project up for release-please: - it copies bin/features/release/release.yml to .github/workflows/release.yml and release-please-config.json to the root, pointing extra-files at the renamed main file (the engine never rewrites files under bin/, so the template still names the skeleton's); - it seeds .release-please-manifest.json at 0.0.0 (nothing released yet), sets initial-version to the version init wrote, so the first release is exactly that version, and sets bootstrap-sha to the HEAD init ran on, so skeleton commits stay out of the first changelog; - during first setup it removes the skeleton's CHANGELOG.md, which release-please writes afresh on the first release. Turning the feature off removes the workflow and config and keeps the manifest; turning it on again carries on from the recorded version. The skeleton's own release machinery moves to skeleton-only paths (.github/workflows/release-starter.yml, .github/release-please/), which cleanup removes, so it never ships into a project, including one that opts out. The project workflow documents the GITHUB_TOKEN limits: tags it creates don't start `on: push: tags` workflows, so deploys belong in the release workflow, gated on its release-created output.
wp-shared-workflows is not adding cd-release-please.yml after all: the release workflow stays a plain release-please-action job in each project.
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Copilot review overview
2 open issues
What changed in this PR
Adds automated releases for the skeleton and for newly-initialized plugins using release-please, with init support to scaffold and seed release history.
Changes:
- Add release-please workflows/configs for the skeleton and for generated plugins (via new
releaseinit feature). - Update init scaffolding to seed release-please manifest/config and enable cleanup of skeleton-only release automation.
- Update docs and contributor guidance to align with Conventional PR titles and release-please-managed changelogs.
| File | Description |
|---|---|
| project-name-features.php | Adds release-please version markers around the plugin header Version: line. |
| docs/internal/maintenance.md | Documents how skeleton releases are cut via release-please and related repo settings. |
| docs/initialization.md | Documents the new release feature, first-release setup requirements, and cleanup behavior. |
| bin/scaffold.config.js | Introduces release feature; seeds manifest/config and enables cleanup targets. |
| bin/features/release/release.yml | Adds the plugin release workflow template using release-please. |
| bin/features/release/release-please-config.json | Adds the plugin release-please config template (extra-files/changelog sections). |
| CONTRIBUTING.md | Updates contributor workflow to rely on PR titles and release-please for changelog entries. |
| CHANGELOG.md | Adds guidance comment indicating release-please owns changelog entries for the skeleton. |
| .github/workflows/release-starter.yml | Adds skeleton-only release-please workflow targeting skeleton-only config/manifest. |
| .github/release-please/manifest.json | Adds skeleton-only release-please manifest starting at 1.0.0. |
| .github/release-please/config.json | Adds skeleton-only release-please config, including extra-files for plugin header. |
| .github/dependabot.yml | Forces Dependabot commit prefix to chore to avoid release-please-triggered releases. |
Review effort: Lite
New plugins no longer get release-please from init: the release feature, its bin/features/release/ templates and the seeding of a fresh release history are gone, so there is one release workflow to maintain and Dependabot keeps its pins current. Init cleanup still removes the skeleton's own release workflow, config and manifest, which live at skeleton-only paths, so projects keep releasing by hand as before. Also from review: the PR title check no longer uses wip mode, which posts a commit status a fork's read-only token can't write; the workflows use github.token; and the security changelog section is gone, since the title check doesn't accept a security type.
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Copilot review overview
5 open issues
amannn/action-semantic-pull-request typically requiresstatuses: writepermission to… · New The PR description says Dependabot is pinned tochore(deps), but the config usesprefix: chore… · New The PR description states commit typesecuritymaps to a visible \"Security\" changelog section,… · New This change also removes the priorwith: wip: trueconfiguration. If the repo still relies on… · New “Cleanup removes all three” is slightly ambiguous since cleanup targets are two paths…
1 resolved since last review
Review effort: Lite
Init cleanup also runs on re-init and --clean and deletes its targets recursively, so the generic .github/release-please/ would take a project's own release-please config and manifest with it if the project used that layout. Name the folder for the skeleton, like release-starter.yml, so cleanup only ever removes the skeleton's files.
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Copilot review overview
3 open issues
Withamannn/action-semantic-pull-request, removingstatuses: writecommonly causes the action… · New Using a generic concurrency group name likereleasecan unintentionally serialize this workflow… · New The PR description says Dependabot is pinned to thechore(deps)prefix, but this configuration… · New
5 resolved since last review
amannn/action-semantic-pull-request typically requiresstatuses: writepermission to… This change also removes the priorwith: wip: trueconfiguration. If the repo still relies on… The PR description states commit typesecuritymaps to a visible \"Security\" changelog section,… The PR description says Dependabot is pinned tochore(deps), but the config usesprefix: chore… “Cleanup removes all three” is slightly ambiguous since cleanup targets are two paths…
Review effort: Lite
Adi-ty
left a comment
There was a problem hiding this comment.
Approving just two things worth considering:
- The 20 open Dependabot PRs (#42–#64) are still
build(deps), so each would cut a patch release, even if merged before this one (release-please counts everything since v1.0.0). Retitle them tochore(deps…)before merging, or@dependabot recreateonce this is onmain. - With "Validate PR title" no longer required, a bad title can be merged and release-please skips it. A GitHub App token for the release workflow would let us require the check again.
New projects come from composer create-project, which installs the latest tag, so a dependency fix on main reaches nobody until it is released. Prefix Dependabot commits with build, which the changelog lists under Changed and release-please counts as releasable. Each merge only updates the open release pull request; a release still happens only when a maintainer merges that.
|
@Adi-ty thanks. On the Dependabot point I went the other way after checking how the starters are used: both are on Packagist and the READMEs say On the title check: agreed, an org GitHub App token is the way to make it required again. Until then, a PR merged with a bad title can be fixed by adding a |
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Copilot review overview
3 open issues
3 resolved since last review
Review effort: Lite



What this PR does
Releases the skeleton itself with release-please, the flow proposed in rtCamp/wp-shared-workflows#45: pull requests are squash-merged with Conventional Commit titles, release-please keeps one release pull request open that bumps the version and writes
CHANGELOG.md, and merging it tagsvX.Y.Zand publishes the GitHub release.Projects made from the skeleton are unchanged: init cleanup removes these release files, and projects keep releasing by hand with
npm run release:bump,npm run release:changelogandnpm run release:zip.Closes
N/A
Changes
.github/workflows/release-starter.ymlrunsgoogleapis/release-please-actionv5.0.0 (pinned by SHA) on every push tomain, with write permissions on that job only..github/release-starter/config.jsonusesrelease-type: node(package.json,package-lock.jsonand the plugin headerVersion:line, the last throughextra-filesandx-release-please-start-version/x-release-please-endmarker lines, since WordPress reads the rest of theVersion:line as the value). Commit types map to Keep a Changelog headings:featAdded,fixFixed,perf/revert/buildChanged;docs,chore,ci,test,refactorandstyleare hidden and cut no release.manifest.jsonstarts at1.0.0, the latest release..github/workflows/release-starter.ymland.github/release-starter/. Both are named for the skeleton: cleanup also runs on re-init and--clean, so a generic path such as.github/release-please/could delete a project's own release-please files.main).PROJECT_NAME_FEATURES_VERSIONis not bumped by releases: init rewrites the header andpackage.jsonfor a new project but not the constant, so a moving constant would disagree with every new project's header. The maintainer docs say why.pr-title.ymldropswipmode: it posts a commit status, which a fork pull request's read-only token can't write.dependabot.ymlsets thebuildprefix (build(deps)/build(deps-dev)withinclude: scope). New projects come fromcomposer create-project, which installs the latest tag, so dependency fixes have to be released to reach anyone:buildis listed under Changed and counts as releasable. Each merge only updates the open release pull request; a release happens when a maintainer merges that.CHANGELOG.mdkeeps## Unreleased(projects inherit this file andrelease:changelogneeds that heading); release-please inserts each release below it, and a comment says not to add entries there in the skeleton.CONTRIBUTING.mdasks for a Conventional PR title;docs/internal/maintenance.mdgains a "Releasing" section;docs/initialization.mdlists the new cleanup targets.How I verified
actionlintandyamllintpass on the workflows; the JSON files parse;bin/scaffold.config.jsloads.Version:line, and the changelog updater puts a sample release between## Unreleasedand## 1.0.0.mainhas no commits since v1.0.0. The first releasable merge (any of the openbuild(deps)Dependabot PRs, or afix:such as fix(ci): separate file and project lint commands #65) opens the 1.0.1 release PR.Acceptance criteria
Runtime behavior
Release (skeleton)run passesCode quality
Housekeeping
CHANGELOG.mdentry: release-please writes itReviewer notes
Repository settings to change when this merges:
PR_TITLE).GITHUB_TOKEN, which starts no workflow runs. A GitHub App token would fix that later.Release automation for projects made from the skeleton is left for later: it needs a one-time setup hook in wp-tooling's init engine to give each project a fresh release history.