Enter build numbers manually for production OTA deploys (#11289)
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,14 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
description: Runtime version (in x.x.x format) that this update is for
|
description: Runtime version (in x.x.x format) that this update is for
|
||||||
required: true
|
required: true
|
||||||
|
iosBuildNumber:
|
||||||
|
type: string
|
||||||
|
description: iOS build number of the native build this update targets
|
||||||
|
(required for production)
|
||||||
|
androidVersionCode:
|
||||||
|
type: string
|
||||||
|
description: Android version code of the native build this update
|
||||||
|
targets (required for production)
|
||||||
|
|
||||||
# Deploys happen via EAS using EXPO_TOKEN; the GITHUB_TOKEN only checks out code
|
# Deploys happen via EAS using EXPO_TOKEN; the GITHUB_TOKEN only checks out code
|
||||||
permissions:
|
permissions:
|
||||||
@@ -61,9 +69,22 @@ jobs:
|
|||||||
RUNTIME_VERSION: ${{ inputs.runtimeVersion }}
|
RUNTIME_VERSION: ${{ inputs.runtimeVersion }}
|
||||||
if: ${{ inputs.runtimeVersion }}
|
if: ${{ inputs.runtimeVersion }}
|
||||||
run: |
|
run: |
|
||||||
if [ -z "$RUNTIME_VERSION" ]; then
|
[[ "$RUNTIME_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "Version is valid" || exit 1
|
||||||
[[ "$RUNTIME_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "Version is valid" || exit 1
|
|
||||||
fi
|
# Production OTAs are bound to the specific native build they target, so
|
||||||
|
# the build numbers must be entered manually rather than read from the
|
||||||
|
# global EAS counters, which advance with every testflight build and so
|
||||||
|
# point past older production releases
|
||||||
|
- name: 🧐 Validate build numbers
|
||||||
|
if: ${{ inputs.channel == 'production' }}
|
||||||
|
env:
|
||||||
|
IOS_BUILD_NUMBER: ${{ inputs.iosBuildNumber }}
|
||||||
|
ANDROID_VERSION_CODE: ${{ inputs.androidVersionCode }}
|
||||||
|
run: |
|
||||||
|
[[ "$IOS_BUILD_NUMBER" =~ ^[0-9]+$ ]] ||
|
||||||
|
(echo "A numeric iosBuildNumber is required for production updates" && exit 1)
|
||||||
|
[[ "$ANDROID_VERSION_CODE" =~ ^[0-9]+$ ]] ||
|
||||||
|
(echo "A numeric androidVersionCode is required for production updates" && exit 1)
|
||||||
|
|
||||||
- name: ⬇️ Checkout
|
- name: ⬇️ Checkout
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
@@ -253,6 +274,10 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
RUNTIME_VERSION: ${{ inputs.runtimeVersion }}
|
RUNTIME_VERSION: ${{ inputs.runtimeVersion }}
|
||||||
CHANNEL_NAME: ${{ inputs.channel || 'testflight' }}
|
CHANNEL_NAME: ${{ inputs.channel || 'testflight' }}
|
||||||
|
# When set (required for production), these take precedence over the
|
||||||
|
# global EAS counters inside the use-build-number wrapper
|
||||||
|
BSKY_IOS_BUILD_NUMBER: ${{ inputs.iosBuildNumber }}
|
||||||
|
BSKY_ANDROID_VERSION_CODE: ${{ inputs.androidVersionCode }}
|
||||||
|
|
||||||
- name: 📦 Package Bundle and 🚀 Deploy (legacy ota1)
|
- name: 📦 Package Bundle and 🚀 Deploy (legacy ota1)
|
||||||
if: ${{ !steps.fingerprint.outputs.includes-changes &&
|
if: ${{ !steps.fingerprint.outputs.includes-changes &&
|
||||||
@@ -262,6 +287,10 @@ jobs:
|
|||||||
DENIS_API_KEY: ${{ secrets.DENIS_API_KEY }}
|
DENIS_API_KEY: ${{ secrets.DENIS_API_KEY }}
|
||||||
RUNTIME_VERSION: ${{ inputs.runtimeVersion }}
|
RUNTIME_VERSION: ${{ inputs.runtimeVersion }}
|
||||||
CHANNEL_NAME: ${{ inputs.channel || 'testflight' }}
|
CHANNEL_NAME: ${{ inputs.channel || 'testflight' }}
|
||||||
|
# When set (required for production), these take precedence over the
|
||||||
|
# global EAS counters inside the use-build-number wrapper
|
||||||
|
BSKY_IOS_BUILD_NUMBER: ${{ inputs.iosBuildNumber }}
|
||||||
|
BSKY_ANDROID_VERSION_CODE: ${{ inputs.androidVersionCode }}
|
||||||
|
|
||||||
buildIfNecessaryIOS:
|
buildIfNecessaryIOS:
|
||||||
name: Build and Submit iOS
|
name: Build and Submit iOS
|
||||||
|
|||||||
+13
-47
@@ -63,30 +63,7 @@ Run this and commit the result as the last commit on the OTA branch.
|
|||||||
pnpm intl:release
|
pnpm intl:release
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. Manually set build numbers
|
### 6. Run the GitHub actions
|
||||||
|
|
||||||
Log in to the EAS CLI with `eas login` and manually set the build numbers to the
|
|
||||||
values you found in **Step 1**.
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> If you don’t already have the EAS CLI, you can install it with `pnpm add -g eas-cli`.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
> npx eas build:version:set -p ios
|
|
||||||
>
|
|
||||||
> Project @blueskysocial/bluesky with bundle identifier "xyz.blueskyweb.app" is configured with buildNumber 1011.
|
|
||||||
> ✔ What version would you like to set? … 1009
|
|
||||||
>
|
|
||||||
> npx eas build:version:set -p android
|
|
||||||
>
|
|
||||||
> Project @blueskysocial/bluesky with application ID "xyz.blueskyweb.app" is configured with versionCode 641.
|
|
||||||
> ✔ What version would you like to set? … 639
|
|
||||||
```
|
|
||||||
|
|
||||||
👉 **Save the previous values,** in this case `1011` and `641`, so you can reset
|
|
||||||
them after the OTA completes.
|
|
||||||
|
|
||||||
### 7. Run the GitHub actions
|
|
||||||
You'll need to run two separate actions: one to deploy the iOS/Android OTA
|
You'll need to run two separate actions: one to deploy the iOS/Android OTA
|
||||||
itself, and one to build the web Docker container.
|
itself, and one to build the web Docker container.
|
||||||
|
|
||||||
@@ -96,14 +73,20 @@ and run the action.
|
|||||||
|
|
||||||
| Steps | |
|
| Steps | |
|
||||||
| ----- | --- |
|
| ----- | --- |
|
||||||
| Select your OTA branch `1.x.0-ota-x`, select `production` in the dropdown, enter the git tag of the latest release `1.x.0`, and click "Run workflow" |  |
|
| Select your OTA branch `1.x.0-ota-x`, select `production` in the dropdown, enter the git tag of the latest release `1.x.0`, enter the iOS build number and Android version code you found in **Step 1**, and click "Run workflow" |  |
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Production OTAs are bound to the specific native build they target, so the
|
||||||
|
> workflow requires the build numbers to be entered manually. There is no need
|
||||||
|
> to change the global EAS build counters (and doing so is no longer necessary
|
||||||
|
> for OTAs - they are only used when producing new native builds).
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> If you do enter an incorrect version here, the deployment will either:
|
> If you do enter an incorrect version here, the deployment will either:
|
||||||
> - Fail, because the action cannot find a commit with your misentered version
|
> - Fail, because the action cannot find a commit with your misentered version
|
||||||
> - Succeed, but with no users receiving the update. This is because the version
|
> - Succeed, but with no users receiving the update. This is because the
|
||||||
> you entered will not properly correlate to a _build number_ as well, so no
|
> version and build numbers you entered will not match any clients in the
|
||||||
> clients in the wild will be able to receive the update.
|
> wild, so none will be able to receive the update.
|
||||||
|
|
||||||
**For web,** head to [Actions >
|
**For web,** head to [Actions >
|
||||||
build-and-push-bskyweb-aws](https://github.com/bluesky-social/social-app/actions/workflows/build-and-push-bskyweb-aws.yaml)
|
build-and-push-bskyweb-aws](https://github.com/bluesky-social/social-app/actions/workflows/build-and-push-bskyweb-aws.yaml)
|
||||||
@@ -113,13 +96,13 @@ and run the action.
|
|||||||
| ----- | --- |
|
| ----- | --- |
|
||||||
| Select your OTA branch `1.x.0-ota-x` and click "Run workflow" |  |
|
| Select your OTA branch `1.x.0-ota-x` and click "Run workflow" |  |
|
||||||
|
|
||||||
### 8. Deploy web
|
### 7. Deploy web
|
||||||
|
|
||||||
Once the web Docker container build finishes, go to your `1.x.0-ota-x` branch,
|
Once the web Docker container build finishes, go to your `1.x.0-ota-x` branch,
|
||||||
copy the most recent commit hash. Post this hash in `#ops-deploys` and request
|
copy the most recent commit hash. Post this hash in `#ops-deploys` and request
|
||||||
someone with web deploy access deploy the built container.
|
someone with web deploy access deploy the built container.
|
||||||
|
|
||||||
### 9. Confirm successful deployment
|
### 8. Confirm successful deployment
|
||||||
|
|
||||||
In about five minutes, the new deployment should be deployed and devices will
|
In about five minutes, the new deployment should be deployed and devices will
|
||||||
begin downloading and installing in the background.
|
begin downloading and installing in the background.
|
||||||
@@ -130,23 +113,6 @@ build from your device and re-install from the App Store. Then, you'll need to:
|
|||||||
- Quit and reopen the app
|
- Quit and reopen the app
|
||||||
- Check the `Settings > About` page and confirm the hash matches the most recent hash on your OTA branch
|
- Check the `Settings > About` page and confirm the hash matches the most recent hash on your OTA branch
|
||||||
|
|
||||||
### 10. Reset build numbers
|
|
||||||
|
|
||||||
Grab the build numbers you saved in **Step 5** and reverse the EAS CLI commands
|
|
||||||
to reset the build numbers.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
> npx eas build:version:set -p ios
|
|
||||||
>
|
|
||||||
> Project @blueskysocial/bluesky with bundle identifier "xyz.blueskyweb.app" is configured with buildNumber 1009.
|
|
||||||
> ✔ What version would you like to set? … 1011
|
|
||||||
>
|
|
||||||
> npx eas build:version:set -p android
|
|
||||||
>
|
|
||||||
> Project @blueskysocial/bluesky with application ID "xyz.blueskyweb.app" is configured with versionCode 639.
|
|
||||||
> ✔ What version would you like to set? … 641
|
|
||||||
```
|
|
||||||
|
|
||||||
## Overview diagram
|
## Overview diagram
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -3,9 +3,19 @@ set -o errexit
|
|||||||
set -o pipefail
|
set -o pipefail
|
||||||
set -o nounset
|
set -o nounset
|
||||||
|
|
||||||
outputIos=$(eas build:version:get -p ios)
|
# Build numbers already present in the environment take precedence over the
|
||||||
outputAndroid=$(eas build:version:get -p android)
|
# global EAS counters. Production OTA deploys rely on this to target the
|
||||||
BSKY_IOS_BUILD_NUMBER=${outputIos#*buildNumber - }
|
# specific native build they are for, since the counters advance with every
|
||||||
BSKY_ANDROID_VERSION_CODE=${outputAndroid#*versionCode - }
|
# testflight build.
|
||||||
|
if [ -z "${BSKY_IOS_BUILD_NUMBER:-}" ]; then
|
||||||
|
outputIos=$(eas build:version:get -p ios)
|
||||||
|
BSKY_IOS_BUILD_NUMBER=${outputIos#*buildNumber - }
|
||||||
|
fi
|
||||||
|
|
||||||
bash -c "BSKY_IOS_BUILD_NUMBER=$BSKY_IOS_BUILD_NUMBER BSKY_ANDROID_VERSION_CODE=$BSKY_ANDROID_VERSION_CODE $*"
|
if [ -z "${BSKY_ANDROID_VERSION_CODE:-}" ]; then
|
||||||
|
outputAndroid=$(eas build:version:get -p android)
|
||||||
|
BSKY_ANDROID_VERSION_CODE=${outputAndroid#*versionCode - }
|
||||||
|
fi
|
||||||
|
|
||||||
|
export BSKY_IOS_BUILD_NUMBER BSKY_ANDROID_VERSION_CODE
|
||||||
|
exec "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user