The architectural fix you flagged. android.yml's release job and release.yml were racing on every tag push, with release.yml supposed to poll-and-wait for the APK to appear on the gitea Release page. In practice the poll step was completing in 11 seconds — either following a redirect to a 200 page and writing HTML into the bundled APK, or returning empty silently. Either way the image shipped without a working APK and the Settings download section never rendered.
Architectural fix:
The signed-release build moves into a new android-release job inside 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-ready.
APK passes between jobs via actions/upload-artifact@v3 + download-artifact@v3 — no polling, no release-API roundtrip, no silent-failure mode.
Main pushes still work: android-release is skipped (its if is false) and image-release runs with if: !failure() && !cancelled() so the skipped predecessor doesn't poison the chain.
android.yml is now testing-only as you requested: lint + detekt + unit tests on every push, debug APK upload on main. Independent of the release CI.
After merge I'll force-move v2026.06.01 to the new HEAD and we should finally get a clean :v2026.06.01 + :latest with the APK actually bundled.
The architectural fix you flagged. android.yml's release job and release.yml were racing on every tag push, with release.yml supposed to poll-and-wait for the APK to appear on the gitea Release page. In practice the poll step was completing in 11 seconds — either following a redirect to a 200 page and writing HTML into the bundled APK, or returning empty silently. Either way the image shipped without a working APK and the Settings download section never rendered.
Architectural fix:
- The signed-release build moves into a new `android-release` job inside `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-ready.
- APK passes between jobs via `actions/upload-artifact@v3` + `download-artifact@v3` — no polling, no release-API roundtrip, no silent-failure mode.
- Main pushes still work: `android-release` is skipped (its `if` is false) and `image-release` runs with `if: !failure() && !cancelled()` so the skipped predecessor doesn't poison the chain.
`android.yml` is now testing-only as you requested: lint + detekt + unit tests on every push, debug APK upload on main. Independent of the release CI.
After merge I'll force-move `v2026.06.01` to the new HEAD and we should finally get a clean `:v2026.06.01` + `:latest` with the APK actually bundled.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The architectural fix you flagged. android.yml's release job and release.yml were racing on every tag push, with release.yml supposed to poll-and-wait for the APK to appear on the gitea Release page. In practice the poll step was completing in 11 seconds — either following a redirect to a 200 page and writing HTML into the bundled APK, or returning empty silently. Either way the image shipped without a working APK and the Settings download section never rendered.
Architectural fix:
android-releasejob insiderelease.yml.release.yml'simage-releasejob declaresneeds: [android-release], so on tag pushes the image cannot start building until the APK is guaranteed-ready.actions/upload-artifact@v3+download-artifact@v3— no polling, no release-API roundtrip, no silent-failure mode.android-releaseis skipped (itsifis false) andimage-releaseruns withif: !failure() && !cancelled()so the skipped predecessor doesn't poison the chain.android.ymlis now testing-only as you requested: lint + detekt + unit tests on every push, debug APK upload on main. Independent of the release CI.After merge I'll force-move
v2026.06.01to the new HEAD and we should finally get a clean:v2026.06.01+:latestwith the APK actually bundled.