Skip to content

[fix] a release that cannot reach Play fails instead of reporting success - #276

Merged
YJack0000 merged 1 commit into
mainfrom
fix/play-upload-required
Aug 20, 2026
Merged

[fix] a release that cannot reach Play fails instead of reporting success#276
YJack0000 merged 1 commit into
mainfrom
fix/play-upload-required

Conversation

@YJack0000

Copy link
Copy Markdown
Contributor

What this changes

android-release.yml now fails when it cannot reach Play, instead of skipping the upload and reporting success. Adds android/scripts/create-play-service-account.sh for the half of the setup that has an API.

Why

The skip was conditioned on PLAY_SERVICE_ACCOUNT_JSON being unset, and that was defensible for exactly as long as the secret could not exist — the Play Developer API is gated behind a verified developer account, and 6541030546953107772 was pending verification when the workflow was written.

Verification cleared on 2026-08-17. What is left is a release job that goes green without publishing:

tag used up ✓ · GitHub release created ✓ · .aab signed and attached ✓ · on Play ✗

Nobody finds out until someone asks where the build went. android-v0.1.0 is that run — green, and not on Play.

before after
secret missing upload skipped, run green run fails, error names the fix
first bundle for the package (Play refuses over the API) indistinguishable from the above explicit skip_play_upload=true on a manual run
skipped run's visibility one ::notice:: in the log step-summary block + ::warning:: annotation

Skipping is now something an operator asks for, not something a missing secret decides quietly.

inputs.skip_play_upload is null on a tag push, so !inputs.skip_play_upload is true there — tags always have to publish, and only workflow_dispatch can opt out.

The script

gcloud auth login (as the Play account owner) then:

./android/scripts/create-play-service-account.sh

Creates the pathors-play project, enables androidpublisher, creates parley-play-publisher with no project-level IAM roles (everything it may do is granted in the Play Console instead), mints a JSON key, gh secret sets it, files it in patchbay, and deletes the local copy. Idempotent — re-running reuses the project and account and only mints a fresh key.

Two steps have no API and the script prints them rather than pretending otherwise: linking the Cloud project to the Play account is what enables the Play Developer API, so it cannot go through the API it enables, and the Release manager grant lives on the same Console page.

How it was verified

  • bunx tsc --noEmit passes
  • bunx vitest run passes
  • Workflow parses as YAML; workflow_dispatch inputs are tag, skip_play_upload
  • bash -n on the script, and ran it — it stops at the first gate (the gcloud token for … is stale — run: gcloud auth login), which is the current state of this machine's logins
  • Ran the app — CI and tooling only
  • Added or updated tests — n/a
  • Added new user-facing strings — n/a

The upload path itself is still unproven, because the service account does not exist yet — that is the point of the error this PR adds.

Docs

§7 and the secrets table said "blocked on verification", which has not been true since 2026-08-17.

…cess

`android-release.yml` skipped its Play upload whenever
`PLAY_SERVICE_ACCOUNT_JSON` was unset. That was defensible exactly as long as
the secret could not exist: the Play Developer API is gated behind a verified
developer account, and account 6541030546953107772 was pending verification
when the workflow was written.

Verification cleared on 2026-08-17, so the condition is gone and what is left
is a workflow that goes green without publishing anything. That is the worst
shape a release job can have — the tag is used up, the GitHub release exists,
the `.aab` is signed and attached, and the only thing missing is the one thing
the job is for. Nobody finds out until somebody asks where the build went, and
`android-v0.1.0` is exactly that: green, and not on Play.

A missing secret is now a hard error naming the fix. The one case that
genuinely cannot use the API — the first bundle for a package, which Play
refuses until a release exists in the console — becomes an explicit
`skip_play_upload` input on a manual run, so skipping is something an operator
asks for rather than something a missing secret decides quietly. That path
writes to the step summary and raises a warning annotation, because the run is
green and the summary is the only place that can say the build is not on Play.

Also adds `android/scripts/create-play-service-account.sh`, which does the
whole Cloud half — project, `androidpublisher`, service account with no
project-level IAM roles, JSON key, `gh secret set`, patchbay, and deleting the
local copy — idempotently, and prints the two steps that have no API behind
them. Linking a Cloud project to a Play account is what *enables* the Play
Developer API, so it cannot go through the API it enables; that and the
Release manager grant stay Play Console web UI.

RELEASING.md's §7 and the secrets table said "blocked on verification", which
has not been true since 2026-08-17.
@YJack0000
YJack0000 merged commit e3b5a2e into main Aug 20, 2026
3 checks passed
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant