From 2dd10bd4c415a0916862634ba4ed775133946ee1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:07:07 +0000 Subject: [PATCH 1/6] Initial plan From 03b4571a840f51cbb44f8583eded9a6977abefc8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:20:46 +0000 Subject: [PATCH 2/6] Upgrade to Gradle 9.3.0 Co-authored-by: xiang17 <9310587+xiang17@users.noreply.github.com> --- buildSrc/build.gradle.kts | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- smoke-tests/apps/gRPC/build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 144f9565c73..931875db56d 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -44,6 +44,6 @@ dependencies { implementation("gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.9.6") implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.3") - // earlier versions aren't compatible with Gradle 8.1.1 - implementation("org.springframework.boot:spring-boot-gradle-plugin:2.5.12") + // Spring Boot 3.5+ is required for Gradle 9 compatibility + implementation("org.springframework.boot:spring-boot-gradle-plugin:3.5.10") } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da476b..19a6bdeb848 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/smoke-tests/apps/gRPC/build.gradle.kts b/smoke-tests/apps/gRPC/build.gradle.kts index eae03a2ecef..8281fb5022c 100644 --- a/smoke-tests/apps/gRPC/build.gradle.kts +++ b/smoke-tests/apps/gRPC/build.gradle.kts @@ -2,7 +2,7 @@ import com.google.protobuf.gradle.* plugins { id("ai.smoke-test-jar") - id("com.google.protobuf") version "0.8.19" + id("com.google.protobuf") version "0.9.6" } val grpcVersion = "1.26.0" // first version with support for arm64 From 33d9e3209fb162e23059ad8c0f91b3dec84db656 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:32:15 +0000 Subject: [PATCH 3/6] Fix smoke test failures by replacing Spring Boot plugin with Shadow Co-authored-by: xiang17 <9310587+xiang17@users.noreply.github.com> --- buildSrc/build.gradle.kts | 3 --- .../main/kotlin/ai.smoke-test-jar.gradle.kts | 20 ++++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 931875db56d..241cdee77bd 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -43,7 +43,4 @@ dependencies { implementation("gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.9.6") implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.3") - - // Spring Boot 3.5+ is required for Gradle 9 compatibility - implementation("org.springframework.boot:spring-boot-gradle-plugin:3.5.10") } diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index bf6a7dcb5ac..03a62dbcaa0 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -1,11 +1,25 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.microsoft.applicationinsights.gradle.AiSmokeTestExtension plugins { id("ai.smoke-test") - id("org.springframework.boot") + id("com.gradleup.shadow") } val aiSmokeTest = extensions.getByType(AiSmokeTestExtension::class) -aiSmokeTest.testAppArtifactDir.set(tasks.bootJar.flatMap { it.destinationDirectory }) -aiSmokeTest.testAppArtifactFilename.set(tasks.bootJar.flatMap { it.archiveFileName }) +// Create a fat JAR using Shadow instead of Spring Boot plugin for Gradle 9 compatibility +// Spring Boot 2.x doesn't support Gradle 9, and Spring Boot 3.x requires Java 17+ +// Shadow creates a simple fat JAR that works with Java 8 +tasks.named("shadowJar") { + archiveClassifier.set("") + mergeServiceFiles() + + // Use the standard main class convention for smoke test apps + manifest { + attributes["Main-Class"] = "com.microsoft.applicationinsights.smoketestapp.SpringBootApp" + } +} + +aiSmokeTest.testAppArtifactDir.set(tasks.shadowJar.flatMap { it.destinationDirectory }) +aiSmokeTest.testAppArtifactFilename.set(tasks.shadowJar.flatMap { it.archiveFileName }) From 92219f8e262417cb98bd3c6fab3c1a0a6ff960a3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:39:28 +0000 Subject: [PATCH 4/6] Make main class configurable for smoke test apps Co-authored-by: xiang17 <9310587+xiang17@users.noreply.github.com> --- buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts | 10 ++++++++-- smoke-tests/apps/JettyNativeHandler/build.gradle.kts | 3 +++ smoke-tests/apps/ReadOnly/build.gradle.kts | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index 03a62dbcaa0..39c88c33556 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -15,9 +15,15 @@ tasks.named("shadowJar") { archiveClassifier.set("") mergeServiceFiles() - // Use the standard main class convention for smoke test apps + // Set main class - can be overridden by individual projects via mainClassName property manifest { - attributes["Main-Class"] = "com.microsoft.applicationinsights.smoketestapp.SpringBootApp" + val mainClass = if (project.hasProperty("mainClassName")) { + project.property("mainClassName") as String + } else { + // Default main class for most smoke test apps + "com.microsoft.applicationinsights.smoketestapp.SpringBootApp" + } + attributes["Main-Class"] = mainClass } } diff --git a/smoke-tests/apps/JettyNativeHandler/build.gradle.kts b/smoke-tests/apps/JettyNativeHandler/build.gradle.kts index 2bb4f96b5b8..7b2c8cb225f 100644 --- a/smoke-tests/apps/JettyNativeHandler/build.gradle.kts +++ b/smoke-tests/apps/JettyNativeHandler/build.gradle.kts @@ -2,6 +2,9 @@ plugins { id("ai.smoke-test-jar") } +// Override default main class +ext.set("mainClassName", "com.microsoft.applicationinsights.smoketestapp.JettyNativeHandlerApp") + dependencies { implementation("org.springframework.boot:spring-boot-starter:2.5.12") diff --git a/smoke-tests/apps/ReadOnly/build.gradle.kts b/smoke-tests/apps/ReadOnly/build.gradle.kts index 29d8040b549..b2b99c406ac 100644 --- a/smoke-tests/apps/ReadOnly/build.gradle.kts +++ b/smoke-tests/apps/ReadOnly/build.gradle.kts @@ -1,3 +1,6 @@ plugins { id("ai.smoke-test-jar") } + +// Override default main class +ext.set("mainClassName", "com.microsoft.applicationinsights.smoketestapp.App") From 03f6a94702c170141a8f2b63b476684609730adc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 20:05:43 +0000 Subject: [PATCH 5/6] Fix missing Main-Class manifest attribute in smoke test JARs Co-authored-by: xiang17 <9310587+xiang17@users.noreply.github.com> --- buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index 39c88c33556..eb0f321c02c 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -27,5 +27,12 @@ tasks.named("shadowJar") { } } +// Make jar task depend on shadowJar and use the shadow JAR output +// This prevents the regular jar task from overwriting the fat JAR +tasks.named("jar") { + dependsOn(tasks.shadowJar) + enabled = false +} + aiSmokeTest.testAppArtifactDir.set(tasks.shadowJar.flatMap { it.destinationDirectory }) aiSmokeTest.testAppArtifactFilename.set(tasks.shadowJar.flatMap { it.archiveFileName }) From d97d564f9efdf8bce1e9882da9ebb7f5c497581f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:20:02 +0000 Subject: [PATCH 6/6] Fix Spring Boot auto-configuration by appending spring.factories Co-authored-by: xiang17 <9310587+xiang17@users.noreply.github.com> --- buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index eb0f321c02c..62057c978f8 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -1,4 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer import com.microsoft.applicationinsights.gradle.AiSmokeTestExtension plugins { @@ -15,6 +16,10 @@ tasks.named("shadowJar") { archiveClassifier.set("") mergeServiceFiles() + // Append spring.factories files from all dependencies + // This is required for Spring Boot auto-configuration to work + append("META-INF/spring.factories") + // Set main class - can be overridden by individual projects via mainClassName property manifest { val mainClass = if (project.hasProperty("mainClassName")) {