about summary refs log tree commit diff
path: root/.github/workflows/build-submit-ios.yml
blob: 449733485c608276d9b88445d872c9aded7a877a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
---
name: Build and Submit iOS

on:
  workflow_dispatch:
    inputs:
      profile:
        type: choice
        description: Build profile to use
        options:
          - testflight
          - production

jobs:
  build:
    if: github.repository == 'bluesky-social/social-app'
    name: Build and Submit iOS
    runs-on: macos-15
    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
        with:
          fetch-depth: 5

      - name: 🔧 Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .nvmrc
          cache: yarn

      - name: 🪛 Setup jq
        uses: dcarbone/install-jq-action@v2

      - 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

      - uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: '16.4'

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

      # EXPO_PUBLIC_ENV is handled in eas.json
      - name: ✏️ Write environment variables
        id: env
        run: |
          echo "${{ secrets.ENV_TOKEN }}" > .env
          echo "EXPO_PUBLIC_RELEASE_VERSION=$(jq -r '.version' package.json)" >> .env
          echo "EXPO_PUBLIC_RELEASE_VERSION=$(jq -r '.version' package.json)" >> $GITHUB_OUTPUT
          echo "EXPO_PUBLIC_BUNDLE_IDENTIFIER=$(git rev-parse HEAD)" >> .env
          echo "EXPO_PUBLIC_BUNDLE_IDENTIFIER=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
          echo "EXPO_PUBLIC_BUNDLE_DATE=$(date -u +"%y%m%d%H")" >> .env
          echo "EXPO_PUBLIC_SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env
          echo "EXPO_PUBLIC_BITDRIFT_API_KEY=${{ secrets.BITDRIFT_API_KEY }}" >> .env
          echo "EXPO_PUBLIC_GCP_PROJECT_ID=${{ secrets.EXPO_PUBLIC_GCP_PROJECT_ID }}" >> .env
          echo "${{ secrets.GOOGLE_SERVICES_TOKEN }}" > google-services.json

      - name: 🏗️ EAS Build
        run: >
          SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}
          SENTRY_RELEASE=${{ steps.env.outputs.EXPO_PUBLIC_RELEASE_VERSION }}
          SENTRY_DIST=${{ steps.env.outputs.EXPO_PUBLIC_BUNDLE_IDENTIFIER }}
          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

      - name: 📚 Get version from package.json
        id: get-build-info
        run: bash scripts/setGitHubOutput.sh

      - name: 🔔 Notify Slack of Production Build
        if: ${{ inputs.profile == 'production' }}
        uses: slackapi/slack-github-action@v1.25.0
        with:
          payload: |
            {
              "text": "iOS production build for App Store submission is ready!\n```Artifact: Check TestFlight to know when it is available\nVersion Number: ${{ steps.get-build-info.outputs.PACKAGE_VERSION }}\nBuild Number: ${{ steps.get-build-info.outputs.BSKY_IOS_BUILD_NUMBER }}```"
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }}
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

      - name: ⬇️ Restore Cache
        id: get-base-commit
        uses: actions/cache@v4
        if: ${{ inputs.profile == 'testflight' }}
        with:
          path: most-recent-testflight-commit.txt
          key: most-recent-testflight-commit

      - name: ✏️ Write commit hash to cache
        if: ${{ inputs.profile == 'testflight' }}
        run: echo ${{ github.sha }} > most-recent-testflight-commit.txt