#!/usr/bin/env bash # Build AdminStealth, package it as one tarball and publish it as a Forgejo release. # # ./release.sh e.g. ./release.sh v0.14.0 # # Commit first: the plugin is rebuilt here from the committed source, so the release always matches # the tag. 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 attachment. # # Asset: AdminStealth-.tar.gz, laid out like the server's game/csgo/ - extract it there: # tar -xzf AdminStealth-.tar.gz -C /srv/cs2/game/csgo # # addons/counterstrikesharp/plugins/AdminStealth/ AdminStealth.dll, .pdb, .deps.json # # No configs/: the plugin has no settings. CS2-SimpleAdminApi.dll (lib/) is compile-only; the # server has it in shared/ from CS2-SimpleAdmin. set -euo pipefail FORGEJO_URL="https://git.zio.sh" OWNER="cs2" REPO="AdminStealth" # Placeholder - replace, or set FORGEJO_TOKEN in the environment instead. Needs write:repository. # Only uploading needs it; downloading from the public repo doesn't. Don't commit a real token. FORGEJO_TOKEN="${FORGEJO_TOKEN:-CHANGE_ME_FORGEJO_TOKEN}" # Only these ship from the publish output. CounterStrikeSharp.API.dll is excluded by the csproj # (ExcludeAssets=runtime); the server already provides it. PLUGIN_FILES=( AdminStealth.dll AdminStealth.pdb AdminStealth.deps.json ) TAG="${1:-}" if [[ -z "$TAG" ]]; then echo "usage: $0 (e.g. v0.1.0)" >&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 for tool in podman jq curl git; do command -v "$tool" >/dev/null || { echo "'$tool' is required." >&2; exit 1; } done cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" if [[ -n "$(git status --porcelain --untracked-files=no)" ]]; then echo "Tracked files have uncommitted changes; commit them so the tag matches the release." >&2 exit 1 fi # The tag should name the version the plugin reports in `css_plugins list`. version="$(sed -n 's/.*ModuleVersion => "\(.*\)";.*/\1/p' AdminStealth.cs)" if [[ "${TAG#v}" != "$version" ]]; then echo "Tag $TAG doesn't match ModuleVersion $version in AdminStealth.cs." >&2 exit 1 fi # --- Build ----------------------------------------------------------------------- OUT="release-out" PUBLISH="$OUT/publish" rm -rf bin obj "$OUT" podman run --rm -v "$(pwd)":/src:Z -w /src \ mcr.microsoft.com/dotnet/sdk:10.0 dotnet publish -c Release -o "/src/$PUBLISH" # --- Stage (layout of game/csgo/) and package ---------------------------------------- STAGE="$OUT/stage" PLUGIN_DIR="$STAGE/addons/counterstrikesharp/plugins/AdminStealth" mkdir -p "$PLUGIN_DIR" for file in "${PLUGIN_FILES[@]}"; do cp "$PUBLISH/$file" "$PLUGIN_DIR/" done TARBALL="AdminStealth-${TAG}.tar.gz" tar -czf "$OUT/$TARBALL" -C "$STAGE" addons rm -rf "$STAGE" "$PUBLISH" echo "Packaged:" tar -tzf "$OUT/$TARBALL" # --- 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 attachment" fi release_id="$(jq -r '.id' <<<"$release_json")" existing_id="$(jq -r --arg n "$TARBALL" '.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/$TARBALL" \ "$API/releases/$release_id/assets?name=$TARBALL" >/dev/null echo "Uploaded $TARBALL" echo echo "Download URL:" echo " $FORGEJO_URL/$OWNER/$REPO/releases/download/$TAG/$TARBALL"