Files
BiasFandClaude Opus 5 3f37e6f047 Android: Release-Build signieren und veröffentlichen
Der Release-Build lieferte bisher app-release-unsigned.apk - und die
installiert Android nicht, auch nicht per Sideload. Ohne Signatur kann das
System nicht feststellen, ob ein Update vom selben Absender stammt wie die
Erstinstallation; das ist unabhängig davon, woher die Datei kommt.

Der Build signiert jetzt. Liegt Android/keystore.properties vor, mit dem
eigenen Schlüssel; sonst wird aus der Umgebung gelesen, damit ein Bauknecht
sie aus seinen Geheimnissen setzen kann, ohne dass ein Passwort im Verlauf
landet. Fehlt beides, wird mit dem Debug-Schlüssel signiert - der Build
sagt das dann deutlich, denn eine so signierte Release-APK sieht sonst aus
wie eine richtige, lässt sich aber vom nächsten Rechner aus nicht mehr
aktualisieren. Schlüssel und Passwörter sind ausgeschlossen.

Version und Versionszähler lassen sich beim Bauen setzen, damit sie aus
einem Etikett kommen können.

Dazu ein Ablauf für Gitea Actions: ein Etikett hochschieben baut die APK,
legt das Release an, falls es noch nicht besteht, und hängt sie an. Beides
muss gehen - sonst scheitert es je nachdem, ob man das Release vorher von
Hand angelegt hat.

Android/RELEASE.md erklärt beide Wege und sagt auch, warum die APK nicht
ins Repository gehört: Release-Anhänge liegen in Gitea neben dem
Repository. Eine 11-MB-Binärdatei je Version im Verlauf wäre unwiderruflich
- Git vergisst nichts, ein späteres Löschen bringt den Platz nicht zurück.

Geprüft: die signierte APK installiert sich im Emulator, meldet sich mit
der übergebenen Version und trägt keine Debug-Kennzeichnung mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 11:49:07 +02:00

95 lines
3.4 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Baut die Android-APK und hängt sie an ein Gitea-Release.
#
# Ausgelöst durch ein Etikett der Form v1.2.3. Voraussetzungen und die
# Einrichtung der Geheimnisse stehen in Android/RELEASE.md.
name: APK veröffentlichen
on:
push:
tags:
- "v*"
jobs:
apk:
runs-on: ubuntu-latest
steps:
- name: Quelltext holen
uses: actions/checkout@v4
with:
# Der Versionszähler kommt aus der Anzahl der Commits; dafür wird
# der ganze Verlauf gebraucht, nicht nur der letzte Stand.
fetch-depth: 0
- name: Java einrichten
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Android SDK einrichten
uses: android-actions/setup-android@v3
- name: Signaturschlüssel bereitlegen
env:
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
run: |
# Ohne hinterlegten Schlüssel wird mit dem Debug-Schlüssel signiert.
# Der Build sagt das selbst deutlich; hier nur der Hinweis im Protokoll.
if [ -z "$KEYSTORE_BASE64" ]; then
echo "Kein Schlüssel hinterlegt es wird mit dem Debug-Schlüssel signiert."
exit 0
fi
echo "$KEYSTORE_BASE64" | base64 -d > "$RUNNER_TEMP/release.jks"
echo "KEYSTORE_FILE=$RUNNER_TEMP/release.jks" >> "$GITHUB_ENV"
- name: APK bauen
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
VERSION="${GITHUB_REF_NAME#v}"
# Die Anzahl der Commits steigt verlässlich und erfüllt damit, was
# Android vom Versionszähler verlangt: er darf nie kleiner werden.
CODE="$(git rev-list --count HEAD)"
echo "Version $VERSION (Zähler $CODE)"
cd Android
chmod +x gradlew
./gradlew :app:assembleRelease \
-PversionName="$VERSION" \
-PversionCode="$CODE" --no-daemon
mv app/build/outputs/apk/release/app-release.apk \
"../CamperMonitor-$VERSION.apk"
- name: An das Release hängen
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -eu
VERSION="${GITHUB_REF_NAME#v}"
API="$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases"
AUTH="Authorization: token $TOKEN"
# Wurde das Release schon von Hand angelegt, wird es genommen;
# sonst hier erzeugt. Beides muss gehen, sonst scheitert der Ablauf
# je nachdem, in welcher Reihenfolge man vorgeht.
ID="$(curl -sf -H "$AUTH" "$API/tags/$GITHUB_REF_NAME" \
| sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1 || true)"
if [ -z "$ID" ]; then
ID="$(curl -sf -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d "{\"tag_name\":\"$GITHUB_REF_NAME\",\"name\":\"$GITHUB_REF_NAME\"}" \
"$API" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1)"
fi
if [ -z "$ID" ]; then
echo "Release konnte weder gefunden noch angelegt werden." >&2
exit 1
fi
curl -sf -X POST -H "$AUTH" \
-F "attachment=@CamperMonitor-$VERSION.apk" \
"$API/$ID/assets?name=CamperMonitor-$VERSION.apk" > /dev/null
echo "CamperMonitor-$VERSION.apk hängt an Release $GITHUB_REF_NAME."