Skip to content

ci(release): adopt per-package release-please - #99

Draft
Adi-ty wants to merge 1 commit into
feat/release-php-per-package-tagsfrom
ci/release-please
Draft

Adi-ty wants to merge 1 commit into
feat/release-php-per-package-tagsfrom
ci/release-please

Conversation

@Adi-ty

@Adi-ty Adi-ty commented Nov 7, 2026 •

Copy link
Copy Markdown
Collaborator

What this PR does

Releases all six packages with release-please, as wp-shared-workflows, plugin-elementary and theme-elementary already do.

Closes

N/A

Changes

  • release-please-config.json and .release-please-manifest.json:
    • six packages, with separate-pull-requests on;
    • tags look like @rtcamp/<package>@<version> for npm and rtcamp/<package>@<version> for Composer, the form release-php.yml acts on;
    • commit types map to sections: feat is Added, fix is Fixed, and perf, revert and build are Changed. Other types release nothing.
  • npm packages:
  • Composer packages: composer.json has no version, so only CHANGELOG.md changes.
  • release.yml runs googleapis/release-please-action v5.0.0 (pinned by SHA) with GITHUB_TOKEN.
    • Tags created with GITHUB_TOKEN start no workflows, so its release-php job calls release-php.yml for each Composer release.
    • npm needs no call: the merged release PR changes package.json, which already starts publish-npm-packages.yml. Publishing has to stay in that file, because the trusted publisher is tied to its name.
  • release-php.yml gains a workflow_call entry point that takes the tag and the two deploy keys, and checks out the tagged commit. A tag pushed by hand still releases through the tag trigger.
  • pr-title.yml is the same title check that plugin-elementary and theme-elementary run.
  • Changelogs and docs:
    • Each package's CHANGELOG.md loses ## [Unreleased], because release-please inserts each release above the first version heading and would strand anything left under it. In its place, a line names the last hand-written release ("Entries for releases after 2.0.0 are written by release-please …").
    • AGENTS.md (root and wp-tooling), CONTRIBUTING.md, the PR template and the task template describe the new flow. The task template now targets main with a Conventional PR title, since a [<milestone>] title fails the check.
  • Not touched: .github/release.yml and .github/labels.yml (both chore: add issue forms, SECURITY.md, CODEOWNERS, labels and release notes config #92), and monorepo-builder.php.

How I verified

  • actionlint passes on every workflow, both JSON files parse, and npm run check passes.
  • I ran release-please 17.6.0's own code (the version the pinned action bundles) read-only against this repo's main, with this branch's config:
  • I applied the updates of a simulated @rtcamp/eslint-config 3.0.0 release to feat(eslint-config)!: match the @wordpress/scripts default config #94's branch, using release-please's own updaters.
    • Exactly eight lines change: the version and the three ranges, each in package.json and in the lockfile, with ^ kept.
    • npm ci passes, and npm install --package-lock-only changes nothing.
  • I smoke-tested the full flow end to end in a test monorepo with the same layout: two Composer packages with mirror repos, and npm workspaces where one devDepends on another. I merged Conventional PRs, then merged the release PRs they opened.
    • Composer: the release PR merge tagged the package, and release.yml called release-php.yml. The mirror got exactly the expected git subtree split commit and tag, and the other package was untouched.
    • npm: a breaking eslint-config release also rewrote the dependent workspace's range in its package.json and in the lockfile. The dependent got no release of its own, and npm ci passes on the result.

Reviewer notes

@Adi-ty
Adi-ty added this pull request to stack #98 November 7, 2026 00:53
- Generate independent release PRs and changelogs from Conventional Commit squash titles for all six npm and Composer packages.
- Keep npm publishing in its trusted-publisher workflow. Call the Composer split workflow directly because tags created with GITHUB_TOKEN do not trigger push workflows.
- Validate PR titles and document approval of release PR workflow runs. Replace manual changelog instructions with the automated flow.
- Seed the manifest from the manual releases completed before cut-over, with bootstrap-sha excluding changes already released.
@Adi-ty
Adi-ty force-pushed the ci/release-please branch from 6f45f30 to 8b6d87d Compare November 7, 2026 00:54
Sign up for free to 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.

1 participant