Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Release

on:
push:
branches: [main]
workflow_dispatch:
inputs:
increment:
Expand All @@ -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:
Expand All @@ -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")
Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Loading