Skip to content

feat(ci): migrate from release-please to semantic-release#374

Merged
skevetter merged 1 commit into
mainfrom
migrate-to-semantic-release
May 19, 2026
Merged

feat(ci): migrate from release-please to semantic-release#374
skevetter merged 1 commit into
mainfrom
migrate-to-semantic-release

Conversation

@skevetter
Copy link
Copy Markdown
Contributor

@skevetter skevetter commented May 19, 2026

Summary

  • Replaces the dual release-please prerelease/stable configuration with semantic-release for simplicity
  • RC releases happen automatically on every push to main (prerelease channel with -rc.N suffix)
  • Stable releases happen on push to a release branch (no prerelease suffix)
  • The existing release.yml workflow (Go binary builds) continues to work since semantic-release creates GitHub releases which trigger on: release: types: [published]
  • Adds semantic-release, @semantic-release/changelog, and @semantic-release/git as devDependencies

Files added

  • .releaserc.json — semantic-release config with commit-analyzer, release-notes-generator, changelog, github, and git plugins
  • .github/workflows/semantic-release.yml — runs on push to main/release, with optional dry-run via workflow_dispatch

Files removed

  • .github/workflows/release-please-prerelease.yml
  • .github/workflows/release-please-stable.yml
  • .github/prerelease-config.json
  • .github/release-config.json
  • .release-please-manifest.json
  • .release-please-manifest-stable.json

Summary by CodeRabbit

  • Chores
    • Updated release automation configuration and workflow system.
    • Removed legacy release configuration files.
    • Added release automation dependencies.

Review Change Stack

@netlify
Copy link
Copy Markdown

netlify Bot commented May 19, 2026

Deploy Preview for devsydev canceled.

Name Link
🔨 Latest commit 02e224a
🔍 Latest deploy log https://app.netlify.com/projects/devsydev/deploys/6a0bcb72022180000883d8c1

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 19, 2026

Caution

Review failed

Pull request was closed or merged during review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 92e659f5-d3f5-49c5-846d-8130456db13b

📥 Commits

Reviewing files that changed from the base of the PR and between 0675390 and 02e224a.

📒 Files selected for processing (9)
  • .github/prerelease-config.json
  • .github/release-config.json
  • .github/workflows/release-please-prerelease.yml
  • .github/workflows/release-please-stable.yml
  • .github/workflows/semantic-release.yml
  • .release-please-manifest-stable.json
  • .release-please-manifest.json
  • .releaserc.json
  • package.json
💤 Files with no reviewable changes (6)
  • .release-please-manifest.json
  • .github/workflows/release-please-stable.yml
  • .github/workflows/release-please-prerelease.yml
  • .github/prerelease-config.json
  • .release-please-manifest-stable.json
  • .github/release-config.json

📝 Walkthrough

Walkthrough

This PR migrates the repository's release automation from Release Please to Semantic Release. It removes Release Please configuration files, manifests, and workflows, then adds Semantic Release configuration, npm dependencies, and a new GitHub Actions workflow to automate versioning and changelog generation.

Changes

Release Automation Migration

Layer / File(s) Summary
Semantic Release configuration
.releaserc.json
Defines release behavior: main branch creates prerelease versions labeled rc; release branch creates stable releases. Configures plugins for commit analysis, release notes generation, CHANGELOG.md updates, GitHub release publishing, and automatic git commits with CI-skip annotations.
Release dependencies and tooling
package.json
Adds semantic-release, @semantic-release/changelog, and @semantic-release/git as dev dependencies to provide semantic versioning, changelog generation, and git integration for automated releases.
Release automation workflow
.github/workflows/semantic-release.yml
GitHub Actions workflow triggered on pushes to main and release branches and via manual dispatch. Sets up Node.js 22, generates GitHub App token, checks out repository with full history, installs dependencies, and runs npx semantic-release to automate version bumping, release creation, and changelog management.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • devsy-org/devsy#368: Directly conflicts—PR #368 adds the Release Please dual prerelease/stable setup that this PR removes in favor of Semantic Release.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(ci): migrate from release-please to semantic-release' clearly and concisely summarizes the main change: replacing the release-please CI/CD system with semantic-release.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Replace the dual release-please prerelease/stable configuration with a
single semantic-release setup for simplicity.

- Add .releaserc.json with commit-analyzer, release-notes-generator,
  changelog, github, and git plugins
- Add semantic-release.yml workflow (push to main → RC, push to
  release → stable, plus dry-run workflow_dispatch)
- Remove release-please workflows, configs, and manifests
- Add semantic-release devDependencies to package.json
@skevetter skevetter force-pushed the migrate-to-semantic-release branch from 93ced32 to 02e224a Compare May 19, 2026 02:31
@skevetter skevetter marked this pull request as ready for review May 19, 2026 02:31
@skevetter skevetter enabled auto-merge (squash) May 19, 2026 02:34
@skevetter skevetter merged commit 9fcceef into main May 19, 2026
15 of 16 checks passed
@skevetter skevetter deleted the migrate-to-semantic-release branch May 19, 2026 02:36
devsy-app Bot pushed a commit that referenced this pull request May 19, 2026
# [1.4.0-rc.1](v1.3.0...v1.4.0-rc.1) (2026-05-19)

### Bug Fixes

* **ci:** add package-lock.json for semantic-release workflow ([bcd9208](bcd9208))
* **ci:** add signed commit config and create-release-pr workflow ([c89325a](c89325a))
* **ci:** advance prerelease manifest past stable release ([#372](#372)) ([33a9d44](33a9d44))
* **ci:** pass app token via token input for softprops/action-gh-release ([#361](#361)) ([77a9373](77a9373)), closes [softprops/action-#release](https://github.com/softprops/action-/issues/release)
* **ci:** re-add changelog and git plugins with signed commit support ([#375](#375)) ([ad6e3f9](ad6e3f9))
* **ci:** remove @semantic-release/git plugin that can't push to protected branch ([c3bf35c](c3bf35c))
* **ci:** remove @semantic-release/git plugin that cannot push to signature-protected branch ([e971f37](e971f37))
* **ci:** resolve semantic-release tag conflict and add changelog+git plugins ([d80ae42](d80ae42))
* update workspace_result.json paths on workspace rename ([#369](#369)) ([f06f4ba](f06f4ba))

### Features

* auto-overwrite stale agent binary and workspace clean command ([#364](#364)) ([76841a4](76841a4))
* **ci:** enable autoMergeRequest in release-please action ([#363](#363)) ([2f889bb](2f889bb))
* **ci:** migrate from release-please to semantic-release ([#374](#374)) ([9fcceef](9fcceef))
* **ci:** replace single release-please config with dual prerelease/stable setup ([#368](#368)) ([d985356](d985356))
skevetter added a commit that referenced this pull request May 19, 2026
* fix(ci): pass app token via token input for softprops/action-gh-release (#361)

softprops/action-gh-release@v3 reads the token from INPUT_TOKEN (set by
the 'token' action input) before falling back to GITHUB_TOKEN. Setting
env.GITHUB_TOKEN did not override INPUT_TOKEN so the action used the
default GITHUB_TOKEN instead of the app-token, causing the 403.

* feat(ci): enable autoMergeRequest in release-please action (#363)

Adds autoMergeRequest: true to the googleapis/release-please-action step
so that release-please PRs auto-merge after CI passes.

* chore(main): release 1.3.0-rc.19 (#362)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* feat: auto-overwrite stale agent binary and workspace clean command (#364)

* feat: auto-overwrite agent binary on version mismatch in Docker delivery

When the named Docker volume already contains an agent binary with a
different version, force-overwrite it instead of leaving the stale
binary in place. Logs an INFO message with the old and new versions.
If versions match, skip re-delivery entirely as an optimization.

* feat: add `devsy workspace clean` subcommand

Adds a command to remove the agent binary from the Docker named volume
for a workspace, forcing a fresh injection on next start. Useful when
the binary becomes stale and the automatic version-mismatch detection
is not sufficient.

* fix: extract docker command string to constant (goconst lint)

* chore(ci): tidy workflow comments (#365)

* chore(main): release 1.3.0-rc.20 (#366)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* feat(ci): replace single release-please config with dual prerelease/stable setup (#368)

Split the release-please configuration into two independent tracks:
- Prerelease track (push to main): creates RC releases with auto-merge
- Stable track (workflow_dispatch): creates stable releases on demand

This eliminates the promote-release.yml workaround that re-tagged RC commits
as stable releases. Instead, release-please natively manages both version
tracks with separate configs, manifests, labels, and changelog paths.

* chore(main): release 1.3.0-rc.21 (#370)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* fix(ci): advance prerelease manifest past stable release (#372)

* fix: update workspace_result.json paths on workspace rename (#369)

* fix: update workspace_result.json paths on workspace rename

After renaming a workspace, the cached workspace_result.json still
referenced the old workspace name in ContainerWorkspaceFolder,
LocalWorkspaceFolder, and WorkspaceMount paths. This caused the
container's working directory to point to /workspaces/<old-name>
which doesn't exist, breaking exec and SSH into the workspace.

* fix: also update MergedConfig.WorkspaceMount on workspace rename

Closes a gap where MergedConfig.WorkspaceMount (a *string field) was
not being rewritten during rename, leaving a stale mount path in the
cached result.

* refactor: derive workspace parent dirs dynamically in path replacer

Instead of hardcoding `/workspaces` as the container workspace parent
directory, derive it from SubstitutionContext.ContainerWorkspaceFolder
by stripping the basename. Similarly derive the host parent from
LocalWorkspaceFolder. This makes the rename path replacer work
correctly for devcontainers that use a non-default workspaceFolder.

* test: add unit tests for workspace rename path replacement

* test: add e2e tests for workspace rename path updates

Integration tests verifying that updateWorkspaceResult correctly
rewrites ContainerWorkspaceFolder, LocalWorkspaceFolder, WorkspaceMount
in SubstitutionContext and MergedConfig after a workspace rename.

Covers: basic rename, non-default workspace dirs, nested paths,
same-name idempotent rename, nil MergedConfig/WorkspaceMount, missing
result file, and raw JSON roundtrip.

* fix(lint): wire up testContainerOldWS, testLocalOldWS, testContainerApp, testContainerOld constants

Linter introduced constants but left self-referential definitions and
bare literals in test bodies. Fix init cycles and use constants throughout.

* fix(lint): extract repeated /workspaces/ws-old literal to testContainerWSMount constant

* chore(main): release 1.4.0-rc.1 (#373)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* feat(ci): migrate from release-please to semantic-release (#374)

Replace the dual release-please prerelease/stable configuration with a
single semantic-release setup for simplicity.

- Add .releaserc.json with commit-analyzer, release-notes-generator,
  changelog, github, and git plugins
- Add semantic-release.yml workflow (push to main → RC, push to
  release → stable, plus dry-run workflow_dispatch)
- Remove release-please workflows, configs, and manifests
- Add semantic-release devDependencies to package.json

* fix(ci): add package-lock.json for semantic-release workflow

The semantic-release workflow uses actions/setup-node with npm caching,
which requires a lock file to be present. Also switches from npm install
to npm ci for reproducible CI builds.

---------

Co-authored-by: Samuel K <skevetter@pm.me>
Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>
skevetter added a commit that referenced this pull request May 19, 2026
* fix(ci): pass app token via token input for softprops/action-gh-release (#361)

softprops/action-gh-release@v3 reads the token from INPUT_TOKEN (set by
the 'token' action input) before falling back to GITHUB_TOKEN. Setting
env.GITHUB_TOKEN did not override INPUT_TOKEN so the action used the
default GITHUB_TOKEN instead of the app-token, causing the 403.

* feat(ci): enable autoMergeRequest in release-please action (#363)

Adds autoMergeRequest: true to the googleapis/release-please-action step
so that release-please PRs auto-merge after CI passes.

* chore(main): release 1.3.0-rc.19 (#362)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* feat: auto-overwrite stale agent binary and workspace clean command (#364)

* feat: auto-overwrite agent binary on version mismatch in Docker delivery

When the named Docker volume already contains an agent binary with a
different version, force-overwrite it instead of leaving the stale
binary in place. Logs an INFO message with the old and new versions.
If versions match, skip re-delivery entirely as an optimization.

* feat: add `devsy workspace clean` subcommand

Adds a command to remove the agent binary from the Docker named volume
for a workspace, forcing a fresh injection on next start. Useful when
the binary becomes stale and the automatic version-mismatch detection
is not sufficient.

* fix: extract docker command string to constant (goconst lint)

* chore(ci): tidy workflow comments (#365)

* chore(main): release 1.3.0-rc.20 (#366)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* feat(ci): replace single release-please config with dual prerelease/stable setup (#368)

Split the release-please configuration into two independent tracks:
- Prerelease track (push to main): creates RC releases with auto-merge
- Stable track (workflow_dispatch): creates stable releases on demand

This eliminates the promote-release.yml workaround that re-tagged RC commits
as stable releases. Instead, release-please natively manages both version
tracks with separate configs, manifests, labels, and changelog paths.

* chore(main): release 1.3.0-rc.21 (#370)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* fix(ci): advance prerelease manifest past stable release (#372)

* fix: update workspace_result.json paths on workspace rename (#369)

* fix: update workspace_result.json paths on workspace rename

After renaming a workspace, the cached workspace_result.json still
referenced the old workspace name in ContainerWorkspaceFolder,
LocalWorkspaceFolder, and WorkspaceMount paths. This caused the
container's working directory to point to /workspaces/<old-name>
which doesn't exist, breaking exec and SSH into the workspace.

* fix: also update MergedConfig.WorkspaceMount on workspace rename

Closes a gap where MergedConfig.WorkspaceMount (a *string field) was
not being rewritten during rename, leaving a stale mount path in the
cached result.

* refactor: derive workspace parent dirs dynamically in path replacer

Instead of hardcoding `/workspaces` as the container workspace parent
directory, derive it from SubstitutionContext.ContainerWorkspaceFolder
by stripping the basename. Similarly derive the host parent from
LocalWorkspaceFolder. This makes the rename path replacer work
correctly for devcontainers that use a non-default workspaceFolder.

* test: add unit tests for workspace rename path replacement

* test: add e2e tests for workspace rename path updates

Integration tests verifying that updateWorkspaceResult correctly
rewrites ContainerWorkspaceFolder, LocalWorkspaceFolder, WorkspaceMount
in SubstitutionContext and MergedConfig after a workspace rename.

Covers: basic rename, non-default workspace dirs, nested paths,
same-name idempotent rename, nil MergedConfig/WorkspaceMount, missing
result file, and raw JSON roundtrip.

* fix(lint): wire up testContainerOldWS, testLocalOldWS, testContainerApp, testContainerOld constants

Linter introduced constants but left self-referential definitions and
bare literals in test bodies. Fix init cycles and use constants throughout.

* fix(lint): extract repeated /workspaces/ws-old literal to testContainerWSMount constant

* chore(main): release 1.4.0-rc.1 (#373)

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>

* feat(ci): migrate from release-please to semantic-release (#374)

Replace the dual release-please prerelease/stable configuration with a
single semantic-release setup for simplicity.

- Add .releaserc.json with commit-analyzer, release-notes-generator,
  changelog, github, and git plugins
- Add semantic-release.yml workflow (push to main → RC, push to
  release → stable, plus dry-run workflow_dispatch)
- Remove release-please workflows, configs, and manifests
- Add semantic-release devDependencies to package.json

* fix(ci): add package-lock.json for semantic-release workflow

The semantic-release workflow uses actions/setup-node with npm caching,
which requires a lock file to be present. Also switches from npm install
to npm ci for reproducible CI builds.

---------

Co-authored-by: devsy-app[bot] <277138668+devsy-app[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant