diff options
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 |