#!/usr/bin/env bash set -euo pipefail # ── Read version from build.gradle.kts ────────────────────────────────────── VERSION=$(grep -oP 'val appVersion\s*=\s*"\K[^"]+' composeApp/build.gradle.kts) TAG="v${VERSION}" echo "==> Version: ${VERSION} (tag: ${TAG})" # ── Require FORGEJO_TOKEN ──────────────────────────────────────────────────── if [[ -z "${FORGEJO_TOKEN:-}" ]]; then echo "ERROR: FORGEJO_TOKEN env var is not set." >&2 exit 1 fi # ── Detect OS and set build task / artifact glob ───────────────────────────── OS="$(uname -s)" case "${OS}" in Darwin) TASK=":composeApp:packageDmg" GLOB="composeApp/build/compose/binaries/main/dmg/*.dmg" ;; MINGW*|MSYS*|CYGWIN*|Windows_NT) TASK=":composeApp:packageMsi" GLOB="composeApp/build/compose/binaries/main/msi/*.msi" ;; *) echo "ERROR: Unsupported OS '${OS}'." >&2 exit 1 ;; esac echo "==> OS detected: ${OS} — task: ${TASK}" # ── Build ──────────────────────────────────────────────────────────────────── echo "==> Building..." ./gradlew ${TASK} # ── Locate artifact ────────────────────────────────────────────────────────── ARTIFACT=$(ls ${GLOB} 2>/dev/null | head -1) if [[ -z "${ARTIFACT}" ]]; then echo "ERROR: No artifact found matching ${GLOB}" >&2 exit 1 fi echo "==> Artifact: ${ARTIFACT}" # ── Forgejo API setup ──────────────────────────────────────────────────────── API_BASE="https://git.asarius.site/api/v1" REPO="rukira/wow-backup" # ── Check for existing release ─────────────────────────────────────────────── echo "==> Checking for existing release ${TAG}..." HTTP_CODE=$(curl -s -o /tmp/release_response.json -w "%{http_code}" \ -H "Authorization: token ${FORGEJO_TOKEN}" \ "${API_BASE}/repos/${REPO}/releases/tags/${TAG}") if [[ "${HTTP_CODE}" == "200" ]]; then RELEASE_ID=$(python3 -c "import json; print(json.load(open('/tmp/release_response.json'))['id'])") echo "==> Found existing release (id: ${RELEASE_ID})" else echo "==> Creating release ${TAG}..." HTTP_CODE=$(curl -s -o /tmp/release_create.json -w "%{http_code}" \ -X POST \ -H "Authorization: token ${FORGEJO_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\": \"${TAG}\", \"name\": \"${TAG}\", \"body\": \"Release ${TAG}\"}" \ "${API_BASE}/repos/${REPO}/releases") if [[ "${HTTP_CODE}" != "201" ]]; then echo "ERROR: Failed to create release (HTTP ${HTTP_CODE}):" >&2 cat /tmp/release_create.json >&2 exit 1 fi RELEASE_ID=$(python3 -c "import json; print(json.load(open('/tmp/release_create.json'))['id'])") echo "==> Created release (id: ${RELEASE_ID})" fi # ── Upload artifact ────────────────────────────────────────────────────────── FILENAME=$(basename "${ARTIFACT}") echo "==> Uploading ${FILENAME}..." HTTP_CODE=$(curl -s -o /tmp/upload_response.json -w "%{http_code}" \ -X POST \ -H "Authorization: token ${FORGEJO_TOKEN}" \ -F "attachment=@${ARTIFACT}" \ "${API_BASE}/repos/${REPO}/releases/${RELEASE_ID}/assets?name=${FILENAME}") if [[ "${HTTP_CODE}" != "201" ]]; then echo "ERROR: Failed to upload artifact (HTTP ${HTTP_CODE}):" >&2 cat /tmp/upload_response.json >&2 exit 1 fi echo "==> Done! ${FILENAME} uploaded to release ${TAG}."