diff --git a/.github/workflows/commit-ci.yml b/.github/workflows/commit-ci.yml index 0a4b0f309f..96477bb5db 100644 --- a/.github/workflows/commit-ci.yml +++ b/.github/workflows/commit-ci.yml @@ -33,31 +33,31 @@ jobs: run: | brew install coreutils clang-format + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: "temurin" + java-version: 17 + # will restore cache of dependencies and wrappers + cache: 'gradle' + - name: Calculate JNI cache hash id: cache-hash - shell: bash - run: script/cache-hash.sh + run: | + ./gradlew :app:calculateNativeCacheHash - name: Fetch JNI cache uses: actions/cache@v3 id: jni-cache with: path: "app/prebuilt" - key: ${{ matrix.os }}-trime-jni-debug-${{ steps.cache-hash.outputs.hash }} + key: ${{ matrix.os }}-trime-jni-debug-${{ steps.cache-hash.outputs.native-cache-hash }} - name: Fetch submodules if: ${{ !steps.jni-cache.outputs.cache-hit }} run: | git submodule update --init --recursive - - name: Setup Java - uses: actions/setup-java@v3 - with: - distribution: "temurin" - java-version: 17 - # will restore cache of dependencies and wrappers - cache: 'gradle' - - name: Setup Android SDK uses: android-actions/setup-android@v3 diff --git a/.github/workflows/pull-request-ci.yml b/.github/workflows/pull-request-ci.yml index d450788baf..cf3f1d2b6d 100644 --- a/.github/workflows/pull-request-ci.yml +++ b/.github/workflows/pull-request-ci.yml @@ -40,31 +40,31 @@ jobs: run: | brew install coreutils clang-format + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: "temurin" + java-version: 17 + # will restore cache of dependencies and wrappers + cache: 'gradle' + - name: Calculate JNI cache hash id: cache-hash - shell: bash - run: script/cache-hash.sh + run: | + ./gradlew :app:calculateNativeCacheHash - name: Fetch JNI cache uses: actions/cache@v3 id: jni-cache with: path: "app/prebuilt" - key: ${{ matrix.os }}-trime-jni-debug-${{ steps.cache-hash.outputs.hash }} + key: ${{ matrix.os }}-trime-jni-debug-${{ steps.cache-hash.outputs.native-cache-hash }} - name: Fetch submodules if: ${{ !steps.jni-cache.outputs.cache-hit }} run: | git submodule update --init --recursive - - name: Setup Java - uses: actions/setup-java@v3 - with: - distribution: "temurin" - java-version: 17 - # will restore cache of dependencies and wrappers - cache: 'gradle' - - name: Setup Android SDK uses: android-actions/setup-android@v3 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 819e93b6d2..d14437c32a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,7 @@ import org.gradle.configurationcache.extensions.capitalized plugins { id("com.osfans.trime.native-app-convention") id("com.osfans.trime.data-checksums") + id("com.osfans.trime.native-cache-hash") alias(libs.plugins.aboutlibraries) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.serialization) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 9d52268509..e2509020f0 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -21,5 +21,9 @@ gradlePlugin { id = "com.osfans.trime.native-app-convention" implementationClass = "NativeAppConventionPlugin" } + register("nativeCacheHash") { + id = "com.osfans.trime.native-cache-hash" + implementationClass = "NativeCacheHashPlugin" + } } } diff --git a/build-logic/convention/src/main/kotlin/NativeCacheHashPlugin.kt b/build-logic/convention/src/main/kotlin/NativeCacheHashPlugin.kt new file mode 100644 index 0000000000..92b8b740fd --- /dev/null +++ b/build-logic/convention/src/main/kotlin/NativeCacheHashPlugin.kt @@ -0,0 +1,53 @@ +import ApkRelease.buildApkRelease +import Versions.cmakeVersion +import Versions.ndkVersion +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.logging.LogLevel +import org.gradle.api.tasks.TaskAction +import org.gradle.kotlin.dsl.task +import org.jetbrains.kotlin.com.google.common.hash.Hashing +import org.jetbrains.kotlin.com.google.common.io.ByteSource +import java.io.File + +class NativeCacheHashPlugin : Plugin { + override fun apply(target: Project) { + target.task("calculateNativeCacheHash") + } + + abstract class NativeCacheHashCalcTask : DefaultTask() { + companion object { + fun sha256(file: File): String = ByteSource.wrap(file.readBytes()).hash(Hashing.sha256()).toString() + + fun sha256(string: String) = ByteSource.wrap(string.encodeToByteArray()).hash(Hashing.sha256()).toString() + } + + @TaskAction + fun execute() { + with(project) { + val magic = + buildString { + appendLine(cmakeVersion) + appendLine(ndkVersion) + if (!buildApkRelease) { + appendLine(buildABI) + } + appendLine(runCmd("git submodule status")) + fileTree("src/main/jni/cmake").forEach { module -> + appendLine(sha256(module)) + } + fileTree("src/main/jni/librime_jni").forEach { source -> + appendLine(sha256(source)) + } + appendLine(sha256(file("src/main/jni/CMakeLists.txt"))) + } + val hash = sha256(magic) + logger.log(LogLevel.DEBUG, "Native Cache Hash: $hash") + System.getenv("GITHUB_OUTPUT")?.takeIf { it.isNotBlank() }?.let { + File(it).appendText("native-cache-hash=$hash") + } + } + } + } +}