Files
ci-workflows/.gitea/workflows/wp-plugin-release.yml

224 lines
7.5 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: WP Plugin Build & Release
on:
workflow_call:
inputs:
main_file:
type: string
required: true
description: "Pad naar hoofd pluginbestand (met Version header)"
slug:
type: string
required: true
description: "Plugin slug / mapnaam in zip"
build_paths:
type: string
required: false
default: ""
description: "Newline-separated glob paths die de workflow triggeren (alleen informatief in reusable variant)"
release_title:
type: string
required: false
default: ""
release_body:
type: string
required: false
default: ""
secrets:
RELEASE_TOKEN:
required: true
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
- name: Determine plugin version
id: meta
run: |
MAIN_FILE="${{ inputs.main_file }}"
VERSION=$(grep -E "^\s*\*\s*Version:" -m 1 "$MAIN_FILE" | sed -E 's/.*Version:\s*//')
VERSION=$(echo "$VERSION" | tr -d '\r')
if [ -z "$VERSION" ]; then
echo "::error::Kon pluginversie niet bepalen."
exit 1
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Genereer manifest.json uit plugin header
run: |
MAIN_FILE="${{ inputs.main_file }}"
python3 - <<'PY'
import json, re, os
main_file = os.environ["MAIN_FILE"]
with open(main_file, "r", encoding="utf-8") as handle:
content = handle.read()
header_match = re.search(r"/\*\*(.*?)\*/", content, re.S)
header = header_match.group(1) if header_match else ""
def read_field(label: str) -> str:
match = re.search(r"^\s*\*\s*" + re.escape(label) + r"\s*:\s*(.+)$", header, re.M)
return match.group(1).strip() if match else ""
manifest = {
"plugin_name": read_field("Plugin Name"),
"description": read_field("Description"),
"version": read_field("Version"),
"author": read_field("Author"),
"author_url": read_field("Author URI"),
}
with open("manifest.json", "w", encoding="utf-8") as handle:
json.dump(manifest, handle, ensure_ascii=False, indent=2)
print("manifest.json aangemaakt/bijgewerkt")
PY
env:
MAIN_FILE: ${{ inputs.main_file }}
- name: Commit & push manifest.json (optioneel)
run: |
if git diff --quiet -- manifest.json; then
echo "manifest.json ongewijzigd; geen commit nodig."
exit 0
fi
# Voor Gitea kan je dit aanpassen naar een eigen bot user
git config user.name "actions-bot"
git config user.email "actions-bot@localhost"
git add manifest.json
git commit -m "chore: update manifest.json"
git push
- name: Check if tag exists
id: tagcheck
run: |
TAG="v${{ steps.meta.outputs.version }}"
if git ls-remote --tags origin "refs/tags/$TAG" | grep -q "refs/tags/$TAG$"; then
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "exists=false" >> "$GITHUB_OUTPUT"
fi
- name: Tag bestaat al workflow afronden
if: steps.tagcheck.outputs.exists == 'true'
run: |
echo "Tag v${{ steps.meta.outputs.version }} bestaat al. Release wordt overgeslagen."
- name: Build distributie-zip
if: steps.tagcheck.outputs.exists == 'false'
id: package
run: |
if ! command -v zip >/dev/null 2>&1; then
apt-get update -y
apt-get install -y zip
fi
VERSION="${{ steps.meta.outputs.version }}"
SLUG="${{ inputs.slug }}"
BUILD_ROOT="$RUNNER_TEMP/build"
DEST_DIR="$BUILD_ROOT/$SLUG"
mkdir -p "$DEST_DIR"
tar -cf - \
--exclude='.git' \
--exclude='.gitea' \
--exclude='.github' \
--exclude='docker' \
--exclude='docs' \
--exclude='dist' \
--exclude='docker-compose.yml' \
--exclude='PLAN.md' \
. | tar -xf - -C "$DEST_DIR"
mkdir -p dist
ZIP_PATH="dist/${SLUG}-${VERSION}.zip"
(cd "$BUILD_ROOT" && zip -r "$GITHUB_WORKSPACE/$ZIP_PATH" "$SLUG")
echo "asset_path=$ZIP_PATH" >> "$GITHUB_OUTPUT"
echo "asset_name=${SLUG}-${VERSION}.zip" >> "$GITHUB_OUTPUT"
- name: Maak Gitea release
if: steps.tagcheck.outputs.exists == 'false'
env:
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_SERVER_URL: ${{ vars.RELEASE_SERVER_URL }}
RELEASE_REPOSITORY: ${{ vars.RELEASE_REPOSITORY }}
TAG: v${{ steps.meta.outputs.version }}
RELEASE_TITLE: ${{ inputs.release_title }}
RELEASE_BODY: ${{ inputs.release_body }}
run: |
VERSION="${{ steps.meta.outputs.version }}"
TAG="v$VERSION"
ASSET_PATH="${{ steps.package.outputs.asset_path }}"
ASSET_NAME="${{ steps.package.outputs.asset_name }}"
if [ -z "$RELEASE_TOKEN" ]; then
echo "::error::RELEASE_TOKEN ontbreekt. Voeg deze secret toe om releases te kunnen maken."
exit 1
fi
# Gitea Actions zet meestal GITEA_SERVER_URL / GITEA_REPOSITORY,
# maar je gebruikt vars als override (prima).
SERVER_URL="${RELEASE_SERVER_URL:-${GITEA_SERVER_URL:-${GITHUB_SERVER_URL}}}"
REPO="${RELEASE_REPOSITORY:-${GITEA_REPOSITORY:-${GITHUB_REPOSITORY}}}"
if [ -z "$SERVER_URL" ] || [ -z "$REPO" ]; then
echo "::error::Kan server of repository niet bepalen. Stel RELEASE_SERVER_URL en RELEASE_REPOSITORY in."
exit 1
fi
API_URL="${SERVER_URL%/}/api/v1"
python3 - <<'PY'
import json, os
tag = os.environ["TAG"]
title = os.environ.get("RELEASE_TITLE") or f"Release {tag}"
body = os.environ.get("RELEASE_BODY") or f"Automatische release op basis van versie {tag[1:]}"
payload = {
"tag_name": tag,
"name": title,
"body": body,
"target_commitish": os.environ.get("GITHUB_SHA") or os.environ.get("GITEA_SHA") or "",
}
with open("release.json", "w", encoding="utf-8") as handle:
json.dump(payload, handle, ensure_ascii=False)
PY
curl -sS -X POST "$API_URL/repos/$REPO/releases" \
-H "Authorization: token $RELEASE_TOKEN" \
-H "Content-Type: application/json" \
-d @release.json \
-o release-response.json
RELEASE_ID=$(python3 - <<'PY'
import json
with open("release-response.json", "r", encoding="utf-8") as handle:
data = json.load(handle)
print(data.get("id",""))
PY
)
if [ -z "$RELEASE_ID" ]; then
echo "::error::Kon release-ID niet bepalen. Response: $(cat release-response.json)"
exit 1
fi
curl -sS -X POST "$API_URL/repos/$REPO/releases/$RELEASE_ID/assets?name=$ASSET_NAME" \
-H "Authorization: token $RELEASE_TOKEN" \
-H "Content-Type: application/zip" \
--data-binary "@$ASSET_PATH"