From 674918154ff31d0060087133682ebb3ae4bf0f78 Mon Sep 17 00:00:00 2001 From: Richard Li Date: Tue, 14 Jan 2025 16:21:23 -0800 Subject: [PATCH 1/5] build: move coverage reports to jacoco-report-aggregation --- buildspec/linuxTests.yml | 2 +- coverage-report/build.gradle.kts | 29 +++++++++++++++++++++++++++++ settings.gradle.kts | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 coverage-report/build.gradle.kts diff --git a/buildspec/linuxTests.yml b/buildspec/linuxTests.yml index 8a6ce32d178..ada8aa3a9a8 100644 --- a/buildspec/linuxTests.yml +++ b/buildspec/linuxTests.yml @@ -35,7 +35,7 @@ phases: fi - chmod +x gradlew - - su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME check coverageReport --info --console plain --continue" + - su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME check testCodeCoverageReport --info --console plain --continue" - su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME buildPlugin" - VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}" - CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g') # Encode `#` in the URL because otherwise the url is clipped in the Codecov.io site diff --git a/coverage-report/build.gradle.kts b/coverage-report/build.gradle.kts new file mode 100644 index 00000000000..3c522330a74 --- /dev/null +++ b/coverage-report/build.gradle.kts @@ -0,0 +1,29 @@ +import kotlin.io.extension + +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +plugins { + base + id("jacoco-report-aggregation") +} + +dependencies { + jacocoAggregation(project(":plugin-toolkit:intellij-standalone")) + jacocoAggregation(project(":plugin-core")) + jacocoAggregation(project(":plugin-amazonq")) + + project.findProject(":plugin-toolkit:jetbrains-gateway")?.let { + jacocoAggregation(it) + } + + jacocoAggregation(project(":ui-tests")) +} + +reporting { + reports { + val testCodeCoverageReport by creating(JacocoCoverageReport::class) { + testType = TestSuiteType.UNIT_TEST + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index c6872181877..dad3bcb4125 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -98,6 +98,7 @@ include("detekt-rules") include("ui-tests") include("sandbox-all") include("ui-tests-starter") +include("coverage-report") when (providers.gradleProperty("ideProfileName").get()) { // FIX_WHEN_MIN_IS_242: `tmp-all` test module no longer needed in 242+ "2023.3", "2024.1" -> { From 29f5b540beda3e5b02e25e02a69b8ef6abe0330c Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 15 Jan 2025 13:31:53 -0800 Subject: [PATCH 2/5] report --- buildspec/linuxTests.yml | 1 + coverage-report/build.gradle.kts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/buildspec/linuxTests.yml b/buildspec/linuxTests.yml index ada8aa3a9a8..114d67be5ab 100644 --- a/buildspec/linuxTests.yml +++ b/buildspec/linuxTests.yml @@ -52,6 +52,7 @@ phases: - mkdir -p $BUILD_ARTIFACTS - rsync -rmq --include='*/' --include '**/build/idea-sandbox/**/log*/**' --exclude='*' . $TEST_ARTIFACTS/ || true - rsync -rmq --include='*/' --include '**/build/reports/**' --exclude='*' . $TEST_ARTIFACTS/ || true + - rsync -rmq --include='*/' --include '**/build/**/*.exec' --exclude='*' . $TEST_ARTIFACTS/ || true - rsync -rmq --include='*/' --include '**/test-results/**/*.xml' --exclude='*' . $TEST_ARTIFACTS/test-reports || true - find plugins -path '*/build/distributions/*.zip' -exec cp {} $BUILD_ARTIFACTS/ \; || touch $BUILD_ARTIFACTS/build_failed diff --git a/coverage-report/build.gradle.kts b/coverage-report/build.gradle.kts index 3c522330a74..45d6a576305 100644 --- a/coverage-report/build.gradle.kts +++ b/coverage-report/build.gradle.kts @@ -24,6 +24,15 @@ reporting { reports { val testCodeCoverageReport by creating(JacocoCoverageReport::class) { testType = TestSuiteType.UNIT_TEST + // https://github.com/gradle/gradle/issues/20026 + reportTask.configure { + classDirectories.setFrom(classDirectories.map { + fileTree(it).matching { + include("**/software/aws/toolkits/**") + exclude("**/software/aws/toolkits/telemetry/**") + } + }) + } } } } From acad41adc3121c71e99af8c05f8656a87dd001aa Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 15 Jan 2025 14:33:45 -0800 Subject: [PATCH 3/5] internal magic --- .../kotlin/toolkit-jacoco-report.gradle.kts | 50 ++++++++++--------- .../main/kotlin/toolkit-testing.gradle.kts | 32 ++++++------ buildspec/linuxTests.yml | 2 +- 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/buildSrc/src/main/kotlin/toolkit-jacoco-report.gradle.kts b/buildSrc/src/main/kotlin/toolkit-jacoco-report.gradle.kts index 271dd95261a..44a08e4fd75 100644 --- a/buildSrc/src/main/kotlin/toolkit-jacoco-report.gradle.kts +++ b/buildSrc/src/main/kotlin/toolkit-jacoco-report.gradle.kts @@ -1,3 +1,6 @@ +import org.gradle.api.plugins.jvm.internal.JvmPluginServices +import org.gradle.kotlin.dsl.support.serviceOf + // Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 @@ -21,26 +24,27 @@ val aggregateCoverage by configurations.creating { isCanBeConsumed = false } -// Resolvable configuration to resolve the classes of all dependencies -val classPath by configurations.creating { +val aggregateCoverageReportResults by configurations.creating { isVisible = false - isCanBeResolved = true - isCanBeConsumed = false extendsFrom(aggregateCoverage) +} +// magic to resolve all project dependencies transitively +serviceOf().configureAsRuntimeClasspath(aggregateCoverageReportResults) + + +// view to resolve the classes of all dependencies +val classPath = aggregateCoverageReportResults.incoming.artifactView { + componentFilter { it is ProjectComponentIdentifier } attributes { - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.CLASSES)) - attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL)) } } -// A resolvable configuration to collect source code -val sourcesPath by configurations.creating { - isVisible = false - isCanBeResolved = true - isCanBeConsumed = false - extendsFrom(aggregateCoverage) + +// view to collect source code +val sourcesPath = aggregateCoverageReportResults.incoming.artifactView { + withVariantReselection() + componentFilter { it is ProjectComponentIdentifier } attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.VERIFICATION)) attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL)) @@ -49,29 +53,27 @@ val sourcesPath by configurations.creating { } // A resolvable configuration to collect JaCoCo coverage data -val coverageDataPath by configurations.creating { - isVisible = false - isCanBeResolved = true - isCanBeConsumed = false - extendsFrom(aggregateCoverage) +val coverageDataPath = aggregateCoverageReportResults.incoming.artifactView { + withVariantReselection() + componentFilter { it is ProjectComponentIdentifier } attributes { - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) - attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("jacoco-coverage-data")) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.VERIFICATION)) + attribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE, objects.named(VerificationType.JACOCO_RESULTS)) + attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.BINARY_DATA_TYPE) } } // Register a code coverage report task to generate the aggregated report tasks.register("coverageReport") { additionalClassDirs( - classPath.filter { it.isDirectory }.asFileTree.matching { + classPath.files.filter { it.isDirectory }.asFileTree.matching { include("**/software/aws/toolkits/**") exclude("**/software/aws/toolkits/telemetry/**") } ) - additionalSourceDirs(sourcesPath.incoming.artifactView { lenient(true) }.files) - executionData(coverageDataPath.incoming.artifactView { lenient(true) }.files.filter { it.exists() && it.extension == "exec" }) + additionalSourceDirs(sourcesPath.files) + executionData(coverageDataPath.files) reports { html.required.set(true) diff --git a/buildSrc/src/main/kotlin/toolkit-testing.gradle.kts b/buildSrc/src/main/kotlin/toolkit-testing.gradle.kts index ca37a88d9c1..00070ec7a84 100644 --- a/buildSrc/src/main/kotlin/toolkit-testing.gradle.kts +++ b/buildSrc/src/main/kotlin/toolkit-testing.gradle.kts @@ -102,19 +102,19 @@ tasks.jacocoTestReport.configure { enabled = false } -// Share the coverage data to be aggregated for the whole product -// this can be removed once we're using jvm-test-suites properly -configurations.register("coverageDataElements") { - isVisible = false - isCanBeResolved = false - isCanBeConsumed = true - extendsFrom(configurations.implementation.get()) - attributes { - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) - attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("jacoco-coverage-data")) - } - tasks.withType().configureEach { - outgoing.artifact(extensions.getByType().destinationFile!!) - } -} +//// Share the coverage data to be aggregated for the whole product +//// this can be removed once we're using jvm-test-suites properly +//configurations.register("coverageDataElements") { +// isVisible = false +// isCanBeResolved = false +// isCanBeConsumed = true +// extendsFrom(configurations.implementation.get()) +// attributes { +// attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) +// attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) +// attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("jacoco-coverage-data")) +// } +// tasks.withType().configureEach { +// outgoing.artifact(extensions.getByType().destinationFile!!) +// } +//} diff --git a/buildspec/linuxTests.yml b/buildspec/linuxTests.yml index 114d67be5ab..5b35b7cd0c2 100644 --- a/buildspec/linuxTests.yml +++ b/buildspec/linuxTests.yml @@ -35,7 +35,7 @@ phases: fi - chmod +x gradlew - - su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME check testCodeCoverageReport --info --console plain --continue" + - su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME check coverageReport --info --console plain --continue" - su codebuild-user -c "./gradlew -PideProfileName=$ALTERNATIVE_IDE_PROFILE_NAME buildPlugin" - VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}" - CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g') # Encode `#` in the URL because otherwise the url is clipped in the Codecov.io site From 2e4eee21cbb487a1e70971b0438e9d290ce13f76 Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 15 Jan 2025 15:52:42 -0800 Subject: [PATCH 4/5] unusable --- buildspec/linuxTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildspec/linuxTests.yml b/buildspec/linuxTests.yml index 5b35b7cd0c2..066b3ebf89b 100644 --- a/buildspec/linuxTests.yml +++ b/buildspec/linuxTests.yml @@ -42,7 +42,7 @@ phases: - CI_BUILD_ID="${CODEBUILD_BUILD_ID}" - test -n "$CODE_COV_TOKEN" && curl -Os https://uploader.codecov.io/latest/linux/codecov && chmod +x codecov || true # this sometimes times out but we don't want to fail the build - test -n "$CODE_COV_TOKEN" && test -n "$CODEBUILD_BUILD_SUCCEEDING" && ./codecov -t $CODE_COV_TOKEN -F unittest || true - - test -n "$CODE_COV_TOKEN" && test -n "$CODEBUILD_BUILD_SUCCEEDING" && ./codecov -t $CODE_COV_TOKEN -F codewhisperer || true +# - test -n "$CODE_COV_TOKEN" && test -n "$CODEBUILD_BUILD_SUCCEEDING" && ./codecov -t $CODE_COV_TOKEN -F codewhisperer || true post_build: commands: From 477785bfb5916a33500f063d95687d92119eea15 Mon Sep 17 00:00:00 2001 From: Richard Li <742829+rli@users.noreply.github.com> Date: Fri, 17 Jan 2025 10:26:08 -0800 Subject: [PATCH 5/5] Update settings.gradle.kts --- settings.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index dad3bcb4125..c6872181877 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -98,7 +98,6 @@ include("detekt-rules") include("ui-tests") include("sandbox-all") include("ui-tests-starter") -include("coverage-report") when (providers.gradleProperty("ideProfileName").get()) { // FIX_WHEN_MIN_IS_242: `tmp-all` test module no longer needed in 242+ "2023.3", "2024.1" -> {