From 02e224ad3951d9650b54c3db60aeb070afe87328 Mon Sep 17 00:00:00 2001 From: Samuel K Date: Mon, 18 May 2026 21:20:21 -0500 Subject: [PATCH] feat(ci): migrate from release-please to semantic-release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .github/prerelease-config.json | 16 ----- .github/release-config.json | 17 ----- .../workflows/release-please-prerelease.yml | 64 ------------------- .github/workflows/release-please-stable.yml | 57 ----------------- .github/workflows/semantic-release.yml | 44 +++++++++++++ .release-please-manifest-stable.json | 3 - .release-please-manifest.json | 3 - .releaserc.json | 22 +++++++ package.json | 5 +- 9 files changed, 70 insertions(+), 161 deletions(-) delete mode 100644 .github/prerelease-config.json delete mode 100644 .github/release-config.json delete mode 100644 .github/workflows/release-please-prerelease.yml delete mode 100644 .github/workflows/release-please-stable.yml create mode 100644 .github/workflows/semantic-release.yml delete mode 100644 .release-please-manifest-stable.json delete mode 100644 .release-please-manifest.json create mode 100644 .releaserc.json diff --git a/.github/prerelease-config.json b/.github/prerelease-config.json deleted file mode 100644 index f6e6473f9..000000000 --- a/.github/prerelease-config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "packages": { - ".": { - "release-type": "go", - "prerelease-type": "rc", - "prerelease": true, - "versioning": "prerelease", - "bump-minor-pre-major": true, - "component": "devsy", - "changelog-path": "CHANGELOG.md", - "include-component-in-tag": false, - "include-v-in-tag": true - } - } -} diff --git a/.github/release-config.json b/.github/release-config.json deleted file mode 100644 index e4f14898c..000000000 --- a/.github/release-config.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "label": "autorelease: stable", - "release-label": "autorelease: stable-tagged", - "packages": { - ".": { - "release-type": "go", - "prerelease": false, - "versioning": "default", - "bump-minor-pre-major": true, - "component": "devsy", - "changelog-path": "CHANGELOG-stable.md", - "include-component-in-tag": false, - "include-v-in-tag": true - } - } -} diff --git a/.github/workflows/release-please-prerelease.yml b/.github/workflows/release-please-prerelease.yml deleted file mode 100644 index 46d4a8e15..000000000 --- a/.github/workflows/release-please-prerelease.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Release Please (Prerelease) - -on: - push: - branches: [main] - -permissions: - contents: write - pull-requests: write - -jobs: - release-please: - name: Release Please - runs-on: ubuntu-latest - outputs: - release_created: ${{ steps.release.outputs.release_created }} - tag_name: ${{ steps.release.outputs.tag_name }} - steps: - - uses: actions/create-github-app-token@v3 - id: app-token - with: - app-id: ${{ secrets.DEVSY_GITHUB_APP_ID }} - private-key: ${{ secrets.DEVSY_GITHUB_APP_PRIVATE_KEY }} - - - uses: googleapis/release-please-action@v4 - id: release - with: - token: ${{ steps.app-token.outputs.token }} - config-file: .github/prerelease-config.json - manifest-file: .release-please-manifest.json - autoMergeRequest: true - - auto-merge-rc: - name: Auto-merge RC Release PR - runs-on: ubuntu-latest - needs: release-please - if: ${{ !needs.release-please.outputs.release_created }} - steps: - - uses: actions/create-github-app-token@v3 - id: app-token - with: - app-id: ${{ secrets.DEVSY_GITHUB_APP_ID }} - private-key: ${{ secrets.DEVSY_GITHUB_APP_PRIVATE_KEY }} - - - name: auto-merge RC release PR - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} - GH_REPO: ${{ github.repository }} - run: | - PR=$(gh pr list --label "autorelease: pending" --json number,title --jq '.[0]') - if [ -z "$PR" ] || [ "$PR" = "null" ]; then - echo "No pending release PR found" - exit 0 - fi - - PR_NUMBER=$(echo "$PR" | jq -r '.number') - PR_TITLE=$(echo "$PR" | jq -r '.title') - - if echo "$PR_TITLE" | grep -qiE '\-rc[0-9]*'; then - echo "Enabling auto-merge for RC release PR #$PR_NUMBER: $PR_TITLE" - gh pr merge "$PR_NUMBER" --auto --squash - else - echo "Skipping auto-merge for non-RC release PR #$PR_NUMBER: $PR_TITLE" - fi diff --git a/.github/workflows/release-please-stable.yml b/.github/workflows/release-please-stable.yml deleted file mode 100644 index 817b60a0b..000000000 --- a/.github/workflows/release-please-stable.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Release Please (Stable) - -on: - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - release-please: - name: Release Please (Stable) - runs-on: ubuntu-latest - outputs: - release_created: ${{ steps.release.outputs.release_created }} - tag_name: ${{ steps.release.outputs.tag_name }} - steps: - - uses: actions/create-github-app-token@v3 - id: app-token - with: - app-id: ${{ secrets.DEVSY_GITHUB_APP_ID }} - private-key: ${{ secrets.DEVSY_GITHUB_APP_PRIVATE_KEY }} - - - uses: googleapis/release-please-action@v4 - id: release - with: - token: ${{ steps.app-token.outputs.token }} - config-file: .github/release-config.json - manifest-file: .release-please-manifest-stable.json - - - uses: actions/checkout@v4 - if: ${{ steps.release.outputs.release_created == 'true' }} - with: - token: ${{ steps.app-token.outputs.token }} - - - name: Advance prerelease manifest to next minor - if: ${{ steps.release.outputs.release_created == 'true' }} - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} - run: | - STABLE_TAG="${{ steps.release.outputs.tag_name }}" - STABLE_VERSION="${STABLE_TAG#v}" - MAJOR=$(echo "$STABLE_VERSION" | cut -d. -f1) - MINOR=$(echo "$STABLE_VERSION" | cut -d. -f2) - NEXT_MINOR=$((MINOR + 1)) - NEXT_RC_VERSION="${MAJOR}.${NEXT_MINOR}.0-rc.0" - - printf '{\n ".": "%s"\n}\n' "${NEXT_RC_VERSION}" > .release-please-manifest.json - - git remote set-url origin "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add .release-please-manifest.json - git commit -m "chore: advance prerelease manifest to ${NEXT_RC_VERSION} after ${STABLE_TAG} release" - git fetch origin main - git rebase origin/main - git push origin HEAD:main diff --git a/.github/workflows/semantic-release.yml b/.github/workflows/semantic-release.yml new file mode 100644 index 000000000..b0bedee1a --- /dev/null +++ b/.github/workflows/semantic-release.yml @@ -0,0 +1,44 @@ +name: Semantic Release + +on: + push: + branches: [main, release] + workflow_dispatch: + inputs: + dry-run: + description: Run in dry-run mode (no release created) + type: boolean + default: false + +permissions: + contents: write + issues: write + pull-requests: write + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@v3 + id: app-token + with: + app-id: ${{ secrets.DEVSY_GITHUB_APP_ID }} + private-key: ${{ secrets.DEVSY_GITHUB_APP_PRIVATE_KEY }} + + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + token: ${{ steps.app-token.outputs.token }} + + - uses: actions/setup-node@v6 + with: + node-version: 22 + cache: npm + + - run: npm install + + - name: Run semantic-release + run: npx semantic-release ${{ inputs.dry-run && '--dry-run' || '' }} + env: + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.release-please-manifest-stable.json b/.release-please-manifest-stable.json deleted file mode 100644 index 96f1cd949..000000000 --- a/.release-please-manifest-stable.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "1.3.0" -} diff --git a/.release-please-manifest.json b/.release-please-manifest.json deleted file mode 100644 index 500ff7b0f..000000000 --- a/.release-please-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "1.4.0-rc.1" -} diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 000000000..42f4428c5 --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,22 @@ +{ + "branches": [ + { "name": "main", "prerelease": "rc" }, + { "name": "release", "prerelease": false } + ], + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + ["@semantic-release/changelog", { "changelogFile": "CHANGELOG.md" }], + [ + "@semantic-release/github", + { "successComment": false, "failTitle": false } + ], + [ + "@semantic-release/git", + { + "assets": ["CHANGELOG.md"], + "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ] + ] +} diff --git a/package.json b/package.json index c0a173ca7..7a9b54d41 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,9 @@ "name": "devsy", "private": true, "devDependencies": { - "@biomejs/biome": "2.4.12" + "@biomejs/biome": "2.4.12", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "semantic-release": "^24.2.3" } }