# 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."