#!/bin/bash # # Release-Script fuer Starface Outlook Sync # # Aktualisiert Versionsnummer, baut die App, erstellt den Installer # und laedt das Release auf Gitea hoch. # # Voraussetzungen: # - .NET 8 SDK (dotnet) # - Docker (fuer Inno Setup) # - curl (fuer Gitea API) # - Gitea-Zugangsdaten (werden beim Start abgefragt) # # Verwendung: # ./release.sh 0.1.0.0 # ./release.sh 0.1.0.0 "Erster Beta-Release" set -e # ============================================================ # Konfiguration # ============================================================ GITEA_URL="https://git.hacker-net.de" REPO_OWNER="Hacker-Software" REPO_NAME="starface-outlook-sync-addin" DOTNET_PATH="${DOTNET_PATH:-$HOME/.dotnet}" PROJECT="src/StarfaceOutlookSync/StarfaceOutlookSync.csproj" ABOUT_FORM="src/StarfaceOutlookSync/UI/AboutForm.cs" INNO_SCRIPT="installer/setup.iss" DIST_DIR="dist" # ============================================================ # Argumente pruefen # ============================================================ VERSION="${1}" RELEASE_NOTE="${2:-Release v${VERSION}}" if [ -z "$VERSION" ]; then echo "Verwendung: $0 [release-beschreibung]" echo "Beispiel: $0 0.1.0.0 \"Erster Beta-Release\"" echo "" echo "Aktuelle Version in .csproj:" grep '' "$PROJECT" | head -1 | sed 's/.*/ /;s/<.*//' exit 1 fi # Versionsformat pruefen (x.x.x.x) if ! echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'; then echo "Fehler: Version muss im Format x.x.x.x sein (z.B. 0.1.0.0)" exit 1 fi # ============================================================ # Gitea-Zugangsdaten abfragen # ============================================================ read -p "Gitea Benutzername: " GITEA_USER read -s -p "Gitea Kennwort: " GITEA_PASS echo "" if [ -z "$GITEA_USER" ] || [ -z "$GITEA_PASS" ]; then echo "Fehler: Benutzername und Kennwort erforderlich." exit 1 fi GITEA_AUTH="${GITEA_USER}:${GITEA_PASS}" # ============================================================ # Tools pruefen # ============================================================ export PATH="$DOTNET_PATH:$PATH" echo "=== Starface Outlook Sync - Release v${VERSION} ===" echo "" echo "[1/7] Pruefe Voraussetzungen..." if ! command -v dotnet &> /dev/null; then echo " Fehler: dotnet nicht gefunden." echo " Install: wget https://dot.net/v1/dotnet-install.sh -O- | bash /dev/stdin --channel 8.0" exit 1 fi echo " dotnet $(dotnet --version)" if ! command -v docker &> /dev/null; then echo " Fehler: docker nicht gefunden." echo " Install: https://docs.docker.com/engine/install/debian/" exit 1 fi echo " docker $(docker --version | cut -d' ' -f3 | tr -d ',')" if ! command -v curl &> /dev/null; then echo " Fehler: curl nicht gefunden." exit 1 fi # Pruefen ob Git sauber ist if [ -n "$(git status --porcelain)" ]; then echo "" echo " Warnung: Uncommitted changes vorhanden!" git status --short echo "" read -p " Trotzdem fortfahren? (j/n) " -n 1 -r echo "" if [[ ! $REPLY =~ ^[jJyY]$ ]]; then exit 1 fi fi # ============================================================ # Versionsnummern aktualisieren # ============================================================ echo "" echo "[2/7] Aktualisiere Versionsnummer auf ${VERSION}..." # .csproj sed -i "s|.*|${VERSION}|g" "$PROJECT" sed -i "s|.*|${VERSION}|g" "$PROJECT" sed -i "s|.*|${VERSION}|g" "$PROJECT" # AboutForm.cs - nur den Text im String-Literal ersetzen, nicht Variablennamen sed -i "s|\"Version [0-9.]*\"|\"Version ${VERSION}\"|g" "$ABOUT_FORM" # Inno Setup sed -i "s|#define MyAppVersion \".*\"|#define MyAppVersion \"${VERSION}\"|g" "$INNO_SCRIPT" echo " .csproj, AboutForm.cs, setup.iss aktualisiert." # ============================================================ # Bauen # ============================================================ echo "" echo "[3/7] Baue Release..." dotnet build "$PROJECT" -c Release --nologo -v quiet echo " Build erfolgreich." # ============================================================ # Installer erstellen # ============================================================ echo "" echo "[4/7] Erstelle Installer mit Docker..." mkdir -p "$DIST_DIR" sudo docker run --rm -v "$PWD:/work" amake/innosetup "$INNO_SCRIPT" SETUP_FILE="${DIST_DIR}/StarfaceOutlookSync_Setup_${VERSION}.exe" if [ ! -f "$SETUP_FILE" ]; then echo " Fehler: Setup-Datei nicht gefunden: $SETUP_FILE" exit 1 fi SETUP_SIZE=$(du -h "$SETUP_FILE" | cut -f1) echo " Installer erstellt: $SETUP_FILE ($SETUP_SIZE)" # ============================================================ # Git Commit + Tag # ============================================================ echo "" echo "[5/7] Git Commit und Tag..." git add "$PROJECT" "$ABOUT_FORM" "$INNO_SCRIPT" git commit -m "Release v${VERSION}" --allow-empty git tag -a "v${VERSION}" -m "Release v${VERSION}" echo " Commit und Tag v${VERSION} erstellt." # ============================================================ # Git Push # ============================================================ echo "" echo "[6/7] Push zu Gitea..." git push origin main git push origin "v${VERSION}" echo " Push erfolgreich." # ============================================================ # Gitea Release erstellen # ============================================================ echo "" echo "[7/7] Erstelle Gitea Release..." API_URL="${GITEA_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}" # Release erstellen RELEASE_RESPONSE=$(curl -s -X POST \ -u "${GITEA_AUTH}" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"v${VERSION}\", \"name\": \"v${VERSION}\", \"body\": \"${RELEASE_NOTE}\", \"draft\": false, \"prerelease\": false }" \ "${API_URL}/releases") RELEASE_ID=$(echo "$RELEASE_RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) if [ -z "$RELEASE_ID" ]; then echo " Fehler beim Erstellen des Release:" echo " $RELEASE_RESPONSE" exit 1 fi echo " Release erstellt (ID: $RELEASE_ID)" # Setup-EXE als Attachment hochladen echo " Lade Installer hoch..." UPLOAD_RESPONSE=$(curl -s -X POST \ -u "${GITEA_AUTH}" \ -F "attachment=@${SETUP_FILE}" \ "${API_URL}/releases/${RELEASE_ID}/assets?name=$(basename $SETUP_FILE)") ASSET_URL=$(echo "$UPLOAD_RESPONSE" | grep -o '"browser_download_url":"[^"]*"' | cut -d'"' -f4) if [ -z "$ASSET_URL" ]; then echo " Warnung: Upload-Antwort:" echo " $UPLOAD_RESPONSE" else echo " Upload erfolgreich: $ASSET_URL" fi # ============================================================ # Zusammenfassung # ============================================================ echo "" echo "=== Release v${VERSION} abgeschlossen ===" echo "" echo " Release: ${GITEA_URL}/${REPO_OWNER}/${REPO_NAME}/releases/tag/v${VERSION}" echo " Installer: $SETUP_FILE ($SETUP_SIZE)" echo " Tag: v${VERSION}" echo ""