#!/bin/bash # ════════════════════════════════════════════════════════════════════ # ARIA Host-Agent — Release Script # Baut die auf Linux+Docker moeglichen Artefakte und haengt sie als # Gitea-Release-Assets an einen Tag. NICHTS wandert in den Git-Tree — # Binaries leben nur unter "Releases" (blaeht clone/History nicht auf). # # Verwendung: ./release_agent.sh (z.B. ./release_agent.sh 0.2.0) # # Artefakte: # - Linux-x64-Binary (Docker, PyInstaller) -> immer # - Android-APK (Docker, Gradle) -> immer # - macOS / Windows (falls in dist/ vorgebaut) -> optional # (mac/win koennen auf Linux nicht cross-gebaut werden -> build-native.* # auf dem jeweiligen OS laufen lassen, Ergebnis nach host-agent/dist/ legen) # # Eigener Tag-Namespace agent-v (kollidiert NICHT mit den # App-Tags v). # # Gitea-Zugang (GITEA_URL, GITEA_REPO, GITEA_USER) wird aus der Umgebung # oder aus host-agent/.env bzw. der Repo-Wurzel-.env gelesen; das Kennwort # wird interaktiv abgefragt. # ════════════════════════════════════════════════════════════════════ set -e cd "$(dirname "$0")" # host-agent/ SCRIPT_DIR="$(pwd)" ROOT_DIR="$(cd .. && pwd)" # ── Farben ─────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' # ── Parameter ──────────────────────────────────────────────────────── VERSION=${1:?"Usage: ./release_agent.sh (z.B. 0.2.0)"} TAG="agent-v$VERSION" # ── Gitea-Konfiguration (env > host-agent/.env > Repo-Wurzel-.env) ──── [ -f "$SCRIPT_DIR/.env" ] && source "$SCRIPT_DIR/.env" [ -f "$ROOT_DIR/.env" ] && source "$ROOT_DIR/.env" GITEA_URL="${GITEA_URL:?"GITEA_URL nicht gesetzt (in .env oder als Umgebungsvariable)"}" GITEA_REPO="${GITEA_REPO:?"GITEA_REPO nicht gesetzt (z.B. stefan/aria-agent)"}" GITEA_USER="${GITEA_USER:-$(echo "$GITEA_REPO" | cut -d'/' -f1)}" echo -e "${CYAN}╔═══════════════════════════════════════════╗${NC}" echo -e "${CYAN}║ ARIA Host-Agent Release — ${TAG}$(printf '%*s' $((14 - ${#TAG})) '')║${NC}" echo -e "${CYAN}╚═══════════════════════════════════════════╝${NC}\n" # ── Kennwort ───────────────────────────────────────────────────────── echo -e "${YELLOW}Gitea-Login: ${GITEA_USER}${NC}" read -s -p "Gitea-Kennwort: " GITEA_PASS; echo "" HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "${GITEA_USER}:${GITEA_PASS}" "$GITEA_URL/api/v1/user") if [ "$HTTP_CODE" != "200" ]; then echo -e "${RED}Login fehlgeschlagen (HTTP $HTTP_CODE). Kennwort korrekt?${NC}"; exit 1 fi echo -e " ${GREEN}✓${NC} Login erfolgreich\n" # ── Versionsnummern setzen ─────────────────────────────────────────── echo -e "${GREEN}[1/5] Version auf $VERSION setzen...${NC}" # Desktop-Agent sed -i "s/^AGENT_VERSION = \"[^\"]*\"/AGENT_VERSION = \"$VERSION\"/" host_agent.py echo -e " ${GREEN}✓${NC} host_agent.py → AGENT_VERSION $VERSION" # Android: versionName + versionCode (aus Version berechnen; 3- oder 4-stellig) IFS='.' read -ra VP <<< "$VERSION" V1=${VP[0]:-0}; V2=${VP[1]:-0}; V3=${VP[2]:-0}; V4=${VP[3]:-0} VERSION_CODE=$((V1 * 1000000 + V2 * 10000 + V3 * 100 + V4)); [ "$VERSION_CODE" -lt 1 ] && VERSION_CODE=1 sed -i "s/versionName '[^']*'/versionName '$VERSION'/" android/app/build.gradle sed -i "s/versionCode [0-9]*/versionCode $VERSION_CODE/" android/app/build.gradle echo -e " ${GREEN}✓${NC} android/app/build.gradle → versionName $VERSION, versionCode $VERSION_CODE\n" # ── Bauen (Docker) ─────────────────────────────────────────────────── echo -e "${GREEN}[2/5] Linux-Binary + Android-APK bauen (Docker)...${NC}" ./build.sh >/dev/null LINUX_BIN="$SCRIPT_DIR/dist/aria-host-agent" [ -f "$LINUX_BIN" ] || { echo -e "${RED}Linux-Binary fehlt: $LINUX_BIN${NC}"; exit 1; } echo -e " ${GREEN}✓${NC} Linux-Binary ($(du -h "$LINUX_BIN" | cut -f1))" ( cd android && ./build.sh >/dev/null ) APK="$SCRIPT_DIR/android/dist/aria-android-agent.apk" [ -f "$APK" ] || { echo -e "${RED}APK fehlt: $APK${NC}"; exit 1; } echo -e " ${GREEN}✓${NC} Android-APK ($(du -h "$APK" | cut -f1))\n" # Asset-Liste aufbauen: "lokaler_pfad::asset-name" ASSETS=( "$LINUX_BIN::aria-host-agent-linux-x64" "$APK::aria-host-agent-android-$TAG.apk" ) # Optionale, vorgebaute native Artefakte (nur wenn vorhanden): [ -f "$SCRIPT_DIR/dist/aria-host-agent-macos" ] && ASSETS+=("$SCRIPT_DIR/dist/aria-host-agent-macos::aria-host-agent-macos") [ -f "$SCRIPT_DIR/dist/aria-host-agent.exe" ] && ASSETS+=("$SCRIPT_DIR/dist/aria-host-agent.exe::aria-host-agent-windows.exe") [ -f "$SCRIPT_DIR/dist/aria-host-agent-setup.exe" ] && ASSETS+=("$SCRIPT_DIR/dist/aria-host-agent-setup.exe::aria-host-agent-setup.exe") # ── Git-Tag ────────────────────────────────────────────────────────── echo -e "${GREEN}[3/5] Git-Tag $TAG...${NC}" git add host_agent.py android/app/build.gradle git commit -m "release(agent): bump to $VERSION" 2>/dev/null || echo -e " ${YELLOW}Keine Aenderungen zum Committen${NC}" if git rev-parse "$TAG" &>/dev/null; then echo -e " ${YELLOW}Tag $TAG existiert bereits — überspringe${NC}" else git tag "$TAG"; echo -e " ${GREEN}✓${NC} Tag $TAG erstellt" fi git push origin main "$TAG" echo -e " ${GREEN}✓${NC} Tag gepusht\n" # ── Gitea-Release ──────────────────────────────────────────────────── echo -e "${GREEN}[4/5] Gitea-Release anlegen...${NC}" BODY="ARIA Host-Agent $TAG\n\nDesktop (Linux) + Android-APK. Auf das Zielgeraet kopieren, siehe README." BODY_JSON=$(printf '%s' "$BODY" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))' 2>/dev/null || printf '"%s"' "$BODY") RESP=$(curl -s -X POST "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases" \ -u "${GITEA_USER}:${GITEA_PASS}" -H "Content-Type: application/json" \ -d "{\"tag_name\":\"$TAG\",\"name\":\"Host-Agent $TAG\",\"body\":$BODY_JSON,\"draft\":false,\"prerelease\":false}") RELEASE_ID=$(echo "$RESP" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) if [ -z "$RELEASE_ID" ]; then echo -e "${RED}Release fehlgeschlagen:${NC}\n$RESP"; exit 1; fi echo -e " ${GREEN}✓${NC} Release #$RELEASE_ID erstellt\n" # ── Assets hochladen ───────────────────────────────────────────────── echo -e "${GREEN}[5/5] Assets hochladen (${#ASSETS[@]})...${NC}" for entry in "${ASSETS[@]}"; do path="${entry%%::*}"; name="${entry##*::}" UP=$(curl -s -X POST \ "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases/$RELEASE_ID/assets?name=$name" \ -u "${GITEA_USER}:${GITEA_PASS}" -F "attachment=@${path}") if echo "$UP" | grep -q '"name"'; then echo -e " ${GREEN}✓${NC} $name" else echo -e " ${RED}✗ $name fehlgeschlagen:${NC} $UP" fi done echo "" echo -e "${GREEN}╔═══════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ Host-Agent $TAG ist live!${NC}" echo -e "${GREEN}║${NC} $GITEA_URL/$GITEA_REPO/releases/tag/$TAG" echo -e "${GREEN}╚═══════════════════════════════════════════════════╝${NC}"