AINFRA-2488 Add TV parity to Android CI and releases - #5682
Conversation
|
Claude finished @iangmaia's task in 4m 30s —— View job Code review
The change is well-scoped and internally consistent — TV slots into the existing three-form-factor abstractions rather than bolting on a parallel path, and the plumbing this depends on is already in place. I verified the pieces that could silently produce wrong artifacts:
I could not run the verification commands from the testing instructions — Findings1.
2.
3.
4. Parity gap not covered: merged-manifest diff · That script runs 5. Minor / informational
No security concerns: no new secrets, credentials, or endpoints; the TV |
Generated by 🚫 Danger |
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
| APPS_TV = 'tv' | ||
| APPS_WEAR = 'wear' | ||
| APPS = [APPS_APP, APPS_AUTOMOTIVE, APPS_WEAR].freeze | ||
| APPS = [APPS_APP, APPS_AUTOMOTIVE, APPS_TV, APPS_WEAR].freeze |
There was a problem hiding this comment.
Consider putting TV last in APPS rather than third.
build_and_upload_to_play_store iterates APPS with no per-app rescue (unlike update_rollouts, which tolerates missing variants). Every step inside the loop can hard-fail for a brand-new form factor:
upload_to_play_store(track: 'tv:beta')→ fails if the TV track doesn't exist yet in Play Consoledownload_universal_apk_from_google_play(version_code: <build_code + 150_000>)→ fails if Play hasn't produced a universal APK for that TV version code- Play's TV-specific listing/asset validation
With TV inserted at index 2, any of those aborts the lane before wear is built or uploaded, and create_gh_release never runs — so a TV-only problem regresses two already-shipping form factors and the whole GitHub release. Appending TV keeps the failure at the tail:
| APPS = [APPS_APP, APPS_AUTOMOTIVE, APPS_TV, APPS_WEAR].freeze | |
| APPS = [APPS_APP, APPS_AUTOMOTIVE, APPS_WEAR, APPS_TV].freeze |
(Order is irrelevant for update_rollouts, so nothing else changes.)
| PLAY_STORE_TRACK_TV_BETA = 'tv:beta' | ||
| PLAY_STORE_TRACK_TV_PRODUCTION = 'tv:production' |
There was a problem hiding this comment.
Please confirm these track identifiers against the actual Play Console before the next release build.
wear:* and automotive:* are known-good form-factor track names, but I couldn't verify tv:beta / tv:production from here (no network access in this environment). A wrong identifier here is not a soft failure: upload_to_play_store raises, and per the ordering issue above it would abort mid-release with app/automotive already uploaded as drafts.
Two things worth checking:
- The exact form-factor prefix Google uses for Android TV in the Publishing API.
- That the track actually exists in Play Console for
au.com.shiftyjelly.pocketcasts— form-factor tracks have to be created there first; the API won't create them on upload.
A quick way to confirm both:
bundle exec fastlane run google_play_track_version_codes \
package_name:au.com.shiftyjelly.pocketcasts track:tv:beta \
json_key:google-upload-credentials.json| ./gradlew :automotive:lintRelease :tv:lintRelease :wear:lintRelease | ||
| other_apps_lint_exit_code=$? |
There was a problem hiding this comment.
Suggest --continue here now that three modules share one invocation.
abortOnError = true is set globally (build.gradle.kts:251), so the first module whose lint fails stops the invocation and the remaining lintRelease tasks never run. Their SARIF files are then never generated, and the corresponding upload_sarif_to_github calls at lines 31–32 silently upload nothing — so a TV lint error hides the wear report, and an automotive error hides both.
That's exactly the failure mode the comment on line 16 works around for :app:. It existed with two modules, but TV is a new module with a near-empty baseline (tv/lint-baseline.xml is 191 bytes) and it now sits before wear in the task list, so it's more likely to bite.
| ./gradlew :automotive:lintRelease :tv:lintRelease :wear:lintRelease | |
| other_apps_lint_exit_code=$? | |
| ./gradlew --continue :automotive:lintRelease :tv:lintRelease :wear:lintRelease | |
| other_apps_lint_exit_code=$? |
--continue still yields a non-zero exit code, so lint_exit_code handling below is unaffected — you just get all four reports uploaded on a failing run.
| - "**/build/instrumented-tests/**/*" | ||
|
|
||
| - group: "Assemble release APKs" | ||
| - group: "Assemble Mobile, Automotive, TV, and Wear release APKs" |
There was a problem hiding this comment.
Nit: enumerating form factors in the group label means editing it for every new one (and it now says "Mobile" while the step below says "app"). Something like "Assemble release APKs (all form factors)" stays accurate on its own. Non-blocking either way.
|
Version |
Fixes AINFRA-2488
Description
Adds Android TV in CI and release automation so TV artifacts are validated, distributed and rolled out with the main app, Automotive, and Wear.
Testing Instructions
bundle exec rubocop fastlane/Fastfileand./gradlew spotlessCheck../gradlew :tv:testDebugUnitTest../gradlew :app:lintRelease :automotive:lintRelease :tv:lintRelease :wear:lintRelease../gradlew :tv:assembleRelease -PIS_TV_BUILD=true -PskipSentryProguardMappingUpload=true.bundle exec fastlane build_bundle app:tvand confirm the TV AAB uses the expected version suffix and code offset.📺 TVprototype link.Screenshots or Screencast
Not applicable — this PR does not change UI.
Checklist
./gradlew spotlessApplyto automatically apply formatting/linting)modules/services/localization/src/main/res/values/strings.xml