diff options
author | Hailey <me@haileyok.com> | 2024-04-03 15:14:44 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-03 15:14:44 -0700 |
commit | 73df7e53b3684b874a8f8196d2cbac8daad56d18 (patch) | |
tree | a4a07f9e319580df7de30d495e5e566d6451d6a0 /.github | |
parent | 02b2ab4f1fac9900033aab9f9e7d1d003322718b (diff) | |
download | voidsky-73df7e53b3684b874a8f8196d2cbac8daad56d18.tar.zst |
Add OTA updates support for `testflight` channel (#3291)
* some progress another adjustment, testing another adjustment, testing fix again fix again set default runtime version fix test this script test this script test this script add build numbers to the deployment url clean give script access to build number add `useBuildNumberEnv` without a bump new line fix missing async add channel name to deployment url add updates check on launch for testflight users ver bump init updates on launch for native add `testflight` as default in build submit add is_testflight check * disable inline predictions to prevent ios composer jank * temp bump * Revert "temp bump" This reverts commit 44c51134a35d817c73edb1e635495597c95117b3. * adjustments version bump adjust fixes test * cleanup and finalize drop check down to every 15 minutes adjustments change to 15 mins use jq to get version if necessary rm test on push figured it out remove nightly testflight releases test again again again again again AGAIN ONCE MORE test again again again again again AGAIN test again again again again again AGAIN test again again again again again test again again again again test again again again test again again test again test test test run deploy if necessary run deploy if necessary run deploy if necessary run deploy if necessary run deploy if necessary remove test message fix environment oops cleanup merge in changes * remove unnecessary `workflow_call` * remove changes that have been merged into main now * finalize android update git ignore rm test stuff from the bundle action remove test message test message fix test message test message few android fixes few android fixes fix jq add a test message fix slack webhook create android deployments test 2 create android deployments add `testflight-android` profile to eas.json more cleanup some more cleanup simplify some logic remove unnecessary channel rename to `useOTAUpdates` * rm test portion
Diffstat (limited to '.github')
-rw-r--r-- | .github/workflows/build-submit-android.yml | 2 | ||||
-rw-r--r-- | .github/workflows/build-submit-ios.yml | 5 | ||||
-rw-r--r-- | .github/workflows/bundle-deploy-eas-update.yml | 227 |
3 files changed, 224 insertions, 10 deletions
diff --git a/.github/workflows/build-submit-android.yml b/.github/workflows/build-submit-android.yml index 8cbd90984..51fa5f4c3 100644 --- a/.github/workflows/build-submit-android.yml +++ b/.github/workflows/build-submit-android.yml @@ -59,7 +59,7 @@ jobs: echo "$json" > google-services.json - name: 🏗️ EAS Build - run: yarn use-build-number eas build -p android --profile production --local --output build.aab --non-interactive + run: yarn use-build-number-with-bump eas build -p android --profile production --local --output build.aab --non-interactive - name: 🚀 Deploy run: eas submit -p android --non-interactive --path build.aab diff --git a/.github/workflows/build-submit-ios.yml b/.github/workflows/build-submit-ios.yml index f5188b4b4..c9752d862 100644 --- a/.github/workflows/build-submit-ios.yml +++ b/.github/workflows/build-submit-ios.yml @@ -2,14 +2,13 @@ name: Build and Submit iOS on: - schedule: - - cron: '0 5 * * *' workflow_dispatch: inputs: profile: type: choice description: Build profile to use options: + - testflight - production jobs: @@ -69,7 +68,7 @@ jobs: echo "${{ secrets.GOOGLE_SERVICES_TOKEN }}" > google-services.json - name: 🏗️ EAS Build - run: yarn use-build-number eas build -p ios --profile production --local --output build.ipa --non-interactive + run: yarn use-build-number-with-bump eas build -p ios --profile ${{ inputs.profile || 'testflight' }} --local --output build.ipa --non-interactive - name: 🚀 Deploy run: eas submit -p ios --non-interactive --path build.ipa diff --git a/.github/workflows/bundle-deploy-eas-update.yml b/.github/workflows/bundle-deploy-eas-update.yml index 72a38eaa6..1c7e57e5c 100644 --- a/.github/workflows/bundle-deploy-eas-update.yml +++ b/.github/workflows/bundle-deploy-eas-update.yml @@ -4,6 +4,12 @@ name: Bundle and Deploy EAS Update on: workflow_dispatch: inputs: + channel: + type: choice + description: Deployment channel to use + options: + - testflight + - production runtimeVersion: type: string description: Runtime version (in x.x.x format) that this update is for @@ -13,13 +19,48 @@ jobs: bundleDeploy: name: Bundle and Deploy EAS Update runs-on: ubuntu-latest + outputs: + fingerprint-diff: ${{ steps.fingerprint.outputs.fingerprint-diff }} steps: + - name: Check for EXPO_TOKEN + run: > + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + # Validate the version if one is supplied. This should generally happen if the update is for a production client - name: 🧐 Validate version + if: ${{ inputs.runtimeVersion }} run: | - [[ "${{ github.event.inputs.runtimeVersion }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "Version is valid" || exit 1 + if [ -z "${{ inputs.runtimeVersion }}" ]; then + [[ "${{ inputs.runtimeVersion }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "Version is valid" || exit 1 + fi - name: ⬇️ Checkout uses: actions/checkout@v4 + with: + fetch-depth: 100 + + - name: ⬇️ Fetch commits from base branch + run: git fetch origin main:main --depth 100 + + # This should get the current production release's commit's hash to see if the update is compatible + - name: 🕵️ Get the base commit + id: base-commit + run: | + if [ -z "${{ inputs.channel == 'production' }}" ]; then + echo base-commit=$(git show-ref -s ${{ inputs.runtimeVersion }}) >> "$GITHUB_OUTPUT" + else + echo base-commit=$(git log -n 1 --skip 1 main --pretty=format:'%H') >> "$GITHUB_OUTPUT" + fi + + - name: ✓ Make sure we found a base commit + run: | + if [ -z "${{ steps.base-commit.outputs.base-commit }}" ]; then + echo "Could not find a base commit for this release. Exiting." + exit 1 + fi - name: 🔧 Setup Node uses: actions/setup-node@v4 @@ -30,26 +71,200 @@ jobs: - name: ⚙️ Install Dependencies run: yarn install - - name: 🪛 Install jq - uses: dcarbone/install-jq-action@v2 + # Run the fingerprint + - name: 📷 Check fingerprint + id: fingerprint + uses: expo/expo-github-action/fingerprint@main + with: + previous-git-commit: ${{ steps.base-commit.outputs.base-commit }} + + - name: 👀 Debug fingerprint + run: | + echo "previousGitCommit=${{ steps.fingerprint.outputs.previous-git-commit }} currentGitCommit=${{ steps.fingerprint.outputs.current-git-commit }}" + echo "isPreviousFingerprintEmpty=${{ steps.fingerprint.outputs.previous-fingerprint == '' }}" + + - name: 🔨 Setup EAS + uses: expo/expo-github-action@v8 + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} + with: + expo-version: latest + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} - name: ⛏️ Setup Expo + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} run: yarn global add eas-cli-local-build-plugin + - name: 🪛 Setup jq + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} + uses: dcarbone/install-jq-action@v2 + - name: 🔤 Compile Translations + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} run: yarn intl:build - name: ✏️ Write environment variables + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} run: | export json='${{ secrets.GOOGLE_SERVICES_TOKEN }}' echo "${{ secrets.ENV_TOKEN }}" > .env echo "$json" > google-services.json - name: 🏗️ Create Bundle - run: yarn export + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} + run: EXPO_PUBLIC_ENV="${{ inputs.channel || 'testflight' }}" yarn export - name: 📦 Package Bundle and 🚀 Deploy - run: yarn make-deploy-bundle + if: ${{ steps.fingerprint.outputs.fingerprint-diff == '[]' }} + run: yarn use-build-number bash scripts/bundleUpdate.sh env: DENIS_API_KEY: ${{ secrets.DENIS_API_KEY }} - RUNTIME_VERSION: ${{ github.event.inputs.runtimeVersion }} + RUNTIME_VERSION: ${{ inputs.runtimeVersion }} + CHANNEL_NAME: ${{ inputs.channel || 'testflight' }} + + # GitHub actions are horrible so let's just copy paste this in + buildIfNecessaryIOS: + name: Build and Submit iOS + runs-on: macos-14 + needs: [bundleDeploy] + # Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be + # available here + if: ${{ inputs.channel != 'production' && needs.bundleDeploy.outputs.fingerprint-diff != '[]' }} + steps: + - name: Check for EXPO_TOKEN + run: > + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - name: ⬇️ Checkout + uses: actions/checkout@v4 + + - name: 🔧 Setup Node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: 🔨 Setup EAS + uses: expo/expo-github-action@v8 + with: + expo-version: latest + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: ⛏️ Setup EAS local builds + run: yarn global add eas-cli-local-build-plugin + + - name: ⚙️ Install dependencies + run: yarn install + + - name: ☕️ Setup Cocoapods + uses: maxim-lobanov/setup-cocoapods@v1 + with: + version: 1.14.3 + + - name: 💾 Cache Pods + uses: actions/cache@v3 + id: pods-cache + with: + path: ./ios/Pods + # We'll use the yarn.lock for our hash since we don't yet have a Podfile.lock. Pod versions will not + # change unless the yarn version changes as well. + key: ${{ runner.os }}-pods-${{ hashFiles('yarn.lock') }} + + - name: 🔤 Compile translations + run: yarn intl:build + + - name: ✏️ Write environment variables + run: | + echo "${{ secrets.ENV_TOKEN }}" > .env + echo "${{ secrets.GOOGLE_SERVICES_TOKEN }}" > google-services.json + + - name: 🏗️ EAS Build + run: yarn use-build-number-with-bump eas build -p ios --profile testflight --local --output build.ipa --non-interactive + + - name: 🚀 Deploy + run: eas submit -p ios --non-interactive --path build.ipa + + buildIfNecessaryAndroid: + name: Build and Submit Android + runs-on: ubuntu-latest + needs: [ bundleDeploy ] + # Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be + # available here + if: ${{ inputs.channel != 'production' && needs.bundleDeploy.outputs.fingerprint-diff != '[]' }} + + steps: + - name: Check for EXPO_TOKEN + run: > + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - name: ⬇️ Checkout + uses: actions/checkout@v4 + + - name: 🔧 Setup Node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: 🔨 Setup EAS + uses: expo/expo-github-action@v8 + with: + expo-version: latest + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: ⛏️ Setup EAS local builds + run: yarn global add eas-cli-local-build-plugin + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: ⚙️ Install dependencies + run: yarn install + + - name: 🔤 Compile translations + run: yarn intl:build + + - name: ✏️ Write environment variables + run: | + export json='${{ secrets.GOOGLE_SERVICES_TOKEN }}' + echo "${{ secrets.ENV_TOKEN }}" > .env + echo "$json" > google-services.json + + - name: 🏗️ EAS Build + run: yarn use-build-number-with-bump eas build -p android --profile testflight-android --local --output build.apk --non-interactive + + - name: ⏰ Get a timestamp + id: timestamp + uses: nanzm/get-time-action@master + with: + format: 'MM-DD-HH-mm-ss' + + - name: 🚀 Upload Artifact + id: upload-artifact + uses: actions/upload-artifact@v4 + with: + retention-days: 30 + compression-level: 0 + name: build-${{ steps.timestamp.outputs.time }}.apk + path: build.apk + + - name: 🔔 Notify Slack + uses: slackapi/slack-github-action@v1.25.0 + with: + payload: | + { + "text": "Android build is ready for testing. Download the artifact here: ${{ steps.upload-artifact.outputs.artifact-url }}" + } + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK |