CI prüft bei jedem Push Typen, Tests und den Produktionsbuild — die Tests laufen gegen eine echte PostgreSQL-Instanz, weil sie Abfragen und Fortschrittsberechnungen prüfen, nicht Attrappen. Der Release-Workflow zieht die Notizen aus releases/vX.Y.Z.md, derselben Datei, die auch von Hand für ein Release taugt. So gibt es eine Quelle für den Text, und der Ablauf funktioniert mit und ohne CI.
57 lines
1.6 KiB
YAML
57 lines
1.6 KiB
YAML
# Legt beim Pushen eines Versions-Tags automatisch das Release an.
|
|
#
|
|
# Die Notizen kommen aus releases/vX.Y.Z.md — derselben Datei, die auch von
|
|
# Hand für ein Release taugt. So gibt es genau eine Quelle für den Text, und
|
|
# der Ablauf funktioniert mit und ohne CI.
|
|
|
|
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- "v*.*.*"
|
|
|
|
jobs:
|
|
veroeffentlichen:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Release-Notizen einsammeln
|
|
id: notes
|
|
run: |
|
|
VERSION="${GITHUB_REF_NAME#v}"
|
|
FILE="releases/${GITHUB_REF_NAME}.md"
|
|
|
|
if [ ! -f "$FILE" ]; then
|
|
echo "Es gibt keine $FILE — bitte anlegen, bevor der Tag gepusht wird." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Die Überschrift der Datei ist der Titel; alles darunter der Text.
|
|
{
|
|
echo "version=$VERSION"
|
|
echo "body<<FLIMMER_EOF"
|
|
tail -n +2 "$FILE"
|
|
echo "FLIMMER_EOF"
|
|
} >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Release anlegen
|
|
env:
|
|
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
BODY: ${{ steps.notes.outputs.body }}
|
|
VERSION: ${{ steps.notes.outputs.version }}
|
|
run: |
|
|
PAYLOAD=$(jq -n \
|
|
--arg tag "$GITHUB_REF_NAME" \
|
|
--arg name "$VERSION" \
|
|
--arg body "$BODY" \
|
|
'{tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false}')
|
|
|
|
curl -sSf -X POST \
|
|
-H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$PAYLOAD" \
|
|
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases"
|