From 3647d25be2045b39a2d959f0cbf82626743793b1 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Sun, 19 Jul 2026 13:38:12 -0500 Subject: [PATCH 1/2] ci(android): fix CI runner (JDK/SDK/gradlew) + variant test PR #2 merged the M0 scaffold with the initial CI, which fails on this self-hosted runner. Fix forward: - JDK 17 via apt (openjdk-17-jdk-headless) + JAVA_HOME, replacing actions/setup-java: the runner can't resolve api.adoptium.net (EAI_AGAIN). - Explicit `sdkmanager` install of platform-tools + platforms;android-35 + build-tools;35.0.0 so the build never relies on AGP auto-download. - `chmod +x ./gradlew` in the run step (and set the 100755 git bit): this runner's checkout drops file modes, so `./gradlew` alone hit "Permission denied" (exit 126). - ScaffoldSanityTest: drop the BuildConfig.DEBUG assertion, which fails under testReleaseUnitTest (the `test` task runs both variants); assert VERSION_NAME. - Remove the redundant android:label on MainActivity (RedundantLabel lint). Verified locally against the Android Studio SDK (platform 35 + build-tools 35.0.0): `./gradlew lint test assembleDebug` passes and builds a debug APK. Co-Authored-By: Claude --- .gitea/workflows/pr-checks.yml | 36 +++++++++++-------- app/src/main/AndroidManifest.xml | 1 - .../runicgateway/app/ScaffoldSanityTest.kt | 8 +++-- gradlew | 0 4 files changed, 27 insertions(+), 18 deletions(-) mode change 100644 => 100755 gradlew diff --git a/.gitea/workflows/pr-checks.yml b/.gitea/workflows/pr-checks.yml index bdb2815..2e4b7f8 100644 --- a/.gitea/workflows/pr-checks.yml +++ b/.gitea/workflows/pr-checks.yml @@ -8,10 +8,13 @@ # * Enable Status Check # * Status check patterns: PR Checks / * # -# Runner: the org's self-hosted `ubuntu-latest`, on a bare `ubuntu:latest` -# container that lacks git/curl/unzip (needed by checkout + sdkmanager) -- so the -# first step installs them. (Faster later: switch to a prebuilt Android-SDK -# container image so nothing installs per-run.) +# Runner: the org's self-hosted `ubuntu-latest`. The container lacks +# git/curl/unzip (needed by checkout + sdkmanager), so the first step installs +# them. It also installs JDK 17 from the Ubuntu archive rather than using +# actions/setup-java, because this runner can't resolve api.adoptium.net (that +# download fails with EAI_AGAIN) while the Ubuntu mirrors are reachable. +# (Faster later: switch to a prebuilt Android-SDK+JDK container image so nothing +# installs per-run.) name: PR Checks @@ -27,23 +30,24 @@ jobs: android-build: runs-on: ubuntu-latest steps: - # Bare ubuntu:latest is missing the tools checkout + the SDK installer need. - - name: Install base tools + # Install the tools checkout + the SDK installer need, plus JDK 17 (see the + # header note on why we avoid actions/setup-java on this runner). + - name: Install base tools + JDK 17 run: | apt-get update - apt-get install -y git curl unzip + apt-get install -y git curl unzip openjdk-17-jdk-headless + echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> "$GITHUB_ENV" - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - name: Set up Android SDK uses: android-actions/setup-android@v3 + # Install exactly what the build targets so it never depends on AGP's + # build-time auto-download. `yes |` accepts any license prompts. + - name: Install Android SDK packages + run: yes | sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" + - name: Cache Gradle uses: actions/cache@v4 with: @@ -54,5 +58,9 @@ jobs: restore-keys: | gradle-${{ runner.os }}- + # chmod defensively: this runner's checkout doesn't preserve the git + # executable bit, so `./gradlew` alone fails with "Permission denied". - name: Lint, test, assemble debug - run: ./gradlew --no-daemon lint test assembleDebug + run: | + chmod +x ./gradlew + ./gradlew --no-daemon lint test assembleDebug diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 209e0ea..c107df1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,6 @@ diff --git a/app/src/test/java/com/runicgateway/app/ScaffoldSanityTest.kt b/app/src/test/java/com/runicgateway/app/ScaffoldSanityTest.kt index 0210009..9a49730 100644 --- a/app/src/test/java/com/runicgateway/app/ScaffoldSanityTest.kt +++ b/app/src/test/java/com/runicgateway/app/ScaffoldSanityTest.kt @@ -10,6 +10,9 @@ import org.junit.Test /** * Placeholder JVM unit test so the `test` CI gate has something to run in M0. * Real repository / view-model tests arrive with the functional pass (M1+). + * + * Assertions must be variant-agnostic: the `test` task runs both the debug and + * release unit-test variants, so nothing here may depend on `BuildConfig.DEBUG`. */ class ScaffoldSanityTest { @Test @@ -18,8 +21,7 @@ class ScaffoldSanityTest { } @Test - fun buildConfigIsDebuggableInTest() { - // Unit tests run against the debug variant. - assertTrue(BuildConfig.DEBUG) + fun versionNameIsSet() { + assertTrue(BuildConfig.VERSION_NAME.isNotBlank()) } } diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 -- 2.49.1 From e7149806006c504fbf283f587515b1aee60f9f24 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Sun, 19 Jul 2026 13:43:31 -0500 Subject: [PATCH 2/2] ci(android): stop yes|sdkmanager SIGPIPE from failing the step The SDK install succeeds (reaches 100% unzip) but the step reported exit 141: with -o pipefail, 'yes' dying of SIGPIPE (128+13) once sdkmanager closes the pipe poisons the pipeline status. Disable pipefail for that line so only sdkmanager's exit gates success. Co-Authored-By: Claude --- .gitea/workflows/pr-checks.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/pr-checks.yml b/.gitea/workflows/pr-checks.yml index 2e4b7f8..8917e43 100644 --- a/.gitea/workflows/pr-checks.yml +++ b/.gitea/workflows/pr-checks.yml @@ -44,9 +44,14 @@ jobs: uses: android-actions/setup-android@v3 # Install exactly what the build targets so it never depends on AGP's - # build-time auto-download. `yes |` accepts any license prompts. + # build-time auto-download. `yes |` accepts any license prompts; `set + # +o pipefail` so `yes` dying with SIGPIPE (exit 141) once sdkmanager + # closes the pipe doesn't fail the step -- sdkmanager's own exit, last in + # the pipeline, still gates success. - name: Install Android SDK packages - run: yes | sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" + run: | + set +o pipefail + yes | sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" - name: Cache Gradle uses: actions/cache@v4 -- 2.49.1