xref: /expo/.github/workflows/client-android.yml (revision 2cfc8c5a)
126aa4695SNick Novitskiname: Android Client
226aa4695SNick Novitski
326aa4695SNick Novitskion:
4f312c993SNick Novitski  workflow_dispatch:
5a5c6682fSNick Novitski    inputs:
6a5c6682fSNick Novitski      releaseAPK:
7a5c6682fSNick Novitski        description: 'type "release-apk" to confirm upload to S3'
8a5c6682fSNick Novitski        required: false
9a5c6682fSNick Novitski      releaseGooglePlay:
10a5c6682fSNick Novitski        description: 'type "release-google-play" to confirm release to Google Play'
11a5c6682fSNick Novitski        required: false
1226aa4695SNick Novitski  pull_request:
1326aa4695SNick Novitski    paths:
1426aa4695SNick Novitski      - .github/workflows/client-android.yml
1526aa4695SNick Novitski      - secrets/**
1626aa4695SNick Novitski      - android/**
1726aa4695SNick Novitski      - fastlane/**
1826aa4695SNick Novitski      - Gemfile.lock
1926aa4695SNick Novitski      - .ruby-version
2026aa4695SNick Novitski      - yarn.lock
2126aa4695SNick Novitski  push:
2226aa4695SNick Novitski    branches: [master, sdk-*]
2326aa4695SNick Novitski    paths:
2426aa4695SNick Novitski      - .github/workflows/client-android.yml
2526aa4695SNick Novitski      - secrets/**
2626aa4695SNick Novitski      - android/**
2726aa4695SNick Novitski      - fastlane/**
2826aa4695SNick Novitski      - Gemfile.lock
2926aa4695SNick Novitski      - .ruby-version
3026aa4695SNick Novitski      - yarn.lock
3126aa4695SNick Novitski
3257852c41STomasz Sapetaconcurrency:
3357852c41STomasz Sapeta  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
3457852c41STomasz Sapeta  cancel-in-progress: true
3557852c41STomasz Sapeta
3626aa4695SNick Novitskijobs:
3726aa4695SNick Novitski  build:
3826aa4695SNick Novitski    runs-on: ubuntu-18.04
3926aa4695SNick Novitski    steps:
40cb915345STomasz Sapeta      - name: �� Checkout
41cb915345STomasz Sapeta        uses: actions/checkout@v2
4226aa4695SNick Novitski        with:
4326aa4695SNick Novitski          submodules: true
44cb915345STomasz Sapeta      - name: ♻️ Restore workspace node modules
45cb915345STomasz Sapeta        uses: actions/cache@v2
46cb915345STomasz Sapeta        id: node-modules-cache
4726aa4695SNick Novitski        with:
48cb915345STomasz Sapeta          path: |
49cb915345STomasz Sapeta            # See "workspaces" → "packages" in the root package.json for the source of truth of
50cb915345STomasz Sapeta            # which node_modules are affected by the root yarn.lock
51cb915345STomasz Sapeta            node_modules
52cb915345STomasz Sapeta            apps/*/node_modules
53cb915345STomasz Sapeta            home/node_modules
54cb915345STomasz Sapeta            packages/*/node_modules
55cb915345STomasz Sapeta            packages/@unimodules/*/node_modules
56cb915345STomasz Sapeta            react-native-lab/react-native/node_modules
57cb915345STomasz Sapeta          key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }}
58cb915345STomasz Sapeta      - name: ♻️ Restore node modules in tools
59cb915345STomasz Sapeta        uses: actions/cache@v2
60cb915345STomasz Sapeta        with:
61cb915345STomasz Sapeta          path: tools/node_modules
62cb915345STomasz Sapeta          key: ${{ runner.os }}-tools-modules-${{ hashFiles('tools/yarn.lock') }}
63cb915345STomasz Sapeta      - name: �� Yarn install
64cb915345STomasz Sapeta        run: yarn install --frozen-lockfile
65cb915345STomasz Sapeta      - name: �� Setup Ruby and install gems
66cb915345STomasz Sapeta        uses: ruby/setup-ruby@v1
6726aa4695SNick Novitski        with:
689828452cSNick Novitski          bundler-cache: true
69cb915345STomasz Sapeta      - name: �� Install git-crypt
70cb915345STomasz Sapeta        run: sudo apt-get install git-crypt
71cb915345STomasz Sapeta      - name: �� Decrypt secrets if possible
7226aa4695SNick Novitski        env:
7326aa4695SNick Novitski          GIT_CRYPT_KEY_BASE64: ${{ secrets.GIT_CRYPT_KEY_BASE64 }}
7426aa4695SNick Novitski        run: |
7526aa4695SNick Novitski          if [ -z "${GIT_CRYPT_KEY_BASE64}" ]; then
7626aa4695SNick Novitski            echo 'git-crypt key not present in environment'
7726aa4695SNick Novitski          else
7826aa4695SNick Novitski            git crypt unlock <(echo $GIT_CRYPT_KEY_BASE64 | base64 --decode)
7926aa4695SNick Novitski          fi
80cb915345STomasz Sapeta      - name: ♻️ Restore Gradle caches
81cb915345STomasz Sapeta        uses: actions/cache@v2
8226aa4695SNick Novitski        with:
8326aa4695SNick Novitski          path: ~/.gradle/caches
8426aa4695SNick Novitski          key: ${{ runner.os }}-gradle-${{ hashFiles('android/*.gradle*') }}
8526aa4695SNick Novitski          restore-keys: |
8626aa4695SNick Novitski            ${{ runner.os }}-gradle-
87cb915345STomasz Sapeta      - name: ♻️ Restore Android NDK from cache
88cb915345STomasz Sapeta        uses: actions/cache@v2
891d09954bSStanisław Chmiela        id: cache-android-ndk
901d09954bSStanisław Chmiela        with:
913d7b2374SWojciech Kozyra          path: /usr/local/lib/android/sdk/ndk/19.2.5345600/
921d09954bSStanisław Chmiela          key: ${{ runner.os }}-ndk-19.2.5345600
931d09954bSStanisław Chmiela          restore-keys: |
941d09954bSStanisław Chmiela            ${{ runner.os }}-ndk-
95cb915345STomasz Sapeta      - name: �� Install NDK
961d09954bSStanisław Chmiela        if: steps.cache-android-ndk.outputs.cache-hit != 'true'
971d09954bSStanisław Chmiela        run: |
98*2cfc8c5aSJakub          sudo $ANDROID_SDK_ROOT/tools/bin/sdkmanager --install "ndk;19.2.5345600"
99cb915345STomasz Sapeta      - name: �� Build APK
1006aa6f0b9SNick Novitski        env:
1016aa6f0b9SNick Novitski          ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
10226aa4695SNick Novitski          ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
10326aa4695SNick Novitski          ANDROID_KEY_ALIAS: ExponentKey
10426aa4695SNick Novitski          ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
1053d7b2374SWojciech Kozyra          ANDROID_NDK_HOME: /usr/local/lib/android/sdk/ndk/19.2.5345600/
10667b999adSTomasz Sapeta          IS_RELEASE_BUILD: ${{ github.event.inputs.releaseAPK == 'release-apk' || github.event.inputs.releaseGooglePlay == 'release-google-play' }}
1076aa6f0b9SNick Novitski        run: |
10867b999adSTomasz Sapeta          if [ "$IS_RELEASE_BUILD" == "false" ]; then
10967b999adSTomasz Sapeta            export NDK_ABI_FILTERS="x86_64"
11067b999adSTomasz Sapeta            BUILD_TYPE="Debug"
11167b999adSTomasz Sapeta            echo "Using ABI filters: $NDK_ABI_FILTERS"
11267b999adSTomasz Sapeta          else
11367b999adSTomasz Sapeta            BUILD_TYPE="Release"
11467b999adSTomasz Sapeta          fi
1156aa6f0b9SNick Novitski          if [ -z "$ANDROID_KEYSTORE_B64" ]; then
1166aa6f0b9SNick Novitski            echo "External build detected, APK will not be signed"
11767b999adSTomasz Sapeta            bin/fastlane android build build_type:$BUILD_TYPE sign:false
1186aa6f0b9SNick Novitski          else
1196aa6f0b9SNick Novitski            echo "Internal build detected, APK will be signed"
1206aa6f0b9SNick Novitski            echo $ANDROID_KEYSTORE_B64 | base64 -d > android/app/release-key.jks
12167b999adSTomasz Sapeta            bin/fastlane android build build_type:$BUILD_TYPE
1226aa6f0b9SNick Novitski          fi
123cb915345STomasz Sapeta      - name: �� Upload APK artifact
124cb915345STomasz Sapeta        uses: actions/upload-artifact@v2
12526aa4695SNick Novitski        with:
12626aa4695SNick Novitski          name: android-apk
12726aa4695SNick Novitski          path: android/app/build/outputs/apk
128cb915345STomasz Sapeta      - name: �� Store daemon logs for debugging crashes
12926aa4695SNick Novitski        if: failure()
13026aa4695SNick Novitski        uses: actions/upload-artifact@v2
13126aa4695SNick Novitski        with:
13226aa4695SNick Novitski          name: gradle-daemon-logs
13326aa4695SNick Novitski          path: ~/.gradle/daemon
134cb915345STomasz Sapeta      - name: �� Upload APK to S3 and update staging versions endpoint
135a5c6682fSNick Novitski        if: ${{ github.event.inputs.releaseAPK == 'release-apk' }}
136f2e77ee1SNick Novitski        run: bin/expotools client-build --platform android --release
137f2e77ee1SNick Novitski        env:
138f2e77ee1SNick Novitski          AWS_ACCESS_KEY_ID: AKIAJ3SWUQ4QLNQC7FXA
139f2e77ee1SNick Novitski          AWS_SECRET_ACCESS_KEY: ${{ secrets.android_client_build_aws_secret_key }}
14035ca8003SBrent Vatne          EXPO_VERSIONS_SECRET: ${{ secrets.expo_versions_secret }}
14167b999adSTomasz Sapeta      - name: �� Upload APK to Google Play and release to production
142a5c6682fSNick Novitski        if: ${{ github.event.inputs.releaseGooglePlay == 'release-google-play' }}
143cb915345STomasz Sapeta        run: bin/fastlane android prod_release
144f2e77ee1SNick Novitski        env:
145f2e77ee1SNick Novitski          SUPPLY_JSON_KEY_DATA: ${{ secrets.SUPPLY_JSON_KEY_DATA }}
14673fa456fSTomasz Sapeta      - name: �� Notify on Slack
14773fa456fSTomasz Sapeta        uses: 8398a7/action-slack@v3
14826aa4695SNick Novitski        if: failure() && (github.event.ref == 'refs/heads/master' || startsWith(github.event.ref, 'refs/heads/sdk-'))
14926aa4695SNick Novitski        env:
15026aa4695SNick Novitski          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
15126aa4695SNick Novitski          SLACK_WEBHOOK_URL: ${{ secrets.slack_webhook_android }}
15226aa4695SNick Novitski        with:
15326aa4695SNick Novitski          channel: '#platform-android'
15473fa456fSTomasz Sapeta          status: ${{ job.status }}
155f12bf82bSTomasz Sapeta          fields: job,message,ref,eventName,author,took
15673fa456fSTomasz Sapeta          author_name: Expo Go (Android)
157