Pulls check that the debug app builds
MergedThis adds build.yml, which runs :app:assembleDebug and then :app:lintDebug on pushes to main and on pulls into it. The image, SDK setup, caches and triggers match test.yml, and I found nothing wrong in it.
Two things to know:
- Checks not finished: the
buildcheck was still running when I read it, andtestwas queued. Lint runs with no baseline, so any existing lint error on main will fail the first run. Check that run before merging. - Encoding flag:
test.ymlpasses-Dfile.encoding=UTF-8in its jvmargs and this workflow'sGRADLE_FLAGSdoesn't. That is probably harmless for assemble and lint. If the build shows encoding trouble, add the flag.
This adds build.yml, which runs :app:assembleDebug and then :app:lintDebug on pushes to main and on pulls into it. Compared with the last round, the lint step now prints the Error-severity findings from the XML report when lint fails, so a failure can be read from the log. I found nothing wrong with that.
My earlier note about -Dfile.encoding=UTF-8 is still open. It is probably harmless, so I'm not asking for it.
Both checks were still unfinished when I read them: build was running and test was queued. Lint has no baseline, so an existing lint error on main would fail the first run. Check that run before merging.
This round removes the lint step. Lint found 8 errors on main (MissingPermission, and seven ViewModelConstructorInComposable), so build.yml now only runs :app:assembleDebug, and a comment explains how to add lint back. I found nothing wrong with the workflow itself.
Two things before you merge:
- Stale title and body: both still say the workflow runs
:app:lintDebug, and the "Shortcomings" section still describes lint running with no baseline. Update them to say lint is left out until main passes it. - Checks not finished:
buildandtestwere both still queued when I read them. Confirm the assemble step passes.
My earlier note about -Dfile.encoding=UTF-8 is still open. It is probably harmless, so I'm not asking for it.
Title and body now say lint is left out, with its 8 errors. Checks at 4d22369: build passes in 5m16s, test passes. On -Dfile.encoding=UTF-8: left out on purpose. GRADLE_FLAGS is expanded unquoted, so a jvmargs value with a space in it would split into two arguments, and the build passed without it: Kotlin and AGP read sources as UTF-8 whatever the JVM default. If it is ever needed it belongs in gradle.properties for both workflows rather than here.

What changes
build.yml is a second workflow beside test.yml. It runs
:app:assembleDebugon pushes to main and on pulls into it. It uses test.yml's image, Android SDK setup, caches and Gradle memory settings, so the two share the SDK and Gradle caches and run as two jobs side by side.Why
test.yml already runs the JVM tests and the coverage gate, but nothing checked that the app still assembles. The debug build is signed with the SDK's debug key, so it needs no keystore and no secret. The release build stays out, as test.yml explains: R8 takes about an hour.
How it was checked
Only on the runner: nothing was built locally. At this head,
buildpasses in about 5 minutes (the debug build is 4m50s of it) andtestpasses beside it.Shortcomings
Android lint is left out.
:app:lintDebugfails on main as it is, with 8 errors and 106 warnings:MissingPermissionatdata/push/GrainMessagingService.kt:64(a call that needs a runtime permission without checking it or catchingSecurityException), and sevenViewModelConstructorInComposable("Constructing a view model in a composable"). It ran on an earlier head of this pull. Once those are fixed or put in a lint baseline, it is one more step after the build:./gradlew $GRADLE_FLAGS :app:lintDebug, as build.yml's header says.Instrumented tests (
app/src/androidTest) are not run: the runner has no emulator.The workflow runs on pushes to main and on pulls into main, the same as test.yml, not on pushes to every branch: a pull's branch would then run twice.
🤖 Generated with Claude Code