mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 19:11:08 +00:00
## Summary Follow-up to #1412, focused on repeat work observed in completed CI logs. - Give APK compilation and Android tests the same build-label and API-key inputs. Previously `generateReleaseBuildConfig` changed between invocations and caused Kotlin/Java recompilation before tests. - Continue executing the Android test suite on every CI run: disable reuse of the test task's results in CI while retaining compilation caching. Keep the existing heap and process isolation settings. - Cache the four remote checksum-pinned model/AAR downloads used by add-on packs. Hash-check every cache hit, atomically replace corrupt entries only after a verified download, and verify the destination bytes. Packs are still regenerated from current prepared components and their checksums remain part of the APK. - Bound download time and retry connection resets as well as HTTP errors; keep checksum mismatches fatal. - Include the pack recipes in runtime source freshness checks. - Restrict PR report updates to the workflow bot's own marker comment, addressing the minor extraction review finding from #1412. ## Evidence and validation The previous successful run explicitly recorded changed `BuildConfig.java` as the reason for repeated Kotlin/Java compilation between assembly and tests. The final #1412 normal run spent 38 seconds building/downloading packs, 5m59s building the APK, and 3m03s in the Android test step. A forced run also hit a connection reset while fetching pack inputs and passed on retry. Focused tests cover cold/warm input reuse, corrupt-cache repair, changed-pin invalidation, rejected download bytes, actual local HTTP connection failure/retry, identical build metadata and bot-only comment selection. Actionlint passed. The clean Linux full suite passed 1,149 tests (18 skipped) before the final Gradle test-execution policy block. Host, APK/ABI and Android checks are green on the final head, including the ordinary PR run against the updated main branch and both controlled branch attempts below. Validation will compare cold and warm runs on the same commit, confirm cache-hit hash verification, confirm app compilation remains up-to-date in the test invocation, and confirm the Android suite actually executes on both runs. Source-tree, preload, APK/ABI, all-test, signing and publishing gates remain. Existing Gradle, CMake and Cargo caching remains. Native compilation was tens of seconds in the inspected baseline; no speculative native cache changes or unmeasured speed claim are included. Android test execution itself was about 2m30s; this PR removes avoidable setup/recompilation rather than weakening coverage or changing concurrency. ## Follow-up correction The first CI run failed two artwork-key tests that assumed the compiled-in API key was empty. Keeping build inputs consistent exposed that assumption. Tests now check the configured build key and its trimmed fallback after clearing a user key; existing pure-function empty-key and precedence coverage remains. No key values are included in assertion messages. The failed run confirmed BuildConfig generation and Kotlin/Java compilation were UP-TO-DATE in the test invocation; subsequent full runs passed. The merged #1412 main run40007656633 passed signing, pack publishing, preview announcement and catalog updates. ## Gradle cache audit fixes Completed-run logs showed setup-gradle was read-only on PRs. Same-repository PRs and branch runs can now persist their own cache entries; fork PRs remain read-only. GitHub cache ref isolation is retained. See [Gradle cache guidance](https://github.com/gradle/actions/blob/main/docs/setup-gradle.md) and [GitHub cache scopes](https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching). PR caches consume additional shared quota; no claim of reuse between different PR refs is made. COMMIT_TIME now comes from SOURCE_COMMIT, matching the provenance field and avoiding timestamp changes from temporary PR merge commits. The source tree and pack validation remain unchanged. This enables a meaningful same-commit warm check. Per-commit generated Java metadata may still cause cross-commit recompilation; moving metadata into packaged data is a separate candidate, not part of this patch. Head9835c4e3passed full CI and the same-commit warm rerun below. ## Confirmed final results Both controlled runs use exactly9835c4e3e1and workflow_dispatch, avoiding PR merge-tree changes between attempts. | Measurement | First attempt | Warm attempt | Reduction | | --- | ---: | ---: | ---: | | Request to required gate green | 13m09s | 7m11s | 5m58s (45%) | | Gradle APK build step | 6m11s | 2m08s | 4m03s (66%) | | Android test step | 2m57s | 2m08s | 49s | | Add-on pack build step | 40s | 31s | 9s | [First attempt](https://github.com/Droid-Deck/DroidDeck/actions/runs/40015059221/attempts/1) and [warm attempt](https://github.com/Droid-Deck/DroidDeck/actions/runs/40015059221/attempts/2) both passed. Initial queue delay was 3 seconds in each. This is one observed pair, not a guaranteed latency or isolated attribution of every timing difference to cache changes. The first attempt already had some dependency/build cache reuse. Warm logs confirm the exact head's Gradle-home cache restored; release Kotlin and Java compilation were FROM-CACHE during assembly, then UP-TO-DATE during tests. Assembly reported 22 tasks FROM-CACHE. The Android test executor actually ran; test results were neither cached nor skipped. All four remote pack input hits were hash-verified; packs were regenerated. Runtime inputs and APK native exports/dependencies verified. The ordinary [PR workflow](https://github.com/Droid-Deck/DroidDeck/actions/runs/40013127993/attempts/2) also passed against the updated main merge tree. A fresh Gradle daemon and "no cached configuration" remain expected on a new runner: configuration/task-graph persistence is distinct from build-output caching and currently has no configured encryption key. The measured Kotlin/Java FROM-CACHE results demonstrate output reuse despite that message. This proves same-commit warm reuse. New pushes can still invalidate compilation through changed source, toolchain, generated provenance or pack metadata, and cache eviction/ref scope can cause misses. Cross-commit compilation reuse is not established by this pair. Branch validation intentionally skips main-only publishing; merged #1412's main run40007656633 separately passed signing and publication. The user authorized merging after the final cache-recovery correction passed. ## Final cache-recovery correction Commitc95e1147addresses the remaining minor review finding: after a download passes its SHA check, an unexpected directory at the exact hash-named cache entry is removed before the verified file is promoted. Invalid downloads leave that directory untouched. A regression test covers failed verification, successful repair and subsequent warm reuse. All five focused download tests passed in a clean Linux export. All final-head PR checks passed in [run40018498031](https://github.com/Droid-Deck/DroidDeck/actions/runs/40018498031): host suite ran 1,164 tests (49 platform skips), APK build and native validation passed, Android tests executed successfully, and the source/build validation status is green. Benchmark results above remain measurements of9835c4e3.