server-up/.forgejo/workflows/release.yml
bes-r 7dd83f0a88
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m2s
Deploy server-up (prod) / deploy (push) Successful in 41s
Release / release (push) Successful in 5s
v0.4.5 - releases + update-check
2026-06-06 22:04:04 +02:00

112 lines
3.9 KiB
YAML

# Forgejo Actions — maak automatisch een Release bij een v*-tag.
#
# Bouwt de release-notes uit:
# 1) de bijbehorende sectie in CHANGELOG.md
# 2) een commit-overzicht sinds de vorige tag
# en publiceert die als Forgejo-Release via de API. Pre-release tags
# (bv. v0.8.4-beta1) worden als pre-release gemarkeerd.
#
# Token: gebruikt de automatische GITHUB_TOKEN van Forgejo Actions. Werkt dat
# niet (onvoldoende rechten), zet dan een secret RELEASE_TOKEN met repo-write.
name: Release
on:
push:
tags:
- "v*"
jobs:
release:
runs-on: [self-hosted, prod]
timeout-minutes: 10
steps:
- name: Checkout (volledige historie + tags)
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Release-notes opbouwen
id: notes
run: |
set -euo pipefail
TAG="${GITHUB_REF_NAME}"
VERSION="${TAG#v}"
echo "TAG=${TAG}" >> "$GITHUB_ENV"
# Pre-release? (tag bevat een suffix met streepje, bv. -beta1 / -rc.1)
if [[ "$VERSION" == *-* ]]; then
echo "PRERELEASE=true" >> "$GITHUB_ENV"
else
echo "PRERELEASE=false" >> "$GITHUB_ENV"
fi
NOTES="$(mktemp)"
# 1) Sectie uit CHANGELOG.md (van "# vX..." tot de volgende "# v...")
awk -v ver="$VERSION" '
$0 ~ ("^# v?" ver "([ \t).—-]|$)") {grab=1; print; next}
grab && /^# v/ {exit}
grab {print}
' CHANGELOG.md > "$NOTES" || true
# 2) Commit-overzicht sinds de vorige tag
PREV="$(git describe --tags --abbrev=0 "${TAG}^" 2>/dev/null || echo "")"
{
echo ""
echo "## Commits"
if [ -n "$PREV" ]; then
git log --no-merges --pretty="- %s (%h)" "${PREV}..${TAG}"
echo ""
echo "**Volledige changelog:** ${PREV}...${TAG}"
else
git log --no-merges --pretty="- %s (%h)" "${TAG}"
fi
} >> "$NOTES"
echo "NOTES_FILE=${NOTES}" >> "$GITHUB_ENV"
echo "----- release notes -----"; cat "$NOTES"
- name: Release aanmaken via Forgejo API
run: |
set -euo pipefail
TOKEN="${{ secrets.RELEASE_TOKEN }}"
if [ -z "$TOKEN" ]; then TOKEN="${{ secrets.GITHUB_TOKEN }}"; fi
# Bouw JSON-payload (body veilig ge-escaped via python)
python3 - "$TAG" "$NOTES_FILE" "$PRERELEASE" > payload.json <<'PY'
import json, sys
tag, notes_file, pre = sys.argv[1], sys.argv[2], sys.argv[3]
body = open(notes_file, encoding="utf-8").read()
print(json.dumps({
"tag_name": tag,
"name": tag,
"body": body,
"draft": False,
"prerelease": pre == "true",
}))
PY
API="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases"
code=$(curl -sS -o resp.json -w "%{http_code}" -X POST \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
-d @payload.json "$API")
echo "HTTP ${code}"; cat resp.json || true
if [ "$code" = "201" ]; then
echo "Release ${TAG} aangemaakt."
elif [ "$code" = "409" ]; then
# Bestaat al: update de bestaande release
ID=$(curl -sS -H "Authorization: token ${TOKEN}" \
"${API}/tags/${TAG}" | python3 -c "import json,sys;print(json.load(sys.stdin).get('id',''))")
if [ -n "$ID" ]; then
curl -fsS -X PATCH \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
-d @payload.json "${API}/${ID}" >/dev/null
echo "Bestaande release ${TAG} bijgewerkt."
fi
else
echo "Release aanmaken faalde (HTTP ${code})"; exit 1
fi