forked from fritob/Camper-Monitor
Zwei Dinge in einem Commit, weil sie sich dieselben Dateien teilen: project.pbxproj und WatchRootView.swift tragen beides. **Komplikation.** Neues Target CamperMonitorComplication, auf watchOS sind Komplikationen WidgetKit-Widgets. Es wird in die Watch-App eingebettet (PlugIns) und bietet die vier Zubehör-Familien an. Ein Tipp öffnet die App direkt auf der Nivellierung statt in der Geräteliste: Die Komplikation hängt eine Adresse an, die Watch-App führt dafür jetzt einen Navigationsweg, den sie von aussen setzen kann. Die Adresse steht in Shared/WatchDeepLink.swift, weil beide Seiten sie brauchen – ein Tippfehler auf einer Seite bliebe sonst stumm. Bewusst ohne Messwert: Eine Komplikation läuft in einem eigenen Prozess und käme an die Werte nur über eine App-Gruppe, und die verlangt eine bezahlte Mitgliedschaft. Ein Wert, der beim Blick aufs Zifferblatt Stunden alt sein kann, wäre ohnehin schlimmer als keiner – man glaubt ihm. Die Komplikation tut deshalb genau eine Sache, und die zuverlässig. **Rebranding.** Der sichtbare Name ist überall VanControl Pro: CFBundleDisplayName beider Apple-Targets, Android-Label, die Texte in beiden Apps, beide READMEs und der Name der APK im Gitea-Ablauf. Die Kennungen bleiben, wie sie sind – Bundle-IDs, Android-Paket, Target-, Ordner- und Schemanamen. Eine geänderte Bundle-ID ist für iOS eine neue App: Geräte, Fahrzeugprofile und Victron-Schlüssel wären weg, dazu neue Profile und eine neu zu koppelnde Watch-App. Sichtbar ist davon nichts, also gibt es dafür auch keinen Grund. Geprüft: alle drei Apple-Targets bauen, die Erweiterung liegt im Watch-Bundle unter PlugIns, die Anzeigenamen stimmen im gebauten Bundle, Tests grün. Die neue Bundle-ID der Erweiterung braucht beim ersten Lauf aus Xcode ein Profil, das Xcode selbst anlegt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
95 lines
3.4 KiB
YAML
95 lines
3.4 KiB
YAML
# 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 \
|
||
"../VanControlPro-$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=@VanControlPro-$VERSION.apk" \
|
||
"$API/$ID/assets?name=VanControlPro-$VERSION.apk" > /dev/null
|
||
|
||
echo "VanControlPro-$VERSION.apk hängt an Release $GITHUB_REF_NAME."
|