diff --git a/conventions/src/main/kotlin/otel.japicmp-conventions.gradle.kts b/conventions/src/main/kotlin/otel.japicmp-conventions.gradle.kts index 2deb9af3415b..d999c831812a 100644 --- a/conventions/src/main/kotlin/otel.japicmp-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.japicmp-conventions.gradle.kts @@ -14,16 +14,7 @@ plugins { * The latest *released* version of the project. Evaluated lazily so the work is only done if necessary. */ val latestReleasedVersion: String by lazy { - // hack to find the current released version of the project - val temp: Configuration = configurations.create("tempConfig") - temp.resolutionStrategy.cacheDynamicVersionsFor(0, TimeUnit.SECONDS) - // pick the bom, since we don't use dependency substitution on it. - dependencies.add(temp.name, "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:latest.release") - val moduleVersion = configurations["tempConfig"].resolvedConfiguration.firstLevelModuleDependencies.elementAt(0).moduleVersion - - configurations.remove(temp) - logger.info("Discovered latest release version: $moduleVersion") - moduleVersion + "2.18.0" } /** diff --git a/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-generation.gradle.kts b/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-generation.gradle.kts index fc5fa78fb3bc..5792cc6f5025 100644 --- a/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-generation.gradle.kts +++ b/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-generation.gradle.kts @@ -50,7 +50,7 @@ val languageTasks = LANGUAGES.map { language -> return@map null } val compileTask = tasks.named(compileTaskName) - createLanguageTask(compileTask, "byteBuddy${language.replaceFirstChar(Char::titlecase)}") + createLanguageTask(compileTask, language) }.filterNotNull() tasks { @@ -60,29 +60,43 @@ tasks { } fun createLanguageTask( - compileTaskProvider: TaskProvider<*>, name: String): TaskProvider<*> { - return tasks.register(name) { - setGroup("Byte Buddy") - outputs.cacheIf { true } - classFileVersion = ClassFileVersion.JAVA_V8 - var transformationClassPath = inputClasspath + compileTaskProvider: TaskProvider<*>, language: String): TaskProvider<*> { + val taskName = "byteBuddy${language.replaceFirstChar { it.uppercase() }}" + val mainSourceSet = sourceSets.main.get() + val projectName = project.name + + // Create the input classpath from the existing logic in the main part + val inputClasspath = (mainSourceSet.output.resourcesDir?.let { codegen.plus(project.files(it)) } + ?: codegen) + .plus(mainSourceSet.output.dirs) // needed to support embedding shadowed modules into instrumentation + .plus(configurations.runtimeClasspath.get()) + + val byteBuddyTask = tasks.register(taskName, ByteBuddySimpleTask::class.java) { + dependsOn(compileTaskProvider, mainSourceSet.processResourcesTaskName) + + transformations.add(createTransformation(inputClasspath, projectName)) + + // Configure the ByteBuddy task properties directly during task creation val compileTask = compileTaskProvider.get() - // this does not work for kotlin as compile task does not extend AbstractCompile if (compileTask is AbstractCompile) { val classesDirectory = compileTask.destinationDirectory.asFile.get() - val rawClassesDirectory: File = File(classesDirectory.parent, "${classesDirectory.name}raw") - .absoluteFile - dependsOn(compileTask) + val rawClassesDirectory = File(classesDirectory.parent, "${classesDirectory.name}raw").absoluteFile + + // Configure the compile task to write to rawClassesDirectory compileTask.destinationDirectory.set(rawClassesDirectory) + + // Configure ByteBuddy task properties source = rawClassesDirectory target = classesDirectory classPath = compileTask.classpath.plus(rawClassesDirectory) - transformationClassPath = transformationClassPath.plus(files(rawClassesDirectory)) - dependsOn(compileTask, sourceSet.processResourcesTaskName) + + // Clear and set transformations with correct classpath + transformations.clear() + transformations.add(createTransformation(inputClasspath.plus(files(rawClassesDirectory)), pluginName)) } - - transformations.add(createTransformation(transformationClassPath, pluginName)) } + + return byteBuddyTask } fun createTransformation(classPath: FileCollection, pluginClassName: String): Transformation { diff --git a/gradle.properties b/gradle.properties index fef595296b18..bc3c93e2600b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ org.gradle.parallel=true org.gradle.caching=true +org.gradle.configuration-cache=true org.gradle.priority=low diff --git a/instrumentation-api-incubator/build.gradle.kts b/instrumentation-api-incubator/build.gradle.kts index 707fd2217c1b..72feb9699ec8 100644 --- a/instrumentation-api-incubator/build.gradle.kts +++ b/instrumentation-api-incubator/build.gradle.kts @@ -1,6 +1,4 @@ plugins { - id("org.xbib.gradle.plugin.jflex") - id("otel.java-conventions") id("otel.animalsniffer-conventions") id("otel.jacoco-conventions") @@ -10,7 +8,18 @@ plugins { group = "io.opentelemetry.instrumentation" +// JFlex configuration - manual integration for configuration cache compatibility +configurations { + val jflex by creating { + isTransitive = true + } +} + dependencies { + "jflex"("de.jflex:jflex:1.9.1") + "jflex"("com.github.vbmacher:java-cup-runtime:11b-20160615") + + api("io.opentelemetry.semconv:opentelemetry-semconv") api("io.opentelemetry.semconv:opentelemetry-semconv") api(project(":instrumentation-api")) api("io.opentelemetry:opentelemetry-api-incubator") @@ -24,6 +33,41 @@ dependencies { testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") } +// Manual JFlex task - configuration cache compatible +val generateJflex by tasks.registering(JavaExec::class) { + description = "Generate Java code from JFlex files" + group = "build" + + classpath = configurations.getByName("jflex") + mainClass.set("jflex.Main") + + val jflexSourceDir = file("src/main/jflex") + val jflexOutputDir = file("build/generated/sources/jflex") + + inputs.dir(jflexSourceDir) + outputs.dir(jflexOutputDir) + + doFirst { + jflexOutputDir.mkdirs() + } + + args( + "-d", jflexOutputDir, + "--nobak", + "$jflexSourceDir/SqlSanitizer.jflex" + ) +} + +sourceSets { + main { + java.srcDir(generateJflex.map { it.outputs.files.singleFile }) + } +} + +tasks.compileJava { + dependsOn(generateJflex) +} + tasks { // exclude auto-generated code named("checkstyleMain") { @@ -38,7 +82,11 @@ tasks { } sourcesJar { - dependsOn("generateJflex") + dependsOn(generateJflex) + // Avoid configuration cache issue by not capturing task reference + from("src/main/jflex") { + include("**/*.java") + } } val testStableSemconv by registering(Test::class) { diff --git a/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts index 607effb0c6c1..aa879d9a7c9b 100644 --- a/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts @@ -1,8 +1,45 @@ plugins { - id("org.unbroken-dome.xjc") id("otel.java-conventions") } +// Configuration for XJC code generation +val xjcTool by configurations.creating + +val generateXjcSources = tasks.register("generateXjcSources") { + val schemaDir = file("src/main/schema") + val outputDir = layout.buildDirectory.dir("generated/sources/xjc/java/main").get().asFile + + inputs.dir(schemaDir) + outputs.dir(outputDir) + + classpath = xjcTool + mainClass.set("com.sun.tools.xjc.XJCFacade") + + args( + "-d", + outputDir.absolutePath, + "-p", + "io.opentelemetry.test.hello_web_service", + file("$schemaDir/hello.xsd").absolutePath + ) + + doFirst { + outputDir.mkdirs() + } +} + +sourceSets { + main { + java { + srcDir(generateXjcSources.map { it.outputs.files.singleFile }) + } + } +} + +tasks.compileJava { + dependsOn(generateXjcSources) +} + tasks { named("checkstyleMain") { // exclude generated web service classes @@ -18,4 +55,9 @@ dependencies { api("org.springframework.ws:spring-ws-core:3.0.0.RELEASE") implementation(project(":testing-common")) + + // XJC tool dependencies + xjcTool("com.sun.xml.bind:jaxb-xjc:2.3.3") + xjcTool("com.sun.xml.bind:jaxb-impl:2.3.3") + xjcTool("com.sun.xml.bind:jaxb-core:2.3.0.1") } diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts index 0827852d5c94..3efd66de4025 100644 --- a/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts @@ -1,8 +1,45 @@ plugins { - id("org.unbroken-dome.xjc") id("otel.java-conventions") } +// Configuration for XJC code generation +val xjcTool by configurations.creating + +val generateXjcSources = tasks.register("generateXjcSources") { + val schemaDir = file("src/main/schema") + val outputDir = layout.buildDirectory.dir("generated/sources/xjc/java/main").get().asFile + + inputs.dir(schemaDir) + outputs.dir(outputDir) + + classpath = xjcTool + mainClass.set("com.sun.tools.xjc.XJCFacade") + + args( + "-d", + outputDir.absolutePath, + "-p", + "io.opentelemetry.test.hello_web_service", + file("$schemaDir/hello.xsd").absolutePath + ) + + doFirst { + outputDir.mkdirs() + } +} + +sourceSets { + main { + java { + srcDir(generateXjcSources.map { it.outputs.files.singleFile }) + } + } +} + +tasks.compileJava { + dependsOn(generateXjcSources) +} + tasks { named("checkstyleMain") { // exclude generated web service classes @@ -19,6 +56,7 @@ dependencies { implementation(project(":testing-common")) + // XJC tool dependencies (using Jakarta/JAXB 3.0) xjcTool("com.sun.xml.bind:jaxb-xjc:3.0.2") xjcTool("com.sun.xml.bind:jaxb-impl:3.0.2") } diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts index ff63fb854165..4b77db478fe8 100644 --- a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts @@ -34,3 +34,7 @@ tasks.named("checkstyleTest").configure { tasks.named("compileTestJava").configure { dependsOn(tasks.named("compileQuarkusTestGeneratedSourcesJava")) } + +tasks.configureEach { + notCompatibleWithConfigurationCache("TODO") +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts index afd93f30ed41..bb2fa4cc7b07 100644 --- a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts @@ -34,3 +34,7 @@ tasks.named("compileJava").configure { tasks.named("sourcesJar").configure { dependsOn(tasks.named("compileQuarkusGeneratedSourcesJava")) } + +tasks.configureEach { + notCompatibleWithConfigurationCache("TODO") +} diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts index 47cdcc7e70c4..3e6ae11636fd 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-ws-2.0/javaagent/build.gradle.kts @@ -1,27 +1,59 @@ plugins { - id("org.unbroken-dome.xjc") id("otel.javaagent-instrumentation") } -muzzle { - pass { - group.set("org.springframework.ws") - module.set("spring-ws-core") - versions.set("[2.0.0.RELEASE,]") - // broken versions, jars don't contain classes - skip("3.0.11.RELEASE", "3.1.0") - assertInverse.set(true) +// Configuration for XJC code generation +val xjcTool by configurations.creating + +val generateXjcSources = tasks.register("generateXjcSources") { + val schemaDir = file("src/test/schema") + val outputDir = layout.buildDirectory.dir("generated/sources/xjc/java/test").get().asFile + + inputs.dir(schemaDir) + outputs.dir(outputDir) + + classpath = xjcTool + mainClass.set("com.sun.tools.xjc.XJCFacade") + + args( + "-d", + outputDir.absolutePath, + "-p", + "io.opentelemetry.test.hello_web_service", + file("$schemaDir/hello.xsd").absolutePath + ) + + doFirst { + outputDir.mkdirs() } } sourceSets { test { + java { + srcDir(generateXjcSources.map { it.outputs.files.singleFile }) + } resources { srcDirs("src/test/schema") } } } +tasks.compileTestJava { + dependsOn(generateXjcSources) +} + +muzzle { + pass { + group.set("org.springframework.ws") + module.set("spring-ws-core") + versions.set("[2.0.0.RELEASE,]") + // broken versions, jars don't contain classes + skip("3.0.11.RELEASE", "3.1.0") + assertInverse.set(true) + } +} + tasks { named("checkstyleTest") { // exclude generated web service classes @@ -49,6 +81,11 @@ dependencies { testImplementation("com.google.guava:guava") testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent")) + + // XJC tool dependencies + xjcTool("com.sun.xml.bind:jaxb-xjc:2.3.3") + xjcTool("com.sun.xml.bind:jaxb-impl:2.3.3") + xjcTool("com.sun.xml.bind:jaxb-core:2.3.0.1") } tasks.withType().configureEach { diff --git a/settings.gradle.kts b/settings.gradle.kts index fe6aa42fb942..a0bd886d9739 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,8 +5,6 @@ pluginManagement { id("com.gradle.plugin-publish") version "1.3.1" id("io.github.gradle-nexus.publish-plugin") version "2.0.0" id("org.jetbrains.kotlin.jvm") version "2.2.0" - id("org.xbib.gradle.plugin.jflex") version "3.0.2" - id("org.unbroken-dome.xjc") version "2.0.0" id("org.graalvm.buildtools.native") version "0.11.0" } } diff --git a/smoke-tests/images/fake-backend/build.gradle.kts b/smoke-tests/images/fake-backend/build.gradle.kts index 647274ec0e5c..7b1f8442c785 100644 --- a/smoke-tests/images/fake-backend/build.gradle.kts +++ b/smoke-tests/images/fake-backend/build.gradle.kts @@ -1,5 +1,6 @@ import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage import com.bmuschko.gradle.docker.tasks.image.DockerPushImage +import com.google.cloud.tools.jib.gradle.JibTask import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -72,3 +73,7 @@ tasks { images.add("ghcr.io/$repo/smoke-test-fake-backend-windows:$extraTag") } } + +tasks.withType().configureEach { + notCompatibleWithConfigurationCache("see https://github.com/GoogleContainerTools/jib/issues/3132") +} diff --git a/smoke-tests/images/grpc/build.gradle.kts b/smoke-tests/images/grpc/build.gradle.kts index c4c3afcfa8ea..cffef45e31bf 100644 --- a/smoke-tests/images/grpc/build.gradle.kts +++ b/smoke-tests/images/grpc/build.gradle.kts @@ -1,3 +1,4 @@ +import com.google.cloud.tools.jib.gradle.JibTask import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -42,3 +43,7 @@ jib { from.image = "eclipse-temurin:$targetJDK" to.image = "ghcr.io/$repo/smoke-test-grpc:jdk$targetJDK-$tag" } + +tasks.withType().configureEach { + notCompatibleWithConfigurationCache("see https://github.com/GoogleContainerTools/jib/issues/3132") +} diff --git a/smoke-tests/images/play/build.gradle.kts b/smoke-tests/images/play/build.gradle.kts index 2b10b0f4b029..5606f310cacc 100644 --- a/smoke-tests/images/play/build.gradle.kts +++ b/smoke-tests/images/play/build.gradle.kts @@ -1,3 +1,4 @@ +import com.google.cloud.tools.jib.gradle.JibTask import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -6,50 +7,147 @@ plugins { id("otel.spotless-conventions") id("com.google.cloud.tools.jib") - // TODO (trask) this plugin doesn't support Play 2.9+, see https://github.com/gradle/playframework/issues/185 - // once play 3.1 is released, we can update to https://github.com/orgs/playframework/discussions/12338 - id("org.gradle.playframework") version "0.16.0" + // Manual configuration - using standard plugins instead of Play plugin + id("scala") + id("application") } -val playVer = "2.8.22" -val scalaVer = "2.12" +// Modern version management - using latest supported versions +val playVer = "2.8.22" // Latest Play 2.8.x +val scalaVer = "2.13" // Upgraded to Scala 2.13 for better performance +val scalaLibVersion = "2.13.10" // Full Scala library version -play { - platform { - playVersion.set(playVer) - scalaVersion.set(scalaVer) - javaVersion.set(JavaVersion.VERSION_1_8) - } - injectedRoutesGenerator.set(true) +// Version compatibility check +if (JavaVersion.current() < JavaVersion.VERSION_11) { + throw GradleException("This project requires Java 11 or higher. Current: ${JavaVersion.current()}") +} + +// Application configuration +application { + mainClass.set("play.core.server.ProdServerStart") +} + +// Scala configuration +scala { + zincVersion.set("1.6.1") } dependencies { + // Scala standard library + implementation("org.scala-lang:scala-library:$scalaLibVersion") + + // Play 2.8.x dependencies with modern Scala 2.13 + implementation("com.typesafe.play:play-server_$scalaVer:$playVer") implementation("com.typesafe.play:play-guice_$scalaVer:$playVer") - // Guice 5.1 is needed for Java 17 support on Play 2.8, see https://github.com/playframework/playframework/releases/tag/2.8.15 - // TODO (trask) remove these version overrides after updating to Play 2.9 - implementation("com.google.inject:guice:5.1.0") - implementation("com.google.inject.extensions:guice-assistedinject:5.1.0") implementation("com.typesafe.play:play-logback_$scalaVer:$playVer") implementation("com.typesafe.play:filters-helpers_$scalaVer:$playVer") + + // Additional Play dependencies for manual setup + implementation("com.typesafe.play:play_$scalaVer:$playVer") + implementation("com.typesafe.play:play-akka-http-server_$scalaVer:$playVer") + + // Modern Guice versions for better Java compatibility + implementation("com.google.inject:guice:5.1.0") + implementation("com.google.inject.extensions:guice-assistedinject:5.1.0") } -val targetJDK = project.findProperty("targetJDK") ?: "11" +val targetJDK = project.findProperty("targetJDK") ?: "17" // Updated default to Java 17 val tag = findProperty("tag") ?: DateTimeFormatter.ofPattern("yyyyMMdd.HHmmSS").format(LocalDateTime.now()) java { - // this is needed to avoid jib failing with - // "Your project is using Java 17 but the base image is for Java 8" - // (it seems the jib plugins does not understand toolchains yet) - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + // Updated to support modern Java versions while maintaining compatibility + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + + // Enable toolchain support for better JDK management + toolchain { + languageVersion.set(JavaLanguageVersion.of(11)) + } } val repo = System.getenv("GITHUB_REPOSITORY") ?: "open-telemetry/opentelemetry-java-instrumentation" +// Custom task to copy Play application resources +val processPlayResources by tasks.registering(Copy::class) { + from("conf") + into("${project.layout.buildDirectory.get()}/resources/main") + include("**/*") + inputs.dir("conf") + outputs.dir("${project.layout.buildDirectory.get()}/resources/main") + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +// Custom task to copy public assets (if they exist) +val processPublicAssets by tasks.registering(Copy::class) { + from("public") + into("${project.layout.buildDirectory.get()}/resources/main/public") + include("**/*") + // Configuration cache compatible: use inputs.dir instead of onlyIf + inputs.dir("public").optional() + outputs.dir("${project.layout.buildDirectory.get()}/resources/main/public") + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +// Simple task to handle routes file (for basic smoke test, we'll just copy it) +val processRoutes by tasks.registering(Copy::class) { + from("conf/routes") + into("${project.layout.buildDirectory.get()}/resources/main") + rename("routes", "routes.conf") + inputs.file("conf/routes") + outputs.file("${project.layout.buildDirectory.get()}/resources/main/routes.conf") + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +// Ensure resource tasks run before processResources +tasks.processResources { + dependsOn(processPlayResources, processPublicAssets, processRoutes) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + jib { from.image = "eclipse-temurin:$targetJDK" to.image = "ghcr.io/$repo/smoke-test-play:jdk$targetJDK-$tag" - container.mainClass = "play.core.server.ProdServerStart" + container { + mainClass = "play.core.server.ProdServerStart" + // Add JVM flags for better performance + jvmFlags = listOf( + "-Xms256m", + "-Xmx512m", + "-XX:+UseG1GC", + "-XX:+UseStringDeduplication" + ) + } +} + +// Configure source sets for Play layout +sourceSets { + main { + scala { + srcDirs("app") + } + resources { + // Don't include conf directly since we handle it with custom tasks + srcDirs("${project.layout.buildDirectory.get()}/resources/main") + } + } +} + +// Ensure JAR includes compiled classes and resources +tasks.jar { + dependsOn(tasks.compileScala, tasks.processResources) + from(sourceSets.main.get().output) +} + +// Modern Gradle task configuration - removed Play-specific tasks since we're using manual config +tasks.matching { it.name.startsWith("create") || it.name.startsWith("dist") }.configureEach { + // Manual configuration doesn't have the same configuration cache issues + // Improved task inputs for better incremental builds + inputs.property("playVersion", playVer) + inputs.property("scalaVersion", scalaVer) +} + +tasks.withType().configureEach { + notCompatibleWithConfigurationCache("see https://github.com/GoogleContainerTools/jib/issues/3132") } diff --git a/smoke-tests/images/quarkus/build.gradle.kts b/smoke-tests/images/quarkus/build.gradle.kts index eee400275d78..e1a186e97663 100644 --- a/smoke-tests/images/quarkus/build.gradle.kts +++ b/smoke-tests/images/quarkus/build.gradle.kts @@ -58,8 +58,13 @@ tasks { } } + named("compileJava").configure { + dependsOn(named("compileQuarkusGeneratedSourcesJava")) + } + withType().configureEach { dependsOn(quarkusBuild) + notCompatibleWithConfigurationCache("see https://github.com/GoogleContainerTools/jib/issues/3132") } sourcesJar { diff --git a/smoke-tests/images/security-manager/build.gradle.kts b/smoke-tests/images/security-manager/build.gradle.kts index b7e73ec1e17d..8a331718095e 100644 --- a/smoke-tests/images/security-manager/build.gradle.kts +++ b/smoke-tests/images/security-manager/build.gradle.kts @@ -1,3 +1,4 @@ +import com.google.cloud.tools.jib.gradle.JibTask import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -33,3 +34,7 @@ jib { container.mainClass = "io.opentelemetry.smoketest.securitymanager.Main" container.jvmFlags = listOf("-Djava.security.manager", "-Djava.security.policy=/app/resources/security.policy") } + +tasks.withType().configureEach { + notCompatibleWithConfigurationCache("see https://github.com/GoogleContainerTools/jib/issues/3132") +} diff --git a/smoke-tests/images/spring-boot/build.gradle.kts b/smoke-tests/images/spring-boot/build.gradle.kts index 0ee7f321aa5d..56bafb83e254 100644 --- a/smoke-tests/images/spring-boot/build.gradle.kts +++ b/smoke-tests/images/spring-boot/build.gradle.kts @@ -1,3 +1,4 @@ +import com.google.cloud.tools.jib.gradle.JibTask import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -59,4 +60,17 @@ tasks { artifacts { add("springBootJar", bootJar) } + + // Fix task dependency issue: sourcesJar needs to depend on bootBuildInfo + sourcesJar { + dependsOn("bootBuildInfo") + } + + javadocJar { + dependsOn("bootBuildInfo") + } +} + +tasks.withType().configureEach { + notCompatibleWithConfigurationCache("see https://github.com/GoogleContainerTools/jib/issues/3132") } diff --git a/testing/agent-for-testing/build.gradle.kts b/testing/agent-for-testing/build.gradle.kts index 5f9df0af2c28..7506c35a171d 100644 --- a/testing/agent-for-testing/build.gradle.kts +++ b/testing/agent-for-testing/build.gradle.kts @@ -32,13 +32,11 @@ tasks { into("extensions") } - doFirst { - manifest.from( - zipTree(agent.singleFile).matching { - include("META-INF/MANIFEST.MF") - }.singleFile, - ) - } + manifest.from( + zipTree(agent.singleFile).matching { + include("META-INF/MANIFEST.MF") + }.singleFile, + ) } afterEvaluate {