From 3cda93dade4061f1cb94847d4fc9022a95b2ce2c Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Tue, 16 Feb 2021 04:17:08 -0800 Subject: [PATCH] Cache Android builds on GitHub Actions (#1922) Summary: Builds up a file with checksums of all `build.gradle` files. Deliberately excludes the `gradle.properties` which changes all the time. The cache shouldn't require nuking except in some rare circumstances. Pull Request resolved: https://github.com/facebook/flipper/pull/1922 Test Plan: From 41 minutes down to 17: https://github.com/passy/flipper-1/actions/runs/561501374 Reviewed By: mweststrate Differential Revision: D26427242 Pulled By: passy fbshipit-source-id: ff1d7370d477c9d7b57c62082ec985108a5ba698 --- .github/workflows/android-sample.yml | 9 +++++++++ .github/workflows/publish-android.yml | 9 +++++++++ scripts/checksum-android.sh | 28 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100755 scripts/checksum-android.sh diff --git a/.github/workflows/android-sample.yml b/.github/workflows/android-sample.yml index 4882dffdc..154710e99 100644 --- a/.github/workflows/android-sample.yml +++ b/.github/workflows/android-sample.yml @@ -15,6 +15,15 @@ jobs: java-version: 1.8 - name: Install NDK 21 run: echo "y" | sudo /usr/local/lib/android/sdk/tools/bin/sdkmanager --install "ndk;21.0.6113669" "ndk;20.0.5594570" --sdk_root=${ANDROID_SDK_ROOT} + - name: Compute build cache + run: ./scripts/checksum-android.sh checksum-android.txt + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches/modules-* + ~/.gradle/caches/jars-* + ~/.gradle/caches/build-cache-* + key: gradle-${{ hashFiles('checksum-android.txt') }} - name: Build with Gradle run: ./gradlew :sample:assembleDebug :tutorial:assembleDebug - name: upload artifact diff --git a/.github/workflows/publish-android.yml b/.github/workflows/publish-android.yml index 92b2fa357..800ca97a3 100644 --- a/.github/workflows/publish-android.yml +++ b/.github/workflows/publish-android.yml @@ -28,6 +28,15 @@ jobs: run: echo '${{ secrets.GPG_KEY_CONTENTS }}' | base64 -d > /tmp/secring.gpg - name: Update gradle.properties run: echo -e "signing.secretKeyRingFile=/tmp/secring.gpg\nsigning.keyId=${{ secrets.SIGNING_KEY_ID }}\nsigning.password=${{ secrets.SIGNING_PASSWORD }}" >> gradle.properties + - name: Compute build cache + run: ./scripts/checksum-android.sh checksum-android.txt + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches/modules-* + ~/.gradle/caches/jars-* + ~/.gradle/caches/build-cache-* + key: gradle-${{ hashFiles('checksum-android.txt') }} - name: Build artifacts run: ./gradlew :sample:assembleDebug :sample:assembleRelease && ./gradlew :android:assembleRelease - name: Upload Archives diff --git a/scripts/checksum-android.sh b/scripts/checksum-android.sh new file mode 100755 index 000000000..366344a79 --- /dev/null +++ b/scripts/checksum-android.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +RESULT_FILE=$1 + +if [ -f "$RESULT_FILE" ]; then + rm "$RESULT_FILE" +fi +touch "$RESULT_FILE" + +checksum_file() { + openssl sha256 "$1" | awk '{print $2}' +} + +FILES=() +while read -r -d ''; do + FILES+=("$REPLY") +done < <(find . -type f \( -name "build.gradle*" -o -name "gradle-wrapper.properties" \) -print0) + +# Loop through files and append checksum to result file +for FILE in "${FILES[@]}"; do + checksum_file "$FILE" >> "$RESULT_FILE" +done + +sort "$RESULT_FILE" -o "$RESULT_FILE"