diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..a58a5ae --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,43 @@ +# https://help.github.com/en/categories/automating-your-workflow-with-github-actions + +name: "Release" + +# Runs after a successful "Build" of a push to main, so failing tests never get released. +on: + workflow_run: + workflows: + - "Build" + types: + - "completed" + branches: + - "main" + +permissions: + contents: "write" + issues: "write" + pull-requests: "write" + +jobs: + release: + name: "Create Release" + + if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push' }} + + runs-on: "ubuntu-latest" + + steps: + - name: "Checkout" + uses: "actions/checkout@v4" + with: + ref: "${{ github.event.workflow_run.head_sha }}" + fetch-depth: 0 + + - name: "Install Node" + uses: "actions/setup-node@v4" + with: + node-version: "lts/*" + + - name: "Run semantic-release" + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + run: "npx semantic-release@25.0.9" diff --git a/.releaserc b/.releaserc new file mode 100644 index 0000000..c2d6d5d --- /dev/null +++ b/.releaserc @@ -0,0 +1,11 @@ +{ + "branches": [ + "main" + ], + "tagFormat": "${version}", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/github" + ] +} diff --git a/CLAUDE.md b/CLAUDE.md index 61d22ed..2c73b14 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -72,8 +72,21 @@ vendor/bin/phpcs nach einem Upgrade immer beide Testarten laufen lassen. CI testet auch `--prefer-lowest`, Versionsconstraints also nicht höher setzen als nötig, aber auch nicht so niedrig, dass die niedrigste Version die Tests bricht. -- Commits im Stil Conventional Commits (`fix:`, `fix(deps):`, `chore:`). +- Commits im Stil Conventional Commits (`fix:`, `fix(deps):`, `chore:`). Sie bestimmen die + Version (siehe Releases), der Commit-Typ ist also eine Release-Entscheidung. - Branch für Entwicklung ist `main` (CI läuft auf Push nach `main` und auf PRs). Ältere Versionszweige: `1.0`, `3.0`. `main` ist geschützt: nur per PR, alle CI-Jobs `Tests (…)` sind Pflicht-Checks. Ändert sich die PHP-Matrix, müssen die Pflicht-Checks in der Branch-Protection angepasst werden. + +## Releases + +Releases macht semantic-release (`.releaserc`, `.github/workflows/release.yaml`), keine +Tags von Hand setzen. Nach jedem erfolgreichen Build eines Pushes auf `main` erzeugt es aus +den Commits seit dem letzten Tag Tag und GitHub-Release (Tag-Format ohne `v`, z. B. +`8.0.2`); Packagist übernimmt den Tag per Webhook. + +- `fix:` → Patch, `feat:` → Minor, `BREAKING CHANGE:` im Commit-Footer (oder `feat!:`) → Major. +- `chore:`, `ci:`, `docs:`, `test:` lösen allein kein Release aus. +- Neue oder strengere Regeln können bei Nutzern Builds brechen: bewusst entscheiden, ob + das ein `BREAKING CHANGE` ist.