diff --git a/release.sh b/release.sh new file mode 100755 index 00000000..af6ac8d6 --- /dev/null +++ b/release.sh @@ -0,0 +1,245 @@ +#!/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_TOKEN Umgebungsvariable oder ~/.gitea-token Datei +# +# 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-Token laden +# ============================================================ + +if [ -z "$GITEA_TOKEN" ]; then + if [ -f "$HOME/.gitea-token" ]; then + GITEA_TOKEN=$(cat "$HOME/.gitea-token" | tr -d '[:space:]') + else + echo "Fehler: Kein Gitea-Token gefunden." + echo "Setze GITEA_TOKEN Umgebungsvariable oder erstelle ~/.gitea-token" + echo "" + echo "Token erstellen: ${GITEA_URL}/user/settings/applications" + exit 1 + fi +fi + +# ============================================================ +# 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 +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" +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 \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -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 \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -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 ""