aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/android.yml
blob: dfa1b057800890f737a0a14e583c8be57ff790aa (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
name: Android
on:
  workflow_call:
    inputs:
      profile:
        required: false
        default: "release"
        type: string
      upload:
        required: false
        default: false
        type: boolean
      github-release-id:
        required: false
        type: string
  workflow_dispatch:
    inputs:
      profile:
        required: false
        default: "release"
        type: choice
        options: ["release", "debug", "production"]

env:
  RUST_BACKTRACE: 1
  SHELL: /bin/bash
  SCCACHE_GHA_ENABLED: "true"
  RUSTC_WRAPPER: "sccache"
  CCACHE: "sccache"
  # Increment this to purge the cache (https://github.com/mozilla/sccache/blob/main/docs/GHA.md)
  SCCACHE_GHA_VERSION: 2
  CARGO_INCREMENTAL: 0

jobs:
  build:
    name: Android Build
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        target: ['aarch64-linux-android', 'armv7-linux-androideabi', 'i686-linux-android', 'x86_64-linux-android']
    steps:
      - name: Free Disk Space (Ubuntu)
        uses: jlumbroso/free-disk-space@main
        with:
          tool-cache: false
          android: false
          large-packages: false
          swap-storage: false
      - uses: actions/checkout@v4
        if: github.event_name != 'pull_request_target'
        with:
          fetch-depth: 2
      # This is necessary to checkout the pull request if this run was triggered via a
      # `pull_request_target` event.
      - uses: actions/checkout@v4
        if: github.event_name == 'pull_request_target'
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          fetch-depth: 2
      - name: Run sccache-cache
        uses: mozilla-actions/sccache-action@v0.0.7
      - name: Install crown
        run: cargo install --path support/crown
      - name: Bootstrap Python
        run: python3 -m pip install --upgrade pip virtualenv
      - name: Bootstrap dependencies
        run: sudo apt update && python3 ./mach bootstrap --skip-lints
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Setup Android SDK
        uses: android-actions/setup-android@v3
        with:
          packages: 'tools platform-tools platforms;android-33'
      - name: Install Android NDK
        uses: nttld/setup-ndk@v1
        id: setup-ndk
        with:
          ndk-version: r26c
      - name: Setup Gradle caches
        uses: gradle/actions/setup-gradle@v4
      - name: Trigger initial download of Gradle with retries
        run: |
          for i in {1..4}; do
            ./gradlew --version && break || { echo "Downloading Gradle failed (attempt $i)." && sleep $((3 ** $i)); };
          done
        working-directory: ./support/android/apk/
      - name: Setup Key Store for APK Signing
        env:
          KEYSTORE_BASE64: ${{ secrets.APK_KEYSTORE_BASE64 }}
        if: ${{ env.KEYSTORE_BASE64 != '' }}
        run: |
          APK_SIGNING_KEY_STORE_PATH="${PWD}/servo_keystore.jks"
          echo "${KEYSTORE_BASE64}" | base64 -d > "${APK_SIGNING_KEY_STORE_PATH}"
          echo "APK_SIGNING_KEY_STORE_PATH=${APK_SIGNING_KEY_STORE_PATH}" >> ${GITHUB_ENV}
      - name: Build (arch ${{ matrix.target }} profile ${{ inputs.profile }})
        env:
          ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
          APK_SIGNING_KEY_STORE_PASS: ${{ secrets.APK_SIGNING_KEY_STORE_PASS }}
          APK_SIGNING_KEY_ALIAS: ${{ secrets.APK_SIGNING_KEY_ALIAS }}
          APK_SIGNING_KEY_PASS: ${{ secrets.APK_SIGNING_KEY_PASS }}
        run: |
          python3 ./mach build --use-crown --locked --target ${{ matrix.target }} --${{ inputs.profile }}
          cp -r target/cargo-timings target/cargo-timings-android-${{ matrix.target }}
      # TODO: This is disabled since APK crashes during startup.
      # See https://github.com/servo/servo/issues/31134
      # - name: Script tests
      #   run: ./mach test-android-startup
      - name: Archive build timing
        uses: actions/upload-artifact@v4
        with:
          name: cargo-timings-android-${{ matrix.target }}
          # Using a wildcard here ensures that the archive includes the path.
          path: target/cargo-timings-*
      - name: Upload nightly
        if: ${{ inputs.upload && contains(matrix.target, 'aarch64') }}
        run: |
          python3 ./mach upload-nightly android \
            --secret-from-environment \
            --github-release-id ${{ inputs.github-release-id }}
        env:
          S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }}
          NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }}
          NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds
      - name: Generate artifact attestation for APK
        if: ${{ inputs.upload }}
        uses: actions/attest-build-provenance@v1
        with:
          subject-path: target/android/${{ matrix.target }}/${{ inputs.profile }}/servoapp.apk
      - name: Upload APK artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ inputs.profile }}-binary-android-${{ matrix.target }}
          path: target/android/${{ matrix.target }}/${{ inputs.profile }}/servoapp.apk
      - name: Generate artifact attestation for AAR
        if: ${{ inputs.upload }}
        uses: actions/attest-build-provenance@v1
        with:
          subject-path: target/android/${{ matrix.target }}/${{ inputs.profile }}/servoview.aar
      - name: Upload AAR artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ inputs.profile }}-library-android-${{ matrix.target }}
          path: target/android/${{ matrix.target }}/${{ inputs.profile }}/servoview.aar