mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-05 19:28:25 +00:00
fix(ci): serialize :amethyst Kotlin compilations to stop daemon OOMs
CI runs die with java.lang.OutOfMemoryError (GC overhead limit exceeded / Java heap space) inside the shared Kotlin compile daemon when two variant compilations of :amethyst run at the same time — e.g. compilePlayDebugKotlin and compilePlayBenchmarkKotlin in the test-and-build-android job, which demands four :amethyst variants (unit tests, lint, assembleBenchmark) in one invocation. KotlinCompile submits its work asynchronously via the Worker API, so the project lock is released while compilation is still running in the daemon and Gradle happily starts the next variant's compile task in parallel; two full :amethyst codegen passes no longer fit the daemon's -Xmx8g heap (see runs 29260711359 and 29248908870; removing Kover in #3539 helped but was not sufficient). Register a no-op shared build service with maxParallelUsages = 1 and make every :amethyst KotlinCompile task use it. The scheduler then runs this module's Kotlin compilations one at a time — a task holding the service is not complete until its async worker finishes — while all other work (other modules' compilation, JVM tests, lint analysis, packaging) keeps running in parallel. Verified with Worker-API probe tasks: unconstrained same-project tasks start simultaneously; with usesService they run strictly one after the other. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018ifbUGCADckUb3zaox9wBo
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
import org.gradle.api.services.BuildService
|
||||
import org.gradle.api.services.BuildServiceParameters
|
||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.androidApplication)
|
||||
@@ -342,6 +345,25 @@ kotlin {
|
||||
}
|
||||
}
|
||||
|
||||
// Gradle schedules Kotlin compilations of different variants of this module
|
||||
// concurrently (e.g. playDebug + playBenchmark when CI runs unit tests, lint,
|
||||
// and assembleBenchmark in one invocation), but they all share a single Kotlin
|
||||
// daemon whose heap (kotlin.daemon.jvmargs) cannot fit two full :amethyst
|
||||
// codegen passes — CI runs died with "GC overhead limit exceeded" inside the
|
||||
// daemon. This no-op shared build service with maxParallelUsages = 1 tells the
|
||||
// scheduler to run this module's Kotlin compile tasks one at a time; other
|
||||
// projects' tasks (JVM tests, lint analysis, packaging) still run in parallel.
|
||||
abstract class AmethystKotlinCompileLimiter : BuildService<BuildServiceParameters.None>
|
||||
|
||||
val kotlinCompileLimiter =
|
||||
gradle.sharedServices.registerIfAbsent("amethystKotlinCompileLimiter", AmethystKotlinCompileLimiter::class) {
|
||||
maxParallelUsages.set(1)
|
||||
}
|
||||
|
||||
tasks.withType<KotlinCompile>().configureEach {
|
||||
usesService(kotlinCompileLimiter)
|
||||
}
|
||||
|
||||
composeCompiler {
|
||||
reportsDestination = layout.buildDirectory.dir("compose_compiler")
|
||||
metricsDestination = layout.buildDirectory.dir("compose_compiler")
|
||||
|
||||
Reference in New Issue
Block a user