diff --git a/Android/RELEASE.md b/Android/RELEASE.md index 324f0b1..08b8dd2 100644 --- a/Android/RELEASE.md +++ b/Android/RELEASE.md @@ -52,6 +52,61 @@ keyPassword=DEIN_PASSWORT > die App installiert haben, nie wieder ein Update ausliefern. Eine Kopie an > einen zweiten Ort, getrennt vom Rechner. +## Wenn Gitea die APK nicht annimmt + +Zwei Dinge, die leicht zusammenfallen: + +**Der Quelltext als `.zip` und `.tar.gz`** hängt an *jedem* Gitea-Release +automatisch dran. Gitea erzeugt beides aus dem Etikett; es ist nichts, was +versehentlich hochgeladen wurde, und es lässt sich auch nicht abschalten. Es +stört nur optisch und kostet keinen Speicher — die Archive werden erst beim +Anklicken erzeugt. + +**Die APK abgelehnt** wird dagegen aus einem handfesten Grund: Gitea nimmt nur +Dateitypen an, die in seiner Liste stehen, und `.apk` steht dort nicht. Die +Liste dieser Instanz lässt sich abfragen: + +```bash +curl -s https://git.home.fritob.de/api/v1/settings/attachment +``` + +Kommt dort eine `allowed_types`-Liste ohne `.apk` zurück, ist das die Ursache. +Die Grösse ist es nicht — die Grenze liegt bei 100 MiB, die APK bei 11. + +### Der richtige Weg: `.apk` erlauben + +In der `app.ini` des Servers (bei Docker meist +`/data/gitea/conf/app.ini`, sonst `/etc/gitea/app.ini`): + +```ini +[attachment] +ALLOWED_TYPES = .avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip,.apk + +[repository.release] +ALLOWED_TYPES = .apk,.zip +``` + +Beide Abschnitte, weil je nach Gitea-Fassung mal der eine, mal der andere für +Release-Anhänge zuständig ist. Danach Gitea neu starten. + +Wer es sich einfach machen will, schreibt in beide Schlüssel `*/*` — dann ist +alles erlaubt. Auf einer Instanz im eigenen Netz ist das vertretbar; öffentlich +wäre es das nicht, weil dann auch beliebige ausführbare Dateien hochladbar sind. + +### Ohne Serverzugriff: die Paket-Registry + +Die nimmt beliebige Dateien an, ganz ohne Typenliste, und ist auf dieser +Instanz eingeschaltet. Der Preis: Die Datei landet unter *Packages* statt am +Release. + +```bash +Android/upload-package.sh 1.0.0 +``` + +Das Skript liest den Zugangsschlüssel aus `~/.gitea-token` und gibt ihn +nirgends aus. Ein Token mit dem Recht `write:package` genügt; anzulegen unter +*Einstellungen → Anwendungen → Zugriffstoken*. + ## Von Hand veröffentlichen ```bash diff --git a/Android/upload-package.sh b/Android/upload-package.sh new file mode 100755 index 0000000..13169d6 --- /dev/null +++ b/Android/upload-package.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# Lädt die gebaute APK in Gitas Paket-Registry. +# +# Der Weg über die Registry umgeht die Typenliste für Release-Anhänge, die +# `.apk` nicht enthält. Siehe RELEASE.md. +# +# Android/upload-package.sh 1.0.0 +set -euo pipefail + +VERSION="${1:?Aufruf: upload-package.sh , z. B. 1.0.0}" +SERVER="${GITEA_SERVER:-https://git.home.fritob.de}" +OWNER="${GITEA_OWNER:-fritob}" +TOKEN_FILE="${GITEA_TOKEN_FILE:-$HOME/.gitea-token}" + +APK="$(dirname "$0")/app/build/outputs/apk/release/app-release.apk" +[ -f "$APK" ] || { + echo "Keine APK gefunden. Erst bauen:" >&2 + echo " source Android/env.sh && cd Android && ./gradlew :app:assembleRelease -PversionName=$VERSION" >&2 + exit 1 +} +[ -f "$TOKEN_FILE" ] || { + echo "Kein Zugangsschlüssel in $TOKEN_FILE." >&2 + echo "In Gitea unter Einstellungen -> Anwendungen einen mit 'write:package' anlegen," >&2 + echo "dann: printf %s 'DEIN_TOKEN' > $TOKEN_FILE && chmod 600 $TOKEN_FILE" >&2 + exit 1 +} + +NAME="CamperMonitor-$VERSION.apk" +URL="$SERVER/api/packages/$OWNER/generic/camper-monitor/$VERSION/$NAME" + +# Der Schlüssel geht nur an curl und steht nirgends in der Ausgabe. +CODE="$(curl -s -o /dev/null -w '%{http_code}' \ + -H "Authorization: token $(cat "$TOKEN_FILE")" \ + --upload-file "$APK" "$URL")" + +case "$CODE" in + 201) echo "Hochgeladen: $URL" ;; + 409) echo "Version $VERSION liegt dort schon. Erst löschen oder Version erhöhen." >&2; exit 1 ;; + 401|403) echo "Abgelehnt (HTTP $CODE) - fehlt dem Token das Recht 'write:package'?" >&2; exit 1 ;; + *) echo "Fehlgeschlagen, HTTP $CODE" >&2; exit 1 ;; +esac