From 0e60d3c5f3d862cc4cdf16217dbe4cc7f7989111 Mon Sep 17 00:00:00 2001 From: Astra Date: Fri, 25 Sep 2026 16:00:57 +0100 Subject: [PATCH] Add release.sh: package build/addons and publish a Forgejo release Packages the KHook build into RayTrace-MM--linux.tar.gz and RayTrace-CSS-API-.tar.gz (upstream's release layout), tags HEAD and uploads both to the git.zio.sh release. Needs FORGEJO_TOKEN in the environment. --- release.sh | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100755 release.sh diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..f829842 --- /dev/null +++ b/release.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +# Package build/addons into release tarballs and publish them as a Forgejo release. +# +# ./release.sh e.g. ./release.sh v1.0.16-khook1 +# +# Build first (see the podman commands in the repo's CLAUDE.md entry / docker/). The tag is +# created on HEAD and pushed to origin if it doesn't exist yet. Re-running with the same tag +# replaces that release's attachments instead of failing. +# +# No longer used on our server: jRandomSkills 1.2.4.b3+ traces through CounterStrikeSharp's native +# Trace API. Kept for anyone else running upstream jRandomSkills <= 1.2.4.b2 on Metamod 1461+. +# +# Tarball layout matches upstream's GitHub releases: +# RayTrace-MM--linux.tar.gz metamod/, RayTrace/ -> addons/ +# RayTrace-CSS-API-.tar.gz RayTrace-CSS-API-/counterstrikesharp/... (strip 1) -> addons/ +set -euo pipefail + +FORGEJO_URL="https://git.zio.sh" +OWNER="cs2" +REPO="Ray-Trace" +# Placeholder - replace, or set FORGEJO_TOKEN in the environment instead. Needs write:repository. +# Don't commit this file with a real token in it. +FORGEJO_TOKEN="${FORGEJO_TOKEN:-CHANGE_ME_FORGEJO_TOKEN}" + +TAG="${1:-}" +if [[ -z "$TAG" ]]; then + echo "usage: $0 (e.g. v1.0.16-khook1)" >&2 + exit 1 +fi +if [[ "$FORGEJO_TOKEN" == "CHANGE_ME_FORGEJO_TOKEN" ]]; then + echo "Set FORGEJO_TOKEN (edit release.sh or export it) first." >&2 + exit 1 +fi + +cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" + +ADDONS="build/addons" +for required in \ + "$ADDONS/metamod/RayTrace.vdf" \ + "$ADDONS/RayTrace/bin/linuxsteamrt64/RayTrace.so" \ + "$ADDONS/counterstrikesharp/plugins/RayTraceImpl/RayTraceImpl.dll" \ + "$ADDONS/counterstrikesharp/shared/RayTraceApi/RayTraceApi.dll"; do + [[ -f "$required" ]] || { echo "Missing $required - build first." >&2; exit 1; } +done + +if [[ -n "$(git status --porcelain --untracked-files=no)" ]]; then + echo "Tracked files have uncommitted changes; commit them so the tag matches the build." >&2 + exit 1 +fi + +# --- Package ----------------------------------------------------------------- +OUT="build/release" +rm -rf "$OUT" +mkdir -p "$OUT" + +MM_TAR="RayTrace-MM-${TAG}-linux.tar.gz" +CSS_DIR="RayTrace-CSS-API-${TAG}" +CSS_TAR="${CSS_DIR}.tar.gz" + +tar -czf "$OUT/$MM_TAR" -C "$ADDONS" metamod RayTrace + +mkdir -p "$OUT/$CSS_DIR/counterstrikesharp/plugins" "$OUT/$CSS_DIR/counterstrikesharp/shared" +cp -r "$ADDONS/counterstrikesharp/plugins/RayTraceImpl" "$OUT/$CSS_DIR/counterstrikesharp/plugins/" +cp -r "$ADDONS/counterstrikesharp/shared/RayTraceApi" "$OUT/$CSS_DIR/counterstrikesharp/shared/" +tar -czf "$OUT/$CSS_TAR" -C "$OUT" "$CSS_DIR" +rm -rf "${OUT:?}/$CSS_DIR" + +echo "Packaged:" +ls -la "$OUT" + +# --- Tag --------------------------------------------------------------------- +if ! git rev-parse -q --verify "refs/tags/$TAG" >/dev/null; then + git tag -a "$TAG" -m "$TAG" +fi +git push origin "refs/tags/$TAG" + +# --- Release ----------------------------------------------------------------- +API="$FORGEJO_URL/api/v1/repos/$OWNER/$REPO" +AUTH=(-H "Authorization: token $FORGEJO_TOKEN") + +release_json="$(curl -fsS "${AUTH[@]}" "$API/releases/tags/$TAG" 2>/dev/null || true)" +if [[ -z "$release_json" ]]; then + body="$(git log -1 --format=%B "$TAG")" + release_json="$(jq -n --arg tag "$TAG" --arg body "$body" \ + '{tag_name: $tag, name: $tag, body: $body, draft: false, prerelease: false}' | + curl -fsS "${AUTH[@]}" -H "Content-Type: application/json" -X POST --data @- "$API/releases")" + echo "Created release $TAG" +else + echo "Release $TAG already exists, replacing its attachments" +fi +release_id="$(jq -r '.id' <<<"$release_json")" + +for file in "$MM_TAR" "$CSS_TAR"; do + existing_id="$(jq -r --arg n "$file" '.assets[]? | select(.name == $n) | .id' <<<"$release_json")" + if [[ -n "$existing_id" ]]; then + curl -fsS "${AUTH[@]}" -X DELETE "$API/releases/$release_id/assets/$existing_id" >/dev/null + fi + curl -fsS "${AUTH[@]}" -X POST -F "attachment=@$OUT/$file" \ + "$API/releases/$release_id/assets?name=$file" >/dev/null + echo "Uploaded $file" +done + +echo +echo "Download URLs:" +echo " $FORGEJO_URL/$OWNER/$REPO/releases/download/$TAG/$MM_TAR" +echo " $FORGEJO_URL/$OWNER/$REPO/releases/download/$TAG/$CSS_TAR"