#!/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 (Version automatisch +1) # ./release_agent.sh 0.1.0.0 (Version selbst setzen) # # 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 ──────────────────────────────────────────────────────── # Ohne Angabe: letzte Stelle automatisch hochzaehlen. Mit Angabe: genau diese. # Naechste Version: hoechste aus Datei-Version und letztem Git-Tag, dann wie # ein Kilometerzaehler +1: hintere Stellen laufen 0..9 und uebertragen nach # vorne (0.2.6.9 → 0.2.7.0, 0.2.9.9 → 0.3.0.0), die vorderste zaehlt einfach # weiter (9.9.9.9 → 10.0.0.0). Aufruf: next_version next_version() { local cur="$1" prefix="$2" tagv best tagv=$(git tag -l "${prefix}*" | sed "s/^${prefix}//" | grep -E '^[0-9]+(\.[0-9]+)+$' | sort -V | tail -1) best=$(printf '%s\n%s\n' "$cur" "$tagv" | grep -E '^[0-9]+(\.[0-9]+)+$' | sort -V | tail -1) [ -z "$best" ] && best="0.0.0.0" awk -F. -v OFS=. '{ for (i = NF; i >= 1; i--) { if (i == 1 || $i < 9) { $i = $i + 1; break } $i = 0 # 9 → 0, Uebertrag nach vorne } print }' <<< "$best" } CURRENT=$(grep -m1 "versionName" android/app/build.gradle | sed -E "s/.*versionName '([^']*)'.*/\1/") VERSION=${1:-$(next_version "$CURRENT" "agent-v")} if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+)+$ ]]; then echo -e "${RED}Ungueltige Version: $VERSION (z.B. 0.0.1.7)${NC}"; exit 1 fi TAG="agent-v$VERSION" if git rev-parse "$TAG" &>/dev/null; then echo -e "${RED}Tag $TAG gibt es schon — andere Version angeben.${NC}"; exit 1 fi echo -e "${CYAN}Agent-Version: $CURRENT → ${GREEN}$VERSION${NC}" read -p "Release $VERSION bauen? [J/n] " OK [[ "$OK" =~ ^[nN] ]] && { echo "Abgebrochen."; exit 0; } # ── 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))" # Linux-Paket: Binary + Dienst-Installer + Unit + .env-Vorlage in EINER Zip — # entpacken, .env anlegen, optional als Dienst installieren. LINUX_PKG_NAME="aria-host-agent-linux-x64-v$VERSION" LINUX_ZIP="$SCRIPT_DIR/dist/$LINUX_PKG_NAME.zip" PKG_TMP="$(mktemp -d)" mkdir -p "$PKG_TMP/$LINUX_PKG_NAME" install -m 0755 "$LINUX_BIN" "$PKG_TMP/$LINUX_PKG_NAME/aria-host-agent" install -m 0755 install-service.sh "$PKG_TMP/$LINUX_PKG_NAME/install-service.sh" install -m 0644 aria-host-agent.service "$PKG_TMP/$LINUX_PKG_NAME/aria-host-agent.service" install -m 0644 .env.example "$PKG_TMP/$LINUX_PKG_NAME/.env.example" cat > "$PKG_TMP/$LINUX_PKG_NAME/LIESMICH.txt" </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))" # Windows (.exe + setup.exe) via Wine im Docker. Dauert (pywine-Image ~1-2 GB) — # mit SKIP_WINDOWS=1 ./release_agent.sh ueberspringbar. if [ "${SKIP_WINDOWS:-0}" = "1" ]; then echo -e " ${YELLOW}Windows-Build uebersprungen (SKIP_WINDOWS=1)${NC}" else echo -e " ${CYAN}…${NC} Windows-.exe + setup.exe bauen (Wine, kann dauern)" WIN_LOG="$SCRIPT_DIR/dist/build-win.log" if ./build-win.sh "$VERSION" >"$WIN_LOG" 2>&1; then echo -e " ${GREEN}✓${NC} Windows-.exe + setup.exe" else echo -e " ${YELLOW}Windows-Build fehlgeschlagen — Release laeuft ohne Windows weiter.${NC}" echo -e " ${YELLOW}Letzte Zeilen (ganzes Log: $WIN_LOG):${NC}" tail -n 8 "$WIN_LOG" | sed 's/^/ /' fi fi echo "" # Asset-Liste aufbauen: "lokaler_pfad::asset-name" ASSETS=( "$LINUX_ZIP::$LINUX_PKG_NAME.zip" "$APK::aria-host-agent-android-$TAG.apk" ) # Native Artefakte (nur wenn vorhanden): Windows aus build-win.sh, macOS # vorgebaut (build-native.sh auf einem Mac -> dist/aria-host-agent-macos legen). [ -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-windows-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=$(printf 'ARIA Host-Agent %s\n\nDesktop (Linux) + Android-APK. Auf das Zielgeraet kopieren, siehe README.' "$TAG") 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 # ── Auto-Update: Android-APK auf den RVS (eigener Ordner updates/agent/) ── RVS_UPDATE_HOST="${RVS_UPDATE_HOST:-}" if [ -n "$RVS_UPDATE_HOST" ]; then echo -e "\n${GREEN}[+] Android-APK auf den RVS kopieren (Auto-Update)...${NC}" if ssh "$RVS_UPDATE_HOST" "mkdir -p ~/ARIA-AGENT/rvs/updates/agent && rm -f ~/ARIA-AGENT/rvs/updates/agent/*.apk" 2>/dev/null \ && scp "$APK" "${RVS_UPDATE_HOST}:~/ARIA-AGENT/rvs/updates/agent/aria-host-agent-v${VERSION}.apk" 2>/dev/null; then echo -e " ${GREEN}✓${NC} Agents bekommen v$VERSION beim naechsten Verbinden angeboten" else echo -e " ${YELLOW}Kopieren fehlgeschlagen (RVS_UPDATE_HOST=$RVS_UPDATE_HOST). Manuell:${NC}" echo -e " ${YELLOW}scp $APK $RVS_UPDATE_HOST:~/ARIA-AGENT/rvs/updates/agent/aria-host-agent-v${VERSION}.apk${NC}" fi else echo -e "\n${YELLOW}Auto-Update uebersprungen (RVS_UPDATE_HOST nicht gesetzt)${NC}" fi 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}"