# 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