ci: add Gitea Actions release workflow (per-addon git-archive zip)
release / release (push) Failing after 4s
release / release (push) Failing after 4s
This commit is contained in:
@@ -0,0 +1,49 @@
|
|||||||
|
name: release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*-coa.*' # Asc-1.1.6-coa.2, 9.1.40-coa.3, etc.
|
||||||
|
- 'v*' # v0.3.0 for repos without an upstream version
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: linux-amd64
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # build_zip uses git archive HEAD; full history is fine
|
||||||
|
|
||||||
|
- name: Build per-addon zip(s)
|
||||||
|
run: bash tools/build_zip.sh
|
||||||
|
|
||||||
|
- name: Publish release (Gitea API direct; no action dependency)
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
REPO: ${{ github.repository }}
|
||||||
|
TAG: ${{ github.ref_name }}
|
||||||
|
API: ${{ github.server_url }}/api/v1
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
# Create the release (or reuse if it already exists for this tag).
|
||||||
|
RID=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
|
||||||
|
"$API/repos/$REPO/releases/tags/$TAG" 2>/dev/null \
|
||||||
|
| jq -r '.id // empty')
|
||||||
|
if [ -z "$RID" ]; then
|
||||||
|
RID=$(curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"$API/repos/$REPO/releases" \
|
||||||
|
-d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false}')" \
|
||||||
|
| jq -r '.id')
|
||||||
|
fi
|
||||||
|
echo "release id: $RID"
|
||||||
|
# Upload every dist/*.zip
|
||||||
|
for f in dist/*.zip; do
|
||||||
|
name=$(basename "$f")
|
||||||
|
echo "uploading $name"
|
||||||
|
curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \
|
||||||
|
-F "attachment=@$f" \
|
||||||
|
"$API/repos/$REPO/releases/$RID/assets?name=$name" \
|
||||||
|
| jq -r '" -> " + .browser_download_url'
|
||||||
|
done
|
||||||
+2
-1
@@ -6,4 +6,5 @@
|
|||||||
.vscode
|
.vscode
|
||||||
.idea
|
.idea
|
||||||
deploy.bat
|
deploy.bat
|
||||||
claude.md
|
claude.md
|
||||||
|
dist/
|
||||||
|
|||||||
Executable
+60
@@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build per-addon zip artefacts from HEAD via git-archive.
|
||||||
|
#
|
||||||
|
# - Discovers top-level addon folders (Foo/Foo.toc).
|
||||||
|
# - Re-creates dist/ each run.
|
||||||
|
# - Always archives HEAD, so the working tree state is irrelevant.
|
||||||
|
# - If more than one addon folder is present, also emits <repo>-all.zip
|
||||||
|
# with every addon folder side-by-side at the zip root.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
root=$(git rev-parse --show-toplevel)
|
||||||
|
cd "$root"
|
||||||
|
|
||||||
|
repo_name=$(basename "$root")
|
||||||
|
dist="$root/dist"
|
||||||
|
|
||||||
|
# Find Foo/Foo.toc pairs at depth 1; ignore libs nested deeper.
|
||||||
|
addons=()
|
||||||
|
while IFS= read -r toc; do
|
||||||
|
dir=$(dirname "$toc")
|
||||||
|
folder=$(basename "$dir")
|
||||||
|
base=$(basename "$toc" .toc)
|
||||||
|
# Accept Foo.toc and Foo_Wrath.toc style flavour variants; folder must match
|
||||||
|
# at least one toc basename prefix (Foo).
|
||||||
|
case "$base" in
|
||||||
|
"$folder"|"$folder"_*) addons+=("$folder") ;;
|
||||||
|
esac
|
||||||
|
done < <(command find . -mindepth 2 -maxdepth 2 -type f -name '*.toc' | sed 's|^\./||' | sort)
|
||||||
|
|
||||||
|
# Dedupe (a folder with Foo.toc + Foo_Wrath.toc shows up twice).
|
||||||
|
if [ ${#addons[@]} -gt 0 ]; then
|
||||||
|
mapfile -t addons < <(printf '%s\n' "${addons[@]}" | awk '!seen[$0]++')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#addons[@]} -eq 0 ]; then
|
||||||
|
echo "no addon folders found (looking for */Foo.toc with matching folder name)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$dist"
|
||||||
|
mkdir -p "$dist"
|
||||||
|
|
||||||
|
for folder in "${addons[@]}"; do
|
||||||
|
out="$dist/$folder.zip"
|
||||||
|
# No --prefix: the folder already sits at the repo root, so git-archive
|
||||||
|
# emits entries as <folder>/... which is exactly what
|
||||||
|
# Interface/AddOns/ expects after extraction.
|
||||||
|
git archive HEAD --format=zip -o "$out" -- "$folder"
|
||||||
|
echo "built dist/$folder.zip"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Combined bundle only makes sense when there are multiple addons.
|
||||||
|
if [ ${#addons[@]} -gt 1 ]; then
|
||||||
|
tmp=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$tmp"' EXIT
|
||||||
|
git archive HEAD --format=tar -- "${addons[@]}" | tar -x -C "$tmp"
|
||||||
|
out="$dist/$repo_name-all.zip"
|
||||||
|
( cd "$tmp" && zip -qr "$out" "${addons[@]}" )
|
||||||
|
echo "built dist/$repo_name-all.zip"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user