diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a747e06 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,39 @@ +name: Release + +on: + push: + branches: + - main + +permissions: + contents: write + issues: write + pull-requests: write + +jobs: + semantic-release: + name: Semantic release + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Generate release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: > + npx -y + -p semantic-release@25.0.3 + -p @semantic-release/changelog@6.0.3 + -p @semantic-release/commit-analyzer@13.0.1 + -p @semantic-release/git@10.0.1 + -p @semantic-release/github@12.0.8 + -p @semantic-release/release-notes-generator@14.1.1 + semantic-release diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 0000000..9e7a83a --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,22 @@ +{ + "branches": ["main"], + "tagFormat": "v${version}", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + [ + "@semantic-release/changelog", + { + "changelogFile": "CHANGELOG.md" + } + ], + [ + "@semantic-release/git", + { + "assets": ["CHANGELOG.md"], + "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ], + "@semantic-release/github" + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..feb4ce2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +# Changelog + +Release notes are generated by semantic-release from conventional commits. diff --git a/docs/release-management.md b/docs/release-management.md new file mode 100644 index 0000000..e8d1c7e --- /dev/null +++ b/docs/release-management.md @@ -0,0 +1,20 @@ +# Release management + +Metrix uses semantic-release to generate root versions, GitHub releases, and +`CHANGELOG.md` entries from conventional commits. + +## CI command + +The Release workflow runs semantic-release through `npx -p ...` so release +tooling does not add root dependency or lockfile churn. + +## Flow + +1. Use conventional commit subjects such as `fix(api): ...`, + `feat(bot): ...`, and `docs(web): ...`. +2. Merge to `main`. +3. The Release workflow runs semantic-release, updates `CHANGELOG.md`, commits + release notes, and creates the Git tag. + +No npm publish step is configured because this repository currently keeps its +packages private.