name: Build and Release APK # Production-channel build. Runs on a push to main, or by hand # (workflow_dispatch), and publishes to this Gitea instance's releases — which # is the channel the in-app updater reads. See docs/CI.md. # # Publishing goes through Gitea's REST API rather than the `gh` CLI, which a # runner image need not carry. on: push: branches: [ main ] workflow_dispatch: # Needed by the job token to create the release and attach the APK. permissions: contents: write # Don't let two pushes to main race on the same release. concurrency: group: release-${{ github.ref }} cancel-in-progress: false jobs: build: name: Build APK and publish release # workflow_dispatch can be aimed at any branch from the Actions UI. The # production stamp belongs to main alone — anything else is a no-op rather # than shipping unreviewed code to everybody. if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest env: # Stamps the APK as a production-channel build. PLG_CHANNEL: production steps: - name: Checkout uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: temurin java-version: '17' cache: gradle - name: Set up Android SDK uses: android-actions/setup-android@v4 - name: Build production APK run: ./gradlew assembleDebug --no-daemon --stacktrace - name: Stage APK id: stage run: | set -euo pipefail # The series and the offset come from gradle.properties, which is # the same file the build read when it stamped the APK — so the tag # and what is inside it cannot name different versions. The number # is run number + offset, exactly the arithmetic build.gradle.kts # did for versionCode. series="$(sed -n 's/^plgVersionSeries=//p' gradle.properties)" offset="$(sed -n 's/^plgVersionRunOffset=//p' gradle.properties)" test -n "$series" test -n "$offset" stamp="$(( ${{ github.run_number }} + offset ))" version="v${series}.${stamp}" src="app/build/outputs/apk/debug/app-debug.apk" dest="PilgrimsOfKatan-${version}.apk" cp "$src" "$dest" echo "version=$version" >> "$GITHUB_OUTPUT" echo "apk=$dest" >> "$GITHUB_OUTPUT" - name: Upload APK as workflow artifact uses: actions/upload-artifact@v4 with: name: PilgrimsOfKatan-apk path: ${{ steps.stage.outputs.apk }} if-no-files-found: error - name: Publish production release env: # The job's built-in token: contents: write is declared above. GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} RELEASE_TAG: ${{ steps.stage.outputs.version }} RELEASE_APK: ${{ steps.stage.outputs.apk }} RELEASE_KIND: release RELEASE_TARGET: ${{ github.sha }} # One script, also runnable by hand — see docs/CI.md. run: ./scripts/publish-release.sh