#!/bin/bash # ════════════════════════════════════════════════ # ARIA — Release Script # Baut APK, taggt, erstellt Gitea Release # Verwendung: ./release.sh 1.2.0 # Gitea-Kennwort wird interaktiv abgefragt. # ════════════════════════════════════════════════ set -e # ── 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.sh (z.B. 1.2.0)"} TAG="v$VERSION" # ── Gitea-Konfiguration ────────────────────── # Aus .env lesen falls vorhanden (GITEA_URL, GITEA_REPO, GITEA_USER) if [ -f .env ]; then source .env fi 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 Release — ${TAG}$(printf '%*s' $((19 - ${#TAG})) '')║${NC}" echo -e "${CYAN}╚═══════════════════════════════════════╝${NC}" echo "" # ── Kennwort abfragen ───────────────────────── echo -e "${YELLOW}Gitea-Login: ${GITEA_USER}${NC}" read -s -p "Gitea-Kennwort: " GITEA_PASS echo "" # Credentials testen 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" echo "" # ── Versionsnummern aktualisieren ───────────── echo -e "${GREEN}[1/5] Versionsnummern auf $VERSION setzen...${NC}" # package.json sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" android/package.json echo -e " ${GREEN}✓${NC} package.json → $VERSION" # build.gradle: versionName + versionCode (aus Version berechnen) # Unterstuetzt 3-stellig (1.2.3) und 4-stellig (0.0.1.7) IFS='.' read -ra VER_PARTS <<< "$VERSION" V1=${VER_PARTS[0]:-0}; V2=${VER_PARTS[1]:-0}; V3=${VER_PARTS[2]:-0}; V4=${VER_PARTS[3]:-0} VERSION_CODE=$((V1 * 1000000 + V2 * 10000 + V3 * 100 + V4)) # Mindestens 1 (Android erfordert versionCode >= 1) [ "$VERSION_CODE" -lt 1 ] && VERSION_CODE=1 sed -i "s/versionName \"[^\"]*\"/versionName \"$VERSION\"/" android/android/app/build.gradle sed -i "s/versionCode [0-9]*/versionCode $VERSION_CODE/" android/android/app/build.gradle echo -e " ${GREEN}✓${NC} build.gradle → versionName $VERSION, versionCode $VERSION_CODE" # SettingsScreen: Anzeige-Version (beliebiges Versionsformat) sed -i "s/Version [0-9][0-9.]*[^<]*/Version $VERSION /" android/src/screens/SettingsScreen.tsx echo -e " ${GREEN}✓${NC} SettingsScreen → Version $VERSION" echo "" # ── APK bauen ───────────────────────────────── echo -e "${GREEN}[2/5] APK bauen (Cache leeren + Build)...${NC}" cd android # Metro + Gradle Cache leeren damit neue Version sauber eingebettet wird rm -rf node_modules/.cache 2>/dev/null cd android && ./gradlew clean 2>/dev/null; cd .. ./build.sh release cd .. APK_PATH="android/ARIA-Cockpit-release.apk" if [ ! -f "$APK_PATH" ]; then echo -e "${RED}APK nicht gefunden: $APK_PATH${NC}" echo -e "${RED}Build fehlgeschlagen.${NC}" exit 1 fi APK_NAME="ARIA-${TAG}.apk" APK_SIZE=$(du -h "$APK_PATH" | cut -f1) echo -e " ${GREEN}✓${NC} APK gebaut ($APK_SIZE)" echo "" # ── Git Tag ─────────────────────────────────── echo -e "${GREEN}[3/5] Git Tag $TAG...${NC}" # Versions-Aenderungen committen git add android/package.json android/android/app/build.gradle android/src/screens/SettingsScreen.tsx git commit -m "release: bump version 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" echo "" # ── Release Notes aus CHANGELOG.md lesen ────── RELEASE_BODY="ARIA Android App $TAG" CHANGELOG_FILE="$SCRIPT_DIR/CHANGELOG.md" if [ -f "$CHANGELOG_FILE" ]; then # Abschnitt für diese Version extrahieren (zwischen ## [version] Zeilen) SECTION=$(sed -n "/^## \[$VERSION\]/,/^## \[/p" "$CHANGELOG_FILE" | head -n -1) if [ -n "$SECTION" ]; then RELEASE_BODY="$SECTION" echo -e " ${GREEN}✓${NC} Release Notes aus CHANGELOG.md gelesen" else echo -e " ${YELLOW}Kein Eintrag für [$VERSION] in CHANGELOG.md — verwende Standard-Text${NC}" fi fi # JSON-Escape: Newlines und Anführungszeichen escapen RELEASE_BODY_ESCAPED=$(printf '%s' "$RELEASE_BODY" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))' 2>/dev/null || printf '"%s"' "$RELEASE_BODY" | sed 's/"/\\"/g') # ── Gitea Release erstellen ─────────────────── echo -e "${GREEN}[4/5] Gitea Release erstellen...${NC}" RELEASE_RESPONSE=$(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\": \"ARIA $TAG\", \"body\": $RELEASE_BODY_ESCAPED, \"draft\": false, \"prerelease\": false }") RELEASE_ID=$(echo "$RELEASE_RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) if [ -z "$RELEASE_ID" ]; then echo -e "${RED}Release konnte nicht erstellt werden:${NC}" echo "$RELEASE_RESPONSE" exit 1 fi echo -e " ${GREEN}✓${NC} Release #$RELEASE_ID erstellt" echo "" # ── APK hochladen ───────────────────────────── echo -e "${GREEN}[5/5] APK hochladen...${NC}" UPLOAD_RESPONSE=$(curl -s -X POST \ "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases/$RELEASE_ID/assets?name=$APK_NAME" \ -u "${GITEA_USER}:${GITEA_PASS}" \ -F "attachment=@${APK_PATH};type=application/vnd.android.package-archive") if echo "$UPLOAD_RESPONSE" | grep -q '"name"'; then echo -e " ${GREEN}✓${NC} $APK_NAME hochgeladen" else echo -e "${RED}Upload fehlgeschlagen:${NC}" echo "$UPLOAD_RESPONSE" exit 1 fi # ── Auto-Update: APK auf RVS-Server kopieren ─ RVS_UPDATE_HOST="${RVS_UPDATE_HOST:-}" if [ -n "$RVS_UPDATE_HOST" ]; then echo -e "${GREEN}[6/6] APK auf RVS-Server kopieren (Auto-Update)...${NC}" # Alte APKs auf dem RVS loeschen, dann neue hochladen ssh "$RVS_UPDATE_HOST" "rm -f ~/ARIA-AGENT/rvs/updates/ARIA-*.apk" 2>/dev/null scp "$APK_PATH" "${RVS_UPDATE_HOST}:~/ARIA-AGENT/rvs/updates/${APK_NAME}" 2>/dev/null if [ $? -eq 0 ]; then echo -e " ${GREEN}✓${NC} APK auf RVS-Server kopiert (alte Versionen geloescht)" else echo -e " ${YELLOW}APK konnte nicht auf RVS kopiert werden (RVS_UPDATE_HOST=$RVS_UPDATE_HOST)${NC}" echo -e " ${YELLOW}Manuell: scp $APK_PATH $RVS_UPDATE_HOST:~/ARIA-AGENT/rvs/updates/${APK_NAME}${NC}" fi else echo -e "${YELLOW}Auto-Update uebersprungen (RVS_UPDATE_HOST nicht gesetzt)${NC}" echo -e "${YELLOW}Setze RVS_UPDATE_HOST in .env fuer automatische Verteilung${NC}" fi # ── Fertig ──────────────────────────────────── echo "" echo -e "${GREEN}╔═══════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ Release $TAG ist live!$(printf '%*s' $((27 - ${#TAG})) '')║${NC}" echo -e "${GREEN}╠═══════════════════════════════════════════════════╣${NC}" echo -e "${GREEN}║${NC} $GITEA_URL/$GITEA_REPO/releases/tag/$TAG" echo -e "${GREEN}║${NC} APK: $APK_NAME ($APK_SIZE)" echo -e "${GREEN}║${NC} Auto-Update: ${RVS_UPDATE_HOST:-nicht konfiguriert}" echo -e "${GREEN}╚═══════════════════════════════════════════════════╝${NC}"