diff options
author | hailey <me@haileyok.com> | 2025-07-24 16:23:17 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-24 16:23:17 -0700 |
commit | 1ee91d2c90ef84e0b6728e896292968562c8af01 (patch) | |
tree | 55dc5556d4f0f5382753a83bc98eb974cf12427d /.github | |
parent | 9e65f00c937b156b876b0f6ca23dcef12b945dbe (diff) | |
download | voidsky-1ee91d2c90ef84e0b6728e896292968562c8af01.tar.zst |
OTA deployments on PR comment action (#8713)
Diffstat (limited to '.github')
-rw-r--r-- | .github/workflows/pull-request-comment.yml | 177 |
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) 🤖* |