With --paginate, gh runs the jq aggregation per page and concatenates, so
sort_by | last ran per-page and extra workflow_dispatch runs could push past
per_page=100 and emit two URLs — which would break the curl download.
The artifacts API returns results newest-first, so the most recent marker is
always on page 1. Drop --paginate and take first(non-expired), which emits
exactly one URL (or none) by construction.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
setGitHubOutput.sh derives the build number from `eas build:version:get`,
which reads EAS's remote counter. A --local build doesn't advance that
counter, but use-build-number-with-bump bakes counter+1 into the IPA — so
the queried number can be one less than what actually lands in App Store
Connect. That made distribute_only poll for a nonexistent build and would
have announced the wrong number in Slack.
Read CFBundleVersion straight from the built IPA instead, which is the
value uploaded to ASC. Repoint the fastlane assignment, the workflow_call
build-number output, and the production Slack message at it.
Android's version code has the same drift source but is display-only there
(no version-code lookup gates submission), so it's left as-is.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
cut -c1-3900 caps each line independently, so a busy nightly window could
still exceed Apple's 4000-char "What to Test" limit (and flood Slack). Use
head -c 3900 to cap the combined changelog stream.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The release notes, commit marker, and Slack alerts are nightly-specific, so
move them out of the build workflows and into nightly-build.yml:
- prepare job reads the previous nightly-build-commit artifact and generates
the shared changelog once
- iOS/Android builds run in parallel, consuming the notes (iOS via a new
releaseNotes input); both expose version/build outputs via workflow_call
- per-platform Slack jobs post the notes with that platform's version
- record job advances the marker only after both builds succeed, so a failed
night's commits roll into the next successful nightly's notes
Also harden the TestFlight key cleanup with a trap ... EXIT so the App Store
Connect private key is removed even if fastlane exits non-zero under bash -e.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
After a nightly iOS build is assigned to the QA Team TestFlight group, post
the generated changelog to the nightly builds Slack channel via the
NIGHTLY_BUILDS_SLACK_WEBHOOK secret. The payload is built with jq so the
multi-line notes are safely JSON-encoded.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Generate the changelog from commits since the last nightly and pass it to
fastlane's upload_to_testflight changelog. The previous nightly's commit
SHA is stored as a dedicated nightly-build-commit artifact (independent of
the most-recent-testflight-commit cache), so the range is nightly-to-nightly.
Falls back to the last 30 commits when no prior marker is found.
Requires actions: read on the job to query past artifacts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a scheduled workflow (2:10 AM UTC, after the nightly i18n job) that
builds both platforms via reusable workflow_call triggers:
- Android: testflight-android profile, producing an Internal release
- iOS: testflight profile, then assigns the build to the "QA Team"
TestFlight group via fastlane (distribute_only)
Adds workflow_call triggers + an assignTestFlightGroup input to the iOS
workflow. Assigning to a TestFlight group requires App Store Connect API
key secrets (ASC_KEY_ID, ASC_ISSUER_ID, ASC_KEY_P8_BASE64), which still
need to be added to the repo.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>