From ccd7915e5009acaaec3e657c94b4a5e420bb8c31 Mon Sep 17 00:00:00 2001 From: Benjamin Tenke Date: Mon, 28 Sep 2026 11:28:46 +0200 Subject: [PATCH] ci: release automatically on push to main when feat or fix landed Co-Authored-By: Claude Opus 5.5 --- .github/workflows/release.yml | 31 ++++++++++++++++++++++++++++--- README.md | 9 ++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90aac1c..12ef97c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,8 @@ name: Release on: + push: + branches: [main] workflow_dispatch: inputs: increment: @@ -19,12 +21,35 @@ permissions: contents: write jobs: + # On push: release only if a feat, fix or breaking change landed since the last tag. + check: + runs-on: ubuntu-latest + if: "github.ref == 'refs/heads/main' && !startsWith(github.event.head_commit.message, 'chore: release')" + outputs: + release: ${{ steps.check.outputs.release }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - id: check + run: | + if [ "${{ github.event_name }}" = workflow_dispatch ]; then echo release=true >> "$GITHUB_OUTPUT"; exit 0; fi + last=$(git describe --tags --abbrev=0 2>/dev/null || true) + if git log --format=%B "${last:+$last..}HEAD" | grep -qE '^(feat|fix)(\(.+\))?!?:|^BREAKING CHANGE'; then + echo release=true >> "$GITHUB_OUTPUT" + else + echo "No feat/fix since ${last:-the first commit}, skipping release." + echo release=false >> "$GITHUB_OUTPUT" + fi + release: + needs: check + if: needs.check.outputs.release == 'true' runs-on: ubuntu-latest - if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 with: + ref: main fetch-depth: 0 - uses: actions/setup-node@v4 with: @@ -39,8 +64,8 @@ jobs: - name: Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - INCREMENT: ${{ inputs.increment }} - DRY_RUN: ${{ inputs.dry-run }} + INCREMENT: ${{ inputs.increment || 'auto' }} + DRY_RUN: ${{ inputs.dry-run || false }} run: | args=(--ci) [ "$INCREMENT" != auto ] && args+=("$INCREMENT") diff --git a/README.md b/README.md index 0706af3..988e2a1 100644 --- a/README.md +++ b/README.md @@ -357,11 +357,14 @@ Muss mit `RESULT: PASS`, `no reference problems`, `smoke test ok`, `story smoke - **CI** (`.github/workflows/ci.yml`): bei jedem Push auf `main` und jedem PR wird das Plugin validiert; bei PRs werden zusätzlich die Commit-Nachrichten geprüft. -- **Release** (`.github/workflows/release.yml`): von Hand unter *Actions → Release → Run workflow*, - nur auf `main`. Die Erhöhung ist `auto` (aus den Commits: `feat:` → minor, `fix:` → patch, +- **Release** (`.github/workflows/release.yml`): automatisch bei jedem Push auf `main`, sofern seit + dem letzten Tag ein `feat:`, `fix:` oder Breaking Change dazukam; reine `docs:`/`chore:`-Merges + lösen keins aus. Von Hand unter *Actions → Release → Run workflow*, nur auf `main`, dort ist die + Erhöhung wählbar: `auto` (aus den Commits: `feat:` → minor, `fix:` → patch, `feat!:`/`BREAKING CHANGE:` → major) oder fest `patch`/`minor`/`major`, optional als Probelauf. Der Workflow setzt die Version in `plugin.json` und `package.json`, schreibt `CHANGELOG.md`, taggt `vX.Y.Z` und legt das GitHub-Release an. Nutzer bekommen Updates nur, wenn die Version in `plugin.json` steigt. Deshalb läuft jede -Auslieferung über den Release-Workflow (lokal geht auch `npm run release`). +Auslieferung über den Release-Workflow (lokal geht auch `npm run release`). Pusht der Workflow nicht +auf `main` (Branch-Schutz), braucht der Bot dort eine Ausnahme.