31ad650329
android / Build + lint + test (push) Successful in 4m54s
Previous design: android.yml's release job and release.yml ran in parallel on every tag push. release.yml polled the gitea release- download URL for up to 15 min waiting for the APK to appear. In practice the polling step was completing in 11s — either following a gitea redirect to a 200 page and writing HTML into the bundled APK file, or returning empty content silently. Either way the resulting image shipped without a working APK and the web Settings page's in-app-update section never rendered. Fix the race architecturally: - Move the signed-release-build + Attach-APK steps out of android.yml and into a new android-release job in release.yml. - release.yml's image-release job declares needs: [android-release], so on tag pushes the image cannot start building until the APK is guaranteed-attached. - Pass the APK between jobs via actions/upload-artifact@v3 + download-artifact@v3 (the v2 backend isn't supported on Gitea). This removes the polling loop entirely — the image-release job just downloads the artifact, renames to minstrel.apk, writes the .version sidecar, and continues to docker buildx. - For main pushes android-release is skipped via its if: condition. image-release uses so it still runs (the skipped predecessor doesn't poison the chain) and the download/stage steps gate themselves on the tag context. Main images ship without an APK by design, same as before. android.yml is now testing-only: lint + detekt + unit tests on every push, debug APK artifact on main. Independent of release CI as requested.
90 lines
3.1 KiB
YAML
90 lines
3.1 KiB
YAML
name: android
|
|
|
|
# Native Android (Kotlin/Compose/Media3) — M8 rewrite, now the only client.
|
|
# This workflow is testing only — lint + detekt + unit tests on every push
|
|
# to dev/main, plus a debug APK artifact for main. The signed-release
|
|
# build + asset attach + image-bundling lives in release.yml under a
|
|
# `needs:` chain so the docker image cannot ship without the APK.
|
|
|
|
on:
|
|
push:
|
|
branches: [main, dev]
|
|
paths:
|
|
- 'android/**'
|
|
- '.gitea/workflows/android.yml'
|
|
|
|
# pull_request trigger intentionally omitted — see test-web.yml for
|
|
# the rationale (single-author repo, push covers PR-merge equivalent).
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
# Silences the JDK 22+ "restricted method in java.lang.System has been
|
|
# called" warning that Gradle 9.1's bundled native-platform jar trips
|
|
# at launch (System.load for native primitives). Affects the LAUNCHER
|
|
# JVM, not the daemon — that's why org.gradle.jvmargs in
|
|
# gradle.properties isn't enough. Future-compat: required opt-in once
|
|
# JDK 25 promotes the warning to an error.
|
|
JAVA_TOOL_OPTIONS: "--enable-native-access=ALL-UNNAMED"
|
|
|
|
jobs:
|
|
build:
|
|
name: Build + lint + test
|
|
# Using flutter-ci runner label because it's the only proven-working
|
|
# label with docker that can pull our container.image. Switch to
|
|
# android-ci once the operator registers that runner label.
|
|
runs-on: flutter-ci
|
|
container:
|
|
image: git.fabledsword.com/bvandeusen/ci-android:36
|
|
|
|
defaults:
|
|
run:
|
|
working-directory: android
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Cache Gradle dirs
|
|
# Resolved deps + Gradle distribution + Kotlin daemon caches.
|
|
# Saves ~3 min per CI run after the first warm-up.
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.gradle/caches
|
|
~/.gradle/wrapper
|
|
~/.kotlin
|
|
key: gradle-${{ runner.os }}-${{ hashFiles('android/gradle/wrapper/gradle-wrapper.properties', 'android/gradle/libs.versions.toml', 'android/**/*.gradle.kts') }}
|
|
restore-keys: |
|
|
gradle-${{ runner.os }}-
|
|
|
|
- name: Make gradlew executable
|
|
run: chmod +x ./gradlew
|
|
|
|
- name: Gradle wrapper validation
|
|
run: ./gradlew --version
|
|
|
|
- name: ktlint
|
|
run: ./gradlew ktlintCheck
|
|
|
|
- name: detekt
|
|
run: ./gradlew detekt
|
|
|
|
- name: Unit tests
|
|
run: ./gradlew testDebugUnitTest
|
|
|
|
- name: Assemble debug
|
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
run: ./gradlew assembleDebug
|
|
|
|
- name: Upload debug APK
|
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
# Gitea Actions runs in GHES-emulation mode; @actions/artifact v2+
|
|
# (i.e. upload-artifact@v4+) errors with "GHESNotSupportedError".
|
|
# Pin to @v3 until act_runner or the artifact backend catches up.
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: minstrel-android-debug-${{ github.sha }}
|
|
path: android/app/build/outputs/apk/debug/app-debug.apk
|