112 lines
3.9 KiB
YAML
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
|