about summary refs log tree commit diff
path: root/.github
diff options
context:
space:
mode:
authorhailey <me@haileyok.com>2025-07-24 16:23:17 -0700
committerGitHub <noreply@github.com>2025-07-24 16:23:17 -0700
commit1ee91d2c90ef84e0b6728e896292968562c8af01 (patch)
tree55dc5556d4f0f5382753a83bc98eb974cf12427d /.github
parent9e65f00c937b156b876b0f6ca23dcef12b945dbe (diff)
downloadvoidsky-1ee91d2c90ef84e0b6728e896292968562c8af01.tar.zst
OTA deployments on PR comment action (#8713)
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/pull-request-comment.yml177
1 files changed, 177 insertions, 0 deletions
diff --git a/.github/workflows/pull-request-comment.yml b/.github/workflows/pull-request-comment.yml
new file mode 100644
index 000000000..351e518bc
--- /dev/null
+++ b/.github/workflows/pull-request-comment.yml
@@ -0,0 +1,177 @@
+---
+name: PR Comment Trigger
+
+on:
+  issue_comment:
+    types: [created]
+
+jobs:
+  handle-comment:
+    if: github.event.issue.pull_request
+    runs-on: ubuntu-latest
+    outputs:
+      should-deploy: ${{ steps.check-org.outputs.result }}
+
+  steps:
+    - name: Check if bot is mentioned
+      id: check-mention
+      run: |
+        if [[ "${{ github.event.comment.body }}" == *"@github-actions"* ]] || \
+           [[ "${{ github.event.comment.body }}" == *"github-actions[bot]"* ]]; then
+          bot_mentioned=true
+        else
+          bot_mentioned=false
+        fi
+
+
+        if [[ "${{ github.event.comment.body }}" == *"ota"* ]]; then
+          has_ota=true
+        else
+          has_ota=false
+        fi
+
+
+        if [[ "$bot_mentioned" == "true" ]] && [[ "$has_ota" == "true" ]]; then
+          echo "mentioned=true" >> $GITHUB_OUTPUT
+        else
+          echo "mentioned=false" >> $GITHUB_OUTPUT
+        fi
+
+    - name: Check organization membership
+      if: steps.check-mention.outputs.mentioned == 'true'
+      id: check-org
+      uses: actions/github-script@v7
+      with:
+        script: |
+          try {
+            const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              username: context.payload.comment.user.login
+            });
+
+            const hasAccess = ['admin', 'write'].includes(perm.permission);
+            console.log(`User has ${perm.permission} access`);
+
+            return hasAccess;
+          } catch(error) {
+            console.log('User has no repository access');
+            return false;
+          }
+
+  bundle-deploy:
+    name: Bundle and Deploy EAS Update
+    runs-on: ubuntu-latest
+    needs: [handle-comment]
+    if: needs.handle-comment.outputs.should-deploy == 'true'
+    concurrency:
+      group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}-deploy
+      cancel-in-progress: true
+
+    steps:
+      - name: 💬 Drop a comment
+        uses: marocchino/sticky-pull-request-comment@v2
+        with:
+          header: pull-request-eas-build-${{ github.sha }}
+          message: |
+            An OTA deployment has been requested and is now running...
+
+            [Here is some music to listen to while you wait...](https://www.youtube.com/watch?v=VBlFHuCzPgY)
+            ---
+            *Generated by [PR labeler](https://github.com/expo/expo/actions/workflows/pr-labeler.yml) 🤖*
+
+      - 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: Install dependencies
+        run: yarn install --frozen-lockfile
+
+      - name: Lint check
+        run: yarn lint
+
+      - name: Lint lockfile
+        run: yarn lockfile-lint
+
+      - name: 🔤 Compile translations
+        run: yarn intl:build 2>&1 | tee i18n.log
+
+      - name: Check for i18n compilation errors
+        run: if grep -q "invalid syntax" "i18n.log"; then echo "\n\nFound compilation errors!\n\n" && exit 1; else echo "\n\nNo compilation errors!\n\n"; fi
+
+      - name: Type check
+        run: yarn typecheck
+
+      - name: 🔨 Setup EAS
+        uses: expo/expo-github-action@v8
+        with:
+          expo-version: latest
+          eas-version: latest
+          token: ${{ secrets.EXPO_TOKEN }}
+
+      - name: ⛏️ Setup Expo
+        run: yarn global add eas-cli-local-build-plugin
+
+      - name: 🪛 Setup jq
+        uses: dcarbone/install-jq-action@v2
+
+      - name: ✏️ Write environment variables
+        run: |
+          export json='${{ secrets.GOOGLE_SERVICES_TOKEN }}'
+          echo "${{ secrets.ENV_TOKEN }}" > .env
+          echo "EXPO_PUBLIC_BUNDLE_IDENTIFIER=$(git rev-parse --short HEAD)" >> .env
+          echo "EXPO_PUBLIC_BUNDLE_DATE=$(date -u +"%y%m%d%H")" >> .env
+          echo "BITDRIFT_API_KEY=${{ secrets.BITDRIFT_API_KEY }}" >> .env
+          echo "$json" > google-services.json
+
+      - name: Setup Sentry vars for build-time injection
+        id: sentry
+        run: |
+          echo "SENTRY_DIST=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
+          echo "SENTRY_RELEASE=$(jq -r '.version' package.json)" >> $GITHUB_OUTPUT
+
+      - name: 🏗️ Create Bundle
+        run: SENTRY_DIST=${{ steps.sentry.outputs.SENTRY_DIST }} SENTRY_RELEASE=${{ steps.sentry.outputs.SENTRY_RELEASE }} SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_DSN=${{ secrets.SENTRY_DSN }} EXPO_PUBLIC_ENV="pull-request" yarn export
+
+      - name: 📦 Package Bundle and 🚀 Deploy
+        run: yarn use-build-number bash scripts/bundleUpdate.sh
+        env:
+          DENIS_API_KEY: ${{ secrets.DENIS_API_KEY }}
+          CHANNEL_NAME: pull-request-${{ github.event.issue.number }}
+
+
+      - name: 💬 Drop a comment
+        uses: marocchino/sticky-pull-request-comment@v2
+        with:
+          header: pull-request-eas-build-${{ github.sha }}
+          message: |
+            Your requested OTA deployment was successful! You may now apply it by pressing the link below.
+
+            [Apply OTA update](bluesky://ota-apply?channel=pull-request-${{ github.event.issue.number }})
+
+            [Here is some music to listen to while you wait...](https://www.youtube.com/watch?v=VBlFHuCzPgY)
+            ---
+            *Generated by [PR labeler](https://github.com/expo/expo/actions/workflows/pr-labeler.yml) 🤖*
+
+
+      - name: 💬 Drop a comment
+        uses: marocchino/sticky-pull-request-comment@v2
+        if: failure()
+        with:
+          header: pull-request-eas-build-${{ github.sha }}
+          message: |
+            Your requested OTA deployment was unsuccessful. See action logs for more details.
+            ---
+            *Generated by [PR labeler](https://github.com/expo/expo/actions/workflows/pr-labeler.yml) 🤖*