From 5d9d412103f74dc2aa880ad075e473b74c04cfa9 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 19 Aug 2021 18:33:35 -0400 Subject: [PATCH 001/113] Adding more artifacts in the BOM (#2193) (#2195) * Adding more artifacts * Fixed proto-google-cloud-spanner version --- boms/cloud-lts-bom/pom.xml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 90b4a4cf15..f91fdc9520 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -66,11 +66,14 @@ 2.1.0-sp.1 1.3.0-sp.1 1.111.0-sp.1 + 1.93.0-sp.1 1.127.12-sp.1 + v2-rev20210410-1.31.0 1.22.0-sp.1 1.20.0-sp.1 1.113.14-sp.1 1.6.4-sp.1 + 0.89.5-sp.1 1.9.89 v3-rev20210429-1.31.0 @@ -110,6 +113,11 @@ google-cloud-bigquery ${google.cloud.bigquery.version} + + com.google.apis + google-api-services-bigquery + ${google.api.services.bigquery} + com.google.guava @@ -238,6 +246,11 @@ google-cloud-bigtable ${google.cloud.bigtable.version} + + com.google.api.grpc + proto-google-cloud-bigtable-v2 + ${google.cloud.bigtable.version} + com.google.cloud.bigtable bigtable-hbase-beam @@ -248,26 +261,51 @@ google-cloud-trace ${google.cloud.trace.version} + + com.google.api.grpc + proto-google-cloud-trace-v1 + ${google.cloud.trace.version} + com.google.cloud google-cloud-monitoring ${google.cloud.monitoring.version} + + com.google.api.grpc + proto-google-cloud-monitoring-v3 + ${google.cloud.monitoring.version} + com.google.cloud google-cloud-pubsub ${google.cloud.pubsub.version} + + com.google.api.grpc + proto-google-cloud-pubsub-v1 + ${proto.google.cloud.pubsub.version.v1} + com.google.cloud.datastore datastore-v1-proto-client ${datastore.v1.proto.client.version} + + com.google.api.grpc + proto-google-cloud-datastore-v1 + ${proto.google.cloud.datastore.v1} + com.google.cloud google-cloud-spanner ${google.cloud.spanner.version} + + com.google.api.grpc + proto-google-cloud-spanner-v1 + ${google.cloud.spanner.version} + com.google.apis google-api-services-androidpublisher From 7b8376cb5fde922820f6d1568953c841b3c43f60 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 20 Aug 2021 17:03:39 -0400 Subject: [PATCH 002/113] Adding guard when annotating linkage errors (#2196) * Adding guard when annotating linkage errors * Test that fails * Fixed LinkageCheckTask to check dependencies of pom artifacts * Unnested if-statement --- .../LinkageProblemCauseAnnotator.java | 134 +++++++++++------- .../LinkageProblemCauseAnnotatorTest.java | 22 +++ .../gradle/BuildStatusFunctionalTest.groovy | 34 +++++ .../dependencies/gradle/LinkageCheckTask.java | 33 +++-- 4 files changed, 161 insertions(+), 62 deletions(-) diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotator.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotator.java index 4b1242f04e..c54be34144 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotator.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotator.java @@ -19,13 +19,17 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.cloud.tools.opensource.dependencies.DependencyPath; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.logging.Logger; import org.eclipse.aether.artifact.Artifact; /** Annotates {@link LinkageProblem}s with {@link LinkageProblemCause}s. */ public final class LinkageProblemCauseAnnotator { + private static final Logger logger = + Logger.getLogger(LinkageProblemCauseAnnotator.class.getName()); private LinkageProblemCauseAnnotator() {} @@ -35,74 +39,100 @@ private LinkageProblemCauseAnnotator() {} * @param classPathBuilder class path builder to resolve dependency graphs * @param rootResult the class path used for generating the linkage problems * @param linkageProblems linkage problems to annotate - * @throws IOException when there is a problem reading JAR files */ public static void annotate( ClassPathBuilder classPathBuilder, ClassPathResult rootResult, - Iterable linkageProblems) - throws IOException { + Iterable linkageProblems) { checkNotNull(classPathBuilder); checkNotNull(rootResult); checkNotNull(linkageProblems); - Map cache = new HashMap<>(); + Map artifactResolutionCache = new HashMap<>(); for (LinkageProblem linkageProblem : linkageProblems) { - ClassFile sourceClass = linkageProblem.getSourceClass(); - ClassPathEntry sourceEntry = sourceClass.getClassPathEntry(); + // Annotating linkage errors is a nice-to-have feature for Linkage Checker plugins. Let's not + // fail the entire process if there are problems, such as classPathBuilder unable to resolve + // one artifact or to return correct dependency tree. + try { + annotateProblem(classPathBuilder, rootResult, artifactResolutionCache, linkageProblem); + } catch (Exception ex) { + logger.warning("Failed to annotate: " + linkageProblem); + linkageProblem.setCause(UnknownCause.getInstance()); + } + } + } - Artifact sourceArtifact = sourceEntry.getArtifact(); + private static void annotateProblem( + ClassPathBuilder classPathBuilder, + ClassPathResult rootResult, + Map artifactResolutionCache, + LinkageProblem linkageProblem) + throws IOException { + ClassFile sourceClass = linkageProblem.getSourceClass(); + ClassPathEntry sourceEntry = sourceClass.getClassPathEntry(); - ClassPathResult subtreeResult = cache.get(sourceArtifact); - if (subtreeResult == null) { - // Resolves the dependency graph with the source artifact at the root. - subtreeResult = classPathBuilder.resolveWithMaven(sourceArtifact); - cache.put(sourceArtifact, subtreeResult); - } + Artifact sourceArtifact = sourceEntry.getArtifact(); - Symbol symbol = linkageProblem.getSymbol(); - ClassPathEntry entryInSubtree = subtreeResult.findEntryBySymbol(symbol); - if (entryInSubtree == null) { - linkageProblem.setCause(UnknownCause.getInstance()); - } else { - Artifact artifactInSubtree = entryInSubtree.getArtifact(); - DependencyPath pathToSourceEntry = rootResult.getDependencyPaths(sourceEntry).get(0); - DependencyPath pathFromSourceEntryToUnselectedEntry = - subtreeResult.getDependencyPaths(entryInSubtree).get(0); - DependencyPath pathToUnselectedEntry = - pathToSourceEntry.concat(pathFromSourceEntryToUnselectedEntry); + ClassPathResult subtreeResult = artifactResolutionCache.get(sourceArtifact); + if (subtreeResult == null) { + // Resolves the dependency graph with the source artifact at the root. + subtreeResult = classPathBuilder.resolveWithMaven(sourceArtifact); + artifactResolutionCache.put(sourceArtifact, subtreeResult); + } - ClassPathEntry selectedEntry = - rootResult.findEntryById( - artifactInSubtree.getGroupId(), artifactInSubtree.getArtifactId()); - if (selectedEntry != null) { - Artifact selectedArtifact = selectedEntry.getArtifact(); - if (!selectedArtifact.getVersion().equals(artifactInSubtree.getVersion())) { - // Different version of that artifact is selected in rootResult - linkageProblem.setCause( - new DependencyConflict( - linkageProblem, - rootResult.getDependencyPaths(selectedEntry).get(0), - pathToUnselectedEntry)); - } else { - // A linkage error was already there when sourceArtifact was built. - linkageProblem.setCause(UnknownCause.getInstance()); - } - } else { - // No artifact that matches groupId and artifactId in rootResult. + Symbol symbol = linkageProblem.getSymbol(); + ClassPathEntry entryInSubtree = subtreeResult.findEntryBySymbol(symbol); + if (entryInSubtree == null) { + linkageProblem.setCause(UnknownCause.getInstance()); + return; + } + Artifact artifactInSubtree = entryInSubtree.getArtifact(); + ImmutableList dependencyPathsToSource = + rootResult.getDependencyPaths(sourceEntry); + if (dependencyPathsToSource.isEmpty()) { + // When an artifact is excluded, it's possible to have no dependency path to sourceEntry. + linkageProblem.setCause(UnknownCause.getInstance()); + return; + } + DependencyPath pathToSourceEntry = dependencyPathsToSource.get(0); + DependencyPath pathFromSourceEntryToUnselectedEntry = + subtreeResult.getDependencyPaths(entryInSubtree).get(0); + DependencyPath pathToUnselectedEntry = + pathToSourceEntry.concat(pathFromSourceEntryToUnselectedEntry); - // Checking exclusion elements in the dependency path - Artifact excludingArtifact = - pathToSourceEntry.findExclusion( - artifactInSubtree.getGroupId(), artifactInSubtree.getArtifactId()); - if (excludingArtifact != null) { - linkageProblem.setCause( - new ExcludedDependency(pathToUnselectedEntry, excludingArtifact)); - } else { - linkageProblem.setCause(new MissingDependency(pathToUnselectedEntry)); - } + ClassPathEntry selectedEntry = + rootResult.findEntryById( + artifactInSubtree.getGroupId(), artifactInSubtree.getArtifactId()); + if (selectedEntry != null) { + Artifact selectedArtifact = selectedEntry.getArtifact(); + if (!selectedArtifact.getVersion().equals(artifactInSubtree.getVersion())) { + // Different version of that artifact is selected in rootResult + ImmutableList pathToSelectedArtifact = + rootResult.getDependencyPaths(selectedEntry); + if (pathToSelectedArtifact.isEmpty()) { + linkageProblem.setCause(UnknownCause.getInstance()); + return; } + linkageProblem.setCause( + new DependencyConflict( + linkageProblem, pathToSelectedArtifact.get(0), pathToUnselectedEntry)); + } else { + // A linkage error was already there when sourceArtifact was built. + linkageProblem.setCause(UnknownCause.getInstance()); + } + } else { + // No artifact that matches groupId and artifactId in rootResult. + + // Checking exclusion elements in the dependency path + Artifact excludingArtifact = + pathToSourceEntry.findExclusion( + artifactInSubtree.getGroupId(), artifactInSubtree.getArtifactId()); + if (excludingArtifact != null) { + linkageProblem.setCause(new ExcludedDependency(pathToUnselectedEntry, excludingArtifact)); + } else { + linkageProblem.setCause(new MissingDependency(pathToUnselectedEntry)); } } } + } diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotatorTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotatorTest.java index 710548e67f..e63480629f 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotatorTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageProblemCauseAnnotatorTest.java @@ -198,4 +198,26 @@ public void testAnnotate_dependencyInSpringRepository() throws IOException, Repo "org.reactivestreams:reactive-streams:1.0.3", Artifacts.toCoordinates(conflict.getPathToArtifactThruSource().getLeaf())); } + + @Test + public void testAnnotate_missingArtifactInTree() throws IOException, RepositoryException { + // The dependency tree of the google-api-client does not contain class "com.Foo" + ClassPathBuilder builder = new ClassPathBuilder(); + ClassPathResult classPathResult = + builder.resolve( + ImmutableList.of(new DefaultArtifact("com.google.api-client:google-api-client:1.27.0")), + false, + DependencyMediation.MAVEN); + + ClassPathEntry googleApiClient = classPathResult.getClassPath().get(0); + ClassNotFoundProblem dummyProblem = + new ClassNotFoundProblem( + new ClassFile(googleApiClient, "com.Foo"), new ClassSymbol("com.Bar")); + + LinkageProblemCauseAnnotator.annotate( + classPathBuilder, classPathResult, ImmutableSet.of(dummyProblem)); + + LinkageProblemCause cause = dummyProblem.getCause(); + assertTrue(cause instanceof UnknownCause); + } } diff --git a/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy b/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy index b9e7d05991..05d5bb43c4 100644 --- a/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy +++ b/gradle-plugin/src/functionalTest/groovy/com/google/cloud/tools/dependencies/gradle/BuildStatusFunctionalTest.groovy @@ -224,4 +224,38 @@ class BuildStatusFunctionalTest extends Specification { result.output.count("Circular dependency for: com.fasterxml.jackson:jackson-bom:2.12.1") == 1 result.task(":linkageCheck").outcome == TaskOutcome.FAILED } + + def "can handle artifacts with pom packaging"() { + buildFile << """ + repositories { + mavenCentral() + } + + dependencies { + // This artifact is pom-packaging and does not have JAR artifacts + compile 'org.eclipse.jetty.aggregate:jetty-all:9.4.7.v20170914' + } + + linkageChecker { + configurations = ['compile'] + } + """ + + when: + def result = GradleRunner.create() + .withProjectDir(testProjectDir.root) + .withArguments('linkageCheck', '--stacktrace') + .withPluginClasspath() + .buildAndFail() + + then: + result.output.contains("Task :linkageCheck") + result.output.contains( + "The valid symbol is in org.eclipse.jetty.alpn:alpn-api:jar:1.1.3.v20160715 at "+ + "org.eclipse.jetty.aggregate:jetty-all:9.4.7.v20170914 (compile) / "+ + "org.eclipse.jetty:jetty-alpn-client:9.4.7.v20170914 (compile) / "+ + "org.eclipse.jetty.alpn:alpn-api:1.1.3.v20160715 (provided) but it was not selected "+ + "because the path contains a provided-scope dependency") + result.task(":linkageCheck").outcome == TaskOutcome.FAILED + } } diff --git a/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java b/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java index b4dc7d96c0..fbb1cd2010 100644 --- a/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java +++ b/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java @@ -34,6 +34,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.ListMultimap; import com.google.common.collect.MultimapBuilder; +import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; @@ -314,6 +315,20 @@ private String dependencyPathToArtifacts( return output.toString(); } + private static Artifact artifactWithPomFrom(ResolvedDependency resolvedDependency) { + ModuleVersionIdentifier moduleVersionId = resolvedDependency.getModule().getId(); + DefaultArtifact artifact = + new DefaultArtifact( + moduleVersionId.getGroup(), + moduleVersionId.getName(), + null, + "pom", + moduleVersionId.getVersion(), + null, + (File) null); // no JAR file + return artifact; + } + private static Artifact artifactFrom( ResolvedDependency resolvedDependency, ResolvedArtifact resolvedArtifact) { ModuleVersionIdentifier moduleVersionId = resolvedDependency.getModule().getId(); @@ -357,6 +372,7 @@ private DependencyGraph createDependencyGraph(ResolvedConfiguration configuratio PathToNode item = queue.poll(); ResolvedDependency node = item.getNode(); + // Never null DependencyPath parentPath = item.getParentPath(); // If there are multiple artifacts (with different classifiers) in this node, then the path is @@ -372,18 +388,15 @@ private DependencyGraph createDependencyGraph(ResolvedConfiguration configuratio getLogger() .warn( "The dependency node " + node.getName() + " does not have any artifact. Skipping."); - continue; + path = parentPath.append(new Dependency(artifactWithPomFrom(node), "compile")); + } else { + // For artifacts with classifiers, there can be multiple resolved artifacts for one node + for (ResolvedArtifact artifact : moduleArtifacts) { + path = parentPath.append(dependencyFrom(node, artifact)); + graph.addPath(path); + } } - // For artifacts with classifiers, there can be multiple resolved artifacts for one node - for (ResolvedArtifact artifact : moduleArtifacts) { - // parentPath is null for the first item - path = - parentPath == null - ? new DependencyPath(artifactFrom(node, artifact)) - : parentPath.append(dependencyFrom(node, artifact)); - graph.addPath(path); - } for (ResolvedDependency child : node.getChildren()) { if (visited.add(child)) { From 27c1bf3d213cbd0b8b74200460e93f73707d27c5 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 20 Aug 2021 18:15:25 -0400 Subject: [PATCH 003/113] Release 1.5.12-dependencies (#2197) * preparing release 1.5.12-dependencies * 1.5.13-SNAPSHOT * Changelog --- CHANGELOG.md | 4 ++++ boms/integration-tests/pom.xml | 2 +- dashboard/pom.xml | 2 +- dependencies/pom.xml | 2 +- enforcer-rules/pom.xml | 2 +- gradle-plugin/gradle.properties | 2 +- linkage-monitor/action.yml | 2 +- linkage-monitor/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b8b30146..b8ec66ca97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Linkage Checker Enforcer Rule and Linkage Monitor Change Log +## 1.5.12 +* Fixed the bug in the Gradle plugin that affected artifacts with "pom" packaging ([#2196]( + https://github.com/GoogleCloudPlatform/cloud-opensource-java/pull/2196)) + ## 1.5.11 * The Gradle plugin omits duplicate dependency paths when printing the locatin of problematic artifacts ([#2188](https://github.com/GoogleCloudPlatform/cloud-opensource-java/pull/2188)). diff --git a/boms/integration-tests/pom.xml b/boms/integration-tests/pom.xml index f2f7a29a87..e77d87d238 100644 --- a/boms/integration-tests/pom.xml +++ b/boms/integration-tests/pom.xml @@ -18,7 +18,7 @@ com.google.cloud.tools dependencies - 1.5.12-SNAPSHOT + 1.5.13-SNAPSHOT junit diff --git a/dashboard/pom.xml b/dashboard/pom.xml index b7cdcc9bec..9ca8c550cc 100644 --- a/dashboard/pom.xml +++ b/dashboard/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.12-SNAPSHOT + 1.5.13-SNAPSHOT dashboard diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 80185114c8..2b12153cfe 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -8,7 +8,7 @@ com.google.cloud.tools dependencies-parent - 1.5.12-SNAPSHOT + 1.5.13-SNAPSHOT dependencies diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index e4239e9f4b..d61460799c 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.12-SNAPSHOT + 1.5.13-SNAPSHOT linkage-checker-enforcer-rules diff --git a/gradle-plugin/gradle.properties b/gradle-plugin/gradle.properties index e89ec876a4..1c080e7b8b 100644 --- a/gradle-plugin/gradle.properties +++ b/gradle-plugin/gradle.properties @@ -1,2 +1,2 @@ # scripts/prepare_release.sh maintains this value. -version = 1.5.12-SNAPSHOT +version = 1.5.13-SNAPSHOT diff --git a/linkage-monitor/action.yml b/linkage-monitor/action.yml index 69de4893ba..a28324738f 100644 --- a/linkage-monitor/action.yml +++ b/linkage-monitor/action.yml @@ -7,7 +7,7 @@ runs: # scripts/release.sh updates the version part in the URL run: | curl --output /tmp/linkage-monitor.jar \ - "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-1.5.12-SNAPSHOT-all-deps.jar" + "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-1.5.13-SNAPSHOT-all-deps.jar" shell: bash - run: java -jar /tmp/linkage-monitor.jar com.google.cloud:libraries-bom shell: bash diff --git a/linkage-monitor/pom.xml b/linkage-monitor/pom.xml index b04716f465..f04db82c2b 100644 --- a/linkage-monitor/pom.xml +++ b/linkage-monitor/pom.xml @@ -22,7 +22,7 @@ com.google.cloud.tools dependencies-parent - 1.5.12-SNAPSHOT + 1.5.13-SNAPSHOT linkage-monitor diff --git a/pom.xml b/pom.xml index aaf9e176af..3124fb497a 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.google.cloud.tools dependencies-parent pom - 1.5.12-SNAPSHOT + 1.5.13-SNAPSHOT Cloud Tools Open Source Code Hygiene Tooling https://github.com/GoogleCloudPlatform/cloud-opensource-java/ From a60329699d123c785068bd4e21c1eb6579ccc397 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 23 Aug 2021 09:31:35 -0400 Subject: [PATCH 004/113] Updating release instructions (#2192) --- boms/cloud-oss-bom/RELEASING.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/boms/cloud-oss-bom/RELEASING.md b/boms/cloud-oss-bom/RELEASING.md index 1ecc53dd67..f768c1919c 100644 --- a/boms/cloud-oss-bom/RELEASING.md +++ b/boms/cloud-oss-bom/RELEASING.md @@ -88,16 +88,19 @@ new release is available on Maven Central. * https://github.com/googleapis/google-cloud-java/blob/master/TROUBLESHOOTING.md * Ask a code owner for java-docs-samples to merge the dependabot PR that updates libraries-bom in https://github.com/GoogleCloudPlatform/java-docs-samples/pulls -* Use the repo tool to approve renovatebot updates for libraries-bom in the individual clients: - * `$ repo list --title .*v16.4.0` +* Use the repo tool to approve Renovate Bot updates for libraries-bom in the individual clients: + * `$ repo --title '.*libraries-bom to v16.4.0' list` + (for a major version bump, the pattern would be abbreviated. For example, use pattern `'.*libraries-bom to v17'` for 17.0.0 release) * Verify that the listed PRs look correct and don't include anything you're not ready to merge. - * `$ repo approve --title .*v16.4.0` - * `$ repo --title .*v16.4.0 tag automerge` + * `$ repo --title '.*libraries-bom to v16.4.0' approve` + * `$ repo --title '.*libraries-bom to v16.4.0' tag automerge` + + In case when the "Owlbot" check fails, use 'owlbot:run' label to rerun the checks. * Manually edit and update any pom.xml files in https://github.com/GoogleCloudPlatform/java-docs-samples that dependabot missed * In google3 run: * `$ scripts/update_docs.sh ` * For example, `$ scripts/update_docs.sh 16.3.0 16.4.0` - * When asked whether to add changes to the first CL, answer yes. + * When asked whether to add changes to the first CL, answer "y". * Sanity check the CL and send it for review. * Submit on approval * Search for libraries-bom in google3 to find any internal references (typically cloudsite and devsite) that still need to be updated. From 05e0fcecd67b8c4ce7dc5a74cbecd82ffec24ff3 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 25 Aug 2021 11:22:52 -0400 Subject: [PATCH 005/113] Update Spanner library version and add proto lib API surface (#2198) (#2201) Co-authored-by: Daniel Zou --- boms/cloud-lts-bom/pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index f91fdc9520..c7415efe08 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -62,7 +62,7 @@ 1.10.1-sp.1 0.25.2-sp.1 1.31.4-sp.1 - 3.3.3-sp.1 + 6.4.4-sp.1 2.1.0-sp.1 1.3.0-sp.1 1.111.0-sp.1 @@ -301,6 +301,11 @@ google-cloud-spanner ${google.cloud.spanner.version} + + com.google.api.grpc + proto-google-cloud-spanner-admin-database-v1 + ${google.cloud.spanner.version} + com.google.api.grpc proto-google-cloud-spanner-v1 From 4b95c12107d656c7d8b5f2424287a0517446fe69 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 26 Aug 2021 16:03:12 -0400 Subject: [PATCH 006/113] Upgrading Google Cloud BOM to 0.160.0 and associated libraries (#2203) --- boms/cloud-oss-bom/pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index bf535b6550..52201a068b 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -45,16 +45,16 @@ UTF-8 30.1.1-jre - 0.159.0 - 2.0.5 - 1.39.0 + 0.160.0 + 2.1.0 + 1.40.0 1.39.2 3.17.3 - 2.1.0 - 0.86.0 - 1.0.0 + 2.3.0 + 0.88.0 + 1.1.0 2.0.1 2.3.2 1.0.14 From 82aedc5264d7f09d2302e8a78993a78225e4bf84 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 26 Aug 2021 18:05:20 -0400 Subject: [PATCH 007/113] Release 22.0.0-bom (#2204) * preparing release 22.0.0-bom * 22.0.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 52201a068b..82a04b6918 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 21.0.1-SNAPSHOT + 22.0.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 2176315f11..eabe71fe8a 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 21.0.1-SNAPSHOT + 22.0.1-SNAPSHOT pom import From 06eb2626f03b0381879e72e2d87577f8c76f8e61 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 27 Aug 2021 13:24:32 -0400 Subject: [PATCH 008/113] Enhancing the release document (#2202) * Enhancing the release document * Emphasize master branch when running release.sh --- boms/cloud-lts-bom/RELEASING.md | 72 +++++++++++++++++++++++++++------ boms/cloud-oss-bom/RELEASING.md | 9 +++-- 2 files changed, 65 insertions(+), 16 deletions(-) diff --git a/boms/cloud-lts-bom/RELEASING.md b/boms/cloud-lts-bom/RELEASING.md index 828499c67a..46beda033e 100644 --- a/boms/cloud-lts-bom/RELEASING.md +++ b/boms/cloud-lts-bom/RELEASING.md @@ -9,9 +9,39 @@ For the prerequisites, see [Libraries BOM release's Prerequisites section]( All on your corp desktop: -1. Run gcert if you have not done so in the last twelve hours or so. +### 1. Decide the release version. -2. If this is a major version release, create a LTS release branch `N.0.x-lts`, where +The release is either a patch release for an existing major version or a new major +version release. +Determine the version you're going to release by the following steps: + +If this is a patch release for a major version release, then + +- Checkout "_N_.0.x-lts" branch where _N_ is a major version you're releasing (for example + [`1.0.x-lts`](https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/1.0.x-lts)). +- Read the `` element of [boms/cloud-lts-bom/pom.xml](./pom.xml) in the branch. + For example if it has version "1.0.5-SNAPSHOT", then next release version is "1.0.5". + +If this is a major version release, then + +- Checkout the master branch +- Read the `` element of [boms/cloud-lts-bom/pom.xml](./pom.xml). + For example, if the `boms/cloud-lts-bom/pom.xml` of the master branch has "3.0.0-SNAPSHOT", then + next release verson is "3.0.0". + +You can also check the previously released versions in [Maven Central: com.google.cloud:gcp-lts-bom]( +https://repo1.maven.org/maven2/com/google/cloud/gcp-lts-bom/). + +### 2. Run gcert + +Run gcert if you have not done so in the last twelve hours or so. + +### 3. If this is a major version release, create an LTS release branch + +(If this is a patch version release, the LTS release branch already exists. +No action required for this step.) + +If this is a major version release, create an LTS release branch `N.0.x-lts`, where N is the release number. For example: @@ -21,17 +51,19 @@ $ git checkout -b 2.0.x-lts origin/master $ git push --set-upstream origin 2.0.x-lts ``` -If this is a patch version release, the LTS release branch already exists. -No action required for this step #2. +### 4. Run `release.sh` with `lts` argument + +Checkout the **master** branch of this repository. -3. Run `release.sh` with `lts` argument in -the `cloud-opensource-java` directory: +In the `cloud-opensource-java` directory, run `release.sh`: ``` $ ./scripts/release.sh lts ``` -With the `lts` argument, this script creates a pull request and that bumps the patch version of +with the `lts` argument. For example: `./scripts/release.sh lts 1.0.5` + +This script creates a pull request that bumps the patch version of the LTS release branch (not the master branch). Ask a teammate to review and approve the PR. @@ -40,18 +72,26 @@ corresponding LTS release branch. For example, when you run the release script with argument `./scripts/release.sh lts 5.0.3`, it creates a release branch `5.0.3-lts` based on the LTS release branch `5.0.x-lts`. -The script also initiates the Rapid release workflow. +The script also initiates the Rapid release workflow, which usually finishes in 20 +minutes. -4. After you finish the release, if this is a major version release, bump the major version of the - BOM (`boms/cloud-lts-bom/pom.xml`) in the master branch. +### 5. Release the artifact via OSSRH staging repository -## OSSRH - -The Rapid workflow uploads the artifact to OSSRH staging repository. +Once the Rapid workflow uploads the artifact to OSSRH staging repository, release the artifact +via its website. [Instructions for releasing from OSSRH are on the internal team site](https://g3doc.corp.google.com/company/teams/cloud-java/tools/developers/releasing.md#verify-and-release). +### 6. If this is a major version release, bump the major version in master branch + +After you finish the release, if this is a major version release, bump the major version of the +BOM (`boms/cloud-lts-bom/pom.xml`) in the master branch. + +### 7. Confirm the artifact in Maven Central + +In 30 minutes, the new version appears in [Maven Central: com.google.cloud:gcp-lts-bom]( +https://repo1.maven.org/maven2/com/google/cloud/gcp-lts-bom/). ## Making changes for a patch release @@ -68,3 +108,9 @@ so that we do not accidentally push changes into them. Any changes for a patch release to the LTS BOM should be merged to one of the LTS release branches. This practice enables us to release a patch version of one of the old versions of the BOM, without using the master branch (or _HEAD_). + +## Deleting a release + +In case you have to clean up the releases, such as when you need to retry the release upon a +failure, please refer to [Libraries BOM release's Deleting a release section]( +../cloud-oss-bom/RELEASING.md). \ No newline at end of file diff --git a/boms/cloud-oss-bom/RELEASING.md b/boms/cloud-oss-bom/RELEASING.md index f768c1919c..704a5f101c 100644 --- a/boms/cloud-oss-bom/RELEASING.md +++ b/boms/cloud-oss-bom/RELEASING.md @@ -3,10 +3,11 @@ ## Prerequisites -(Do not need to be repeated for each release.) +(You do not need to repeat this section for each release.) -* Install the [`gh`](https://github.com/cli/cli) -tool if you not previously done so. +* Install [Maven](https://maven.apache.org/install.html) version 3.6 or later. + +* Install the [`gh`](https://github.com/cli/cli#linux--bsd) tool. * Run `gh auth login` to register your desktop with github. @@ -14,6 +15,8 @@ tool if you not previously done so. * Install and configure the [repo tool](https://github.com/googleapis/github-repo-automation). +* Ensure you have `p4` and `blaze` commands. + ## Decide the release version To decide the release version, check the changes since the last release. From 9c572619b832baed069815e24f7cfe30d025960a Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 3 Sep 2021 15:34:59 -0400 Subject: [PATCH 009/113] Adding gax-httpjson (#2207) (#2209) --- boms/cloud-lts-bom/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index c7415efe08..d1c948e512 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -333,6 +333,11 @@ gax-grpc ${gax.version} + + com.google.api + gax-httpjson + ${gax.httpjson.version} + com.google.http-client google-http-client From e4229096b5f19afe9adbd4ab616ca49d61ce77d6 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 3 Sep 2021 15:35:24 -0400 Subject: [PATCH 010/113] Adding http connection settings to avoid connection reset (#2210) --- .github/workflows/ci.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8adc5980e1..23a0b0c6fc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,6 +24,11 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.date }} - run: java -version - - run: ./mvnw -B -e -ntp install + # The http connection settings avoid Maven's HTTP connection reset in GitHub Actions + # https://github.com/actions/virtual-environments/issues/1499#issuecomment-689467080 + - run: | + ./mvnw -B -e -ntp install \ + -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false \ + -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 - run: cd gradle-plugin && ./gradlew build publishToMavenLocal From 88dfa962871bd88f39f99cd81da0e356a4c090f5 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 7 Sep 2021 12:31:46 -0400 Subject: [PATCH 011/113] Updating Google Cloud BOM to 0.161.0 and associated dependencies (#2211) --- boms/cloud-oss-bom/pom.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 82a04b6918..dcd0728309 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -45,19 +45,19 @@ UTF-8 30.1.1-jre - 0.160.0 - 2.1.0 - 1.40.0 - 1.39.2 + 0.161.0 + 2.1.2 + 1.40.1 + 1.40.0 3.17.3 - 2.3.0 - 0.88.0 + 2.4.0 + 0.89.0 1.1.0 - 2.0.1 - 2.3.2 - 1.0.14 + 2.0.2 + 2.5.0 + 1.1.0 From c8df287e94766002ca14bc5952a6d10f0f60e035 Mon Sep 17 00:00:00 2001 From: Mike Eltsufin Date: Tue, 7 Sep 2021 17:26:29 -0400 Subject: [PATCH 012/113] Release 23.0.0-bom (#2212) * preparing release 23.0.0-bom * 23.0.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index dcd0728309..4372c55a75 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 22.0.1-SNAPSHOT + 23.0.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index eabe71fe8a..cdc1879ad3 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 22.0.1-SNAPSHOT + 23.0.1-SNAPSHOT pom import From ef358ea1d4b2ecbc03aeb453729d0b676849998a Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 8 Sep 2021 13:12:11 -0400 Subject: [PATCH 013/113] Adding disclaimer (#2213) --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 6b0ccbdd8d..d0e828bc5f 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,8 @@ This project is built using _Maven_. 1. Clone the project to a local directory using `git clone git@github.com:GoogleCloudPlatform/cloud-opensource-java.git`. + +# Disclaimer + +This is not an officially supported Google product. + From cb1f8788073c52dc449e245baac022d8a32cdfa9 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 13 Sep 2021 16:09:13 -0400 Subject: [PATCH 014/113] Updating release instruction for the Libraries BOM (#2214) * Updating release instruction for the Libraries BOM * Clarifying "Deprecated" for Rapid web UI * Removed legacy web UI section * Clarifying to update documents on next day --- boms/cloud-oss-bom/RELEASING.md | 65 +++++++++++++++++++++------------ boms/cloud-oss-bom/pom.xml | 4 +- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/boms/cloud-oss-bom/RELEASING.md b/boms/cloud-oss-bom/RELEASING.md index 704a5f101c..bda3d1e675 100644 --- a/boms/cloud-oss-bom/RELEASING.md +++ b/boms/cloud-oss-bom/RELEASING.md @@ -5,21 +5,31 @@ (You do not need to repeat this section for each release.) +Install the following tools into a corp desktop where you have `p4` and `blaze` commands. + * Install [Maven](https://maven.apache.org/install.html) version 3.6 or later. -* Install the [`gh`](https://github.com/cli/cli#linux--bsd) tool. +* Install the [`gh`](https://github.com/cli/cli/releases) tool. The automation creates a pull + request via this command. From its release page, choose a binary that ends with + "_linux_amd64.tar.gz". Place the `gh` executable somewhere in the `PATH` environment variable. * Run `gh auth login` to register your desktop with github. * Clone this repository onto your corp desktop, Ubiquity instance, or CloudTop. Do not use a laptop or personal machine as the release requires google3 access. * Install and configure the [repo tool](https://github.com/googleapis/github-repo-automation). - -* Ensure you have `p4` and `blaze` commands. + This updates code samples across ~100 repositories. You need `config.yaml` when you run it: + ``` + config.yaml + --- + githubToken: + repoSearch: org:googleapis language:java is:public archived:false + ``` ## Decide the release version -To decide the release version, check the changes since the last release. +To decide the release version, check the changes since [the last release]( +https://search.maven.org/artifact/com.google.cloud/libraries-bom). (This step ensures that you do not miss expected libraries upgrades.) For example, if the last BOM release was version 16.4.0, then run the following command to see the difference. @@ -28,8 +38,15 @@ to see the difference. git diff v16.4.0-bom -- boms/cloud-oss-bom/pom.xml ``` -If the difference includes the google-cloud-bom version, then check the change in the release note -at https://github.com/googleapis/java-cloud-bom/releases as well. +If the difference includes the google-cloud-bom version (`google.cloud.bom.version`), +then check the change in the release note +at https://github.com/googleapis/java-cloud-bom/releases as well. Here is how to read +the release note: + +- If there's a note that only mentions a major version bump, for example + "*to v2*", then it's a major version bump. +- If there's a note that mentions a minor version bump, for example "*to v2.1.0*", + then it's a minor version bump. From these changes in the content of the Libraries BOM, determine the release version by the following logic: @@ -52,7 +69,7 @@ All on your corp desktop: the `cloud-opensource-java` directory: ``` -$ ./scripts/release.sh bom +$ sh ./scripts/release.sh bom ``` You might see this message: @@ -69,15 +86,10 @@ Ask a teammate to review and approve the PR. If you want the script to stop asking your username and password for every invocation, run `git config credential.helper store`. -### Build the release binary with Rapid (Legacy web UI) - -The [instructions for the Rapid build are on the internal team -site](https://g3doc.corp.google.com/company/teams/cloud-java/tools/developers/releasing.md#run-the-rapid-workflow). - ## OSSRH [Instructions for releasing from OSSRH are on the internal team -site](https://g3doc.corp.google.com/company/teams/cloud-java/internal/g3doc/tools/releasing.md?cl=head). +site](https://g3doc.corp.google.com/company/teams/cloud-java/internal/g3doc/tools/releasing.md#verify-and-release). ## Update the docs @@ -89,24 +101,29 @@ new release is available on Maven Central. (no PR required) * https://github.com/googleapis/google-http-java-client/blob/master/docs/setup.md * https://github.com/googleapis/google-cloud-java/blob/master/TROUBLESHOOTING.md +* In google3 run: + * `$ scripts/update_docs.sh ` + * For example, `$ scripts/update_docs.sh 16.3.0 16.4.0` + * When asked whether to add changes to the first CL, answer "y". + * Sanity check the CL and send it for review. Use "Suggest reviewers" to pick a reviewer. + * Submit on approval + +### Document updates on the next day + +Few hours after the artifact becomes available in Maven Central, RenovateBot creates pull requests +to update the Libraries BOM version in the code samples. + * Ask a code owner for java-docs-samples to merge the dependabot PR that updates libraries-bom in https://github.com/GoogleCloudPlatform/java-docs-samples/pulls -* Use the repo tool to approve Renovate Bot updates for libraries-bom in the individual clients: +* Use the repo tool to approve Renovate Bot updates for libraries-bom in + the individual clients: * `$ repo --title '.*libraries-bom to v16.4.0' list` (for a major version bump, the pattern would be abbreviated. For example, use pattern `'.*libraries-bom to v17'` for 17.0.0 release) - * Verify that the listed PRs look correct and don't include anything you're not ready to merge. + * Verify that the listed PRs look correct and don't include anything you're not ready to merge. * `$ repo --title '.*libraries-bom to v16.4.0' approve` * `$ repo --title '.*libraries-bom to v16.4.0' tag automerge` - + In case when the "Owlbot" check fails, use 'owlbot:run' label to rerun the checks. -* Manually edit and update any pom.xml files in https://github.com/GoogleCloudPlatform/java-docs-samples that dependabot missed -* In google3 run: - * `$ scripts/update_docs.sh ` - * For example, `$ scripts/update_docs.sh 16.3.0 16.4.0` - * When asked whether to add changes to the first CL, answer "y". - * Sanity check the CL and send it for review. - * Submit on approval -* Search for libraries-bom in google3 to find any internal references (typically cloudsite and devsite) that still need to be updated. ## Retrying a failed release diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 4372c55a75..657bc656dc 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -45,7 +45,7 @@ UTF-8 30.1.1-jre - 0.161.0 + 0.161.0 2.1.2 1.40.1 1.40.0 @@ -214,7 +214,7 @@ com.google.cloud google-cloud-bom - ${google.cloud.java.version} + ${google.cloud.bom.version} pom import From 074273c29bc3e177ac6ab1814faccb0b1de6992b Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 14 Sep 2021 13:01:09 -0400 Subject: [PATCH 015/113] Removing the release instruction (#2218) --- boms/cloud-lts-bom/RELEASING.md | 116 --------------------- boms/cloud-oss-bom/RELEASING.md | 175 -------------------------------- 2 files changed, 291 deletions(-) delete mode 100644 boms/cloud-lts-bom/RELEASING.md delete mode 100644 boms/cloud-oss-bom/RELEASING.md diff --git a/boms/cloud-lts-bom/RELEASING.md b/boms/cloud-lts-bom/RELEASING.md deleted file mode 100644 index 46beda033e..0000000000 --- a/boms/cloud-lts-bom/RELEASING.md +++ /dev/null @@ -1,116 +0,0 @@ -# LTS BOM Release - -## Prerequisites - -For the prerequisites, see [Libraries BOM release's Prerequisites section]( -../cloud-oss-bom/RELEASING.md). - -## Steps - -All on your corp desktop: - -### 1. Decide the release version. - -The release is either a patch release for an existing major version or a new major -version release. -Determine the version you're going to release by the following steps: - -If this is a patch release for a major version release, then - -- Checkout "_N_.0.x-lts" branch where _N_ is a major version you're releasing (for example - [`1.0.x-lts`](https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/1.0.x-lts)). -- Read the `` element of [boms/cloud-lts-bom/pom.xml](./pom.xml) in the branch. - For example if it has version "1.0.5-SNAPSHOT", then next release version is "1.0.5". - -If this is a major version release, then - -- Checkout the master branch -- Read the `` element of [boms/cloud-lts-bom/pom.xml](./pom.xml). - For example, if the `boms/cloud-lts-bom/pom.xml` of the master branch has "3.0.0-SNAPSHOT", then - next release verson is "3.0.0". - -You can also check the previously released versions in [Maven Central: com.google.cloud:gcp-lts-bom]( -https://repo1.maven.org/maven2/com/google/cloud/gcp-lts-bom/). - -### 2. Run gcert - -Run gcert if you have not done so in the last twelve hours or so. - -### 3. If this is a major version release, create an LTS release branch - -(If this is a patch version release, the LTS release branch already exists. -No action required for this step.) - -If this is a major version release, create an LTS release branch `N.0.x-lts`, where -N is the release number. - -For example: - -``` -$ git checkout -b 2.0.x-lts origin/master -$ git push --set-upstream origin 2.0.x-lts -``` - -### 4. Run `release.sh` with `lts` argument - -Checkout the **master** branch of this repository. - -In the `cloud-opensource-java` directory, run `release.sh`: - -``` -$ ./scripts/release.sh lts -``` - -with the `lts` argument. For example: `./scripts/release.sh lts 1.0.5` - -This script creates a pull request that bumps the patch version of -the LTS release branch (not the master branch). -Ask a teammate to review and approve the PR. - -Behind the scenes, the release script creates a release branch based on the -corresponding LTS release branch. -For example, when you run the release script with argument `./scripts/release.sh lts 5.0.3`, -it creates a release branch `5.0.3-lts` based on the LTS release branch `5.0.x-lts`. - -The script also initiates the Rapid release workflow, which usually finishes in 20 -minutes. - -### 5. Release the artifact via OSSRH staging repository - -Once the Rapid workflow uploads the artifact to OSSRH staging repository, release the artifact -via its website. - -[Instructions for releasing from OSSRH are on the internal team -site](https://g3doc.corp.google.com/company/teams/cloud-java/tools/developers/releasing.md#verify-and-release). - -### 6. If this is a major version release, bump the major version in master branch - -After you finish the release, if this is a major version release, bump the major version of the -BOM (`boms/cloud-lts-bom/pom.xml`) in the master branch. - -### 7. Confirm the artifact in Maven Central - -In 30 minutes, the new version appears in [Maven Central: com.google.cloud:gcp-lts-bom]( -https://repo1.maven.org/maven2/com/google/cloud/gcp-lts-bom/). - -## Making changes for a patch release - -Changes for a patch release should be committed to LTS release branches (not to the master branch). - -We maintain multiple branches for the LTS BOM releases. -Let's call the branches _LTS release branches_. -An LTS release branch has a name "N.0.x-lts", where N is the major release version number, -such as `1.0.x-lts` and `2.0.x-lts`. -In this GitHub repository, the branches are [configured as protected]( -https://github.com/GoogleCloudPlatform/cloud-opensource-java/settings/branches), -so that we do not accidentally push changes into them. - -Any changes for a patch release to the LTS BOM should be merged to one of the LTS release branches. -This practice enables us to release a patch version of one of the old versions of the BOM, -without using the master branch (or _HEAD_). - -## Deleting a release - -In case you have to clean up the releases, such as when you need to retry the release upon a -failure, please refer to [Libraries BOM release's Deleting a release section]( -../cloud-oss-bom/RELEASING.md). \ No newline at end of file diff --git a/boms/cloud-oss-bom/RELEASING.md b/boms/cloud-oss-bom/RELEASING.md deleted file mode 100644 index bda3d1e675..0000000000 --- a/boms/cloud-oss-bom/RELEASING.md +++ /dev/null @@ -1,175 +0,0 @@ -# Cloud Libraries BOM Release - - -## Prerequisites - -(You do not need to repeat this section for each release.) - -Install the following tools into a corp desktop where you have `p4` and `blaze` commands. - -* Install [Maven](https://maven.apache.org/install.html) version 3.6 or later. - -* Install the [`gh`](https://github.com/cli/cli/releases) tool. The automation creates a pull - request via this command. From its release page, choose a binary that ends with - "_linux_amd64.tar.gz". Place the `gh` executable somewhere in the `PATH` environment variable. - - * Run `gh auth login` to register your desktop with github. - -* Clone this repository onto your corp desktop, Ubiquity instance, or CloudTop. Do not use a laptop or personal machine as the release requires google3 access. - -* Install and configure the [repo tool](https://github.com/googleapis/github-repo-automation). - This updates code samples across ~100 repositories. You need `config.yaml` when you run it: - ``` - config.yaml - --- - githubToken: - repoSearch: org:googleapis language:java is:public archived:false - ``` - -## Decide the release version - -To decide the release version, check the changes since [the last release]( -https://search.maven.org/artifact/com.google.cloud/libraries-bom). -(This step ensures that you do not miss expected libraries upgrades.) -For example, if the last BOM release was version 16.4.0, then run the following command -to see the difference. - -``` -git diff v16.4.0-bom -- boms/cloud-oss-bom/pom.xml -``` - -If the difference includes the google-cloud-bom version (`google.cloud.bom.version`), -then check the change in the release note -at https://github.com/googleapis/java-cloud-bom/releases as well. Here is how to read -the release note: - -- If there's a note that only mentions a major version bump, for example - "*to v2*", then it's a major version bump. -- If there's a note that mentions a minor version bump, for example "*to v2.1.0*", - then it's a minor version bump. - -From these changes in the content of the Libraries BOM, -determine the release version by the following logic: - -- If there is at least one major version bump among the changes, it's a major version bump. -- If there is at least one minor version bump (no major version change), it's a minor version - bump. -- If there are only patch version bumps (no major or minor version change), it's a patch version - bump. - -We use the release version for `release.sh` in the next steps. - -## Steps - -All on your corp desktop: - -1. Run gcert if you have not done so in the last twelve hours or so. - -2. Run `release.sh` with `bom` argument in -the `cloud-opensource-java` directory: - -``` -$ sh ./scripts/release.sh bom -``` - -You might see this message: - -``` -Notice: authentication required -Press Enter to open github.com in your browser... -``` - -Do it. This grants the script permission to create a PR for you on Github. - -Ask a teammate to review and approve the PR. - -If you want the script to stop asking your username and password for every invocation, -run `git config credential.helper store`. - -## OSSRH - -[Instructions for releasing from OSSRH are on the internal team -site](https://g3doc.corp.google.com/company/teams/cloud-java/internal/g3doc/tools/releasing.md#verify-and-release). - -## Update the docs - -Several docs in this and other repositories need to be updated once the -new release is available on Maven Central. - -* Send pull requests that change the version in these documents: - * https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM - (no PR required) - * https://github.com/googleapis/google-http-java-client/blob/master/docs/setup.md - * https://github.com/googleapis/google-cloud-java/blob/master/TROUBLESHOOTING.md -* In google3 run: - * `$ scripts/update_docs.sh ` - * For example, `$ scripts/update_docs.sh 16.3.0 16.4.0` - * When asked whether to add changes to the first CL, answer "y". - * Sanity check the CL and send it for review. Use "Suggest reviewers" to pick a reviewer. - * Submit on approval - -### Document updates on the next day - -Few hours after the artifact becomes available in Maven Central, RenovateBot creates pull requests -to update the Libraries BOM version in the code samples. - -* Ask a code owner for java-docs-samples to merge the dependabot PR - that updates libraries-bom in https://github.com/GoogleCloudPlatform/java-docs-samples/pulls -* Use the repo tool to approve Renovate Bot updates for libraries-bom in - the individual clients: - * `$ repo --title '.*libraries-bom to v16.4.0' list` - (for a major version bump, the pattern would be abbreviated. For example, use pattern `'.*libraries-bom to v17'` for 17.0.0 release) - * Verify that the listed PRs look correct and don't include anything you're not ready to merge. - * `$ repo --title '.*libraries-bom to v16.4.0' approve` - * `$ repo --title '.*libraries-bom to v16.4.0' tag automerge` - - In case when the "Owlbot" check fails, use 'owlbot:run' label to rerun the checks. - -## Retrying a failed release - -If the Github steps succeed—PR created, version tagged, etc.—but the Rapid release fails, you can -run this command from a g4 client to retry the Rapid build without going all the way -back to the beginning: - -``` -$ blaze run java/com/google/cloud/java/tools:ReleaseRapidProject -- \ - --project_name=cloud-java-tools-cloud-opensource-java-bom-kokoro-release \ - --committish=v${VERSION}-bom -``` - -## Deleting a release - -Occasionally you need to clean up after an aborted release, typically because the release script had -problems. If so: - -1. Delete the release branch on Github. - -2. Run `scripts/cancel_release.sh ` - -3. If the release got as far as uploading a binary to Nexus before you cancelled, then -login to OSSRH and drop the release. - - -The `cancel_release.sh` script performs these steps: - - -1. Fetch the tags in your local client: - - ``` - $ git fetch --tags --force - ``` - -2. Delete the tag locally: - - ``` - $ git tag -d v2.6.0-bom - Deleted tag 'v2.6.0-bom' (was 3b96602) - ``` - -2. Push the deleted tag: - - ``` - $ git push origin :v2.6.0-bom - To github.com:GoogleCloudPlatform/cloud-opensource-java.git - - [deleted] v2.6.0-bom - ``` From 620c86ba4f93887331a3d9638c088bc65472fce1 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 30 Sep 2021 10:55:59 -0400 Subject: [PATCH 016/113] Libraries BOM: Updating Google Cloud BOM to 0.162.0 (#2221) Updating Google Cloud BOM to 0.161.0 and associated dependencies Google Cloud BOM 0.162.0 is based on the shared dependencies BOM 2.3.0. --- boms/cloud-oss-bom/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 657bc656dc..f3fa54149b 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -45,19 +45,19 @@ UTF-8 30.1.1-jre - 0.161.0 - 2.1.2 + 0.162.0 + 2.1.6 1.40.1 1.40.0 3.17.3 - 2.4.0 - 0.89.0 + 2.5.0 + 0.90.0 1.1.0 2.0.2 2.5.0 - 1.1.0 + 1.1.2 From afa06442855c751a5c54acb8ebae5e52a1e52d7d Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 30 Sep 2021 13:19:55 -0400 Subject: [PATCH 017/113] Release 23.1.0-bom (#2222) * preparing release 23.1.0-bom * 23.1.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index f3fa54149b..673cfc5c05 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 23.0.1-SNAPSHOT + 23.1.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index cdc1879ad3..0edc1365bb 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 23.0.1-SNAPSHOT + 23.1.1-SNAPSHOT pom import From 30ce8bebe7645010183fe81bdb05149b54a4b86d Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 26 Oct 2021 16:35:06 -0400 Subject: [PATCH 018/113] libraries-bom to have google-cloud-bom 0.163.0 (#2230) * libraries-bom to have google-cloud-bom 0.163.0 * MaximumLinkageErrorsTest to exclude appengine-api-1.0-sdk --- boms/cloud-oss-bom/pom.xml | 24 +++++++++---------- .../cloud/MaximumLinkageErrorsTest.java | 21 ++++++++++++++-- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 673cfc5c05..40592f1095 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -44,20 +44,20 @@ UTF-8 - 30.1.1-jre - 0.162.0 - 2.1.6 - 1.40.1 - 1.40.0 - 3.17.3 + 31.0.1-jre + 0.163.0 + 2.2.0 + 1.41.0 + 1.40.1 + 3.18.1 - 2.5.0 - 0.90.0 - 1.1.0 - 2.0.2 - 2.5.0 - 1.1.2 + 2.6.1 + 0.91.1 + 1.2.1 + 2.0.5 + 2.6.0 + 1.1.6 diff --git a/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java b/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java index d958f0ef12..05569e4a49 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java @@ -17,6 +17,7 @@ package com.google.cloud; +import com.google.cloud.tools.opensource.classpath.ClassPathEntry; import com.google.cloud.tools.opensource.classpath.LinkageChecker; import com.google.cloud.tools.opensource.classpath.LinkageProblem; import com.google.cloud.tools.opensource.dependencies.Bom; @@ -25,12 +26,15 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; -import com.google.common.collect.Sets.SetView; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + import org.eclipse.aether.RepositoryException; +import org.eclipse.aether.artifact.Artifact; import org.junit.Assert; import org.junit.Test; @@ -54,7 +58,14 @@ public void testForNewLinkageErrors() // This only tests for newly missing methods, not new invocations of // previously missing methods. - SetView newProblems = Sets.difference(currentProblems, oldProblems); + Set newProblems = Sets.difference(currentProblems, oldProblems); + + // Appengine-api-1.0-sdk is known to contain linkage errors because it shades dependencies + // https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/441 + newProblems = + newProblems.stream() + .filter(problem -> !hasLinkageProblemFromArtifactId(problem, "appengine-api-1.0-sdk")) + .collect(Collectors.toSet()); // Check that no new linkage errors have been introduced since the baseline StringBuilder message = new StringBuilder("Baseline BOM: " + baselineCoordinates + "\n"); @@ -65,6 +76,12 @@ public void testForNewLinkageErrors() } } + private boolean hasLinkageProblemFromArtifactId(LinkageProblem problem, String artifactId) { + ClassPathEntry sourceClassPathEntry = problem.getSourceClass().getClassPathEntry(); + Artifact sourceArtifact = sourceClassPathEntry.getArtifact(); + return artifactId.equals(sourceArtifact.getArtifactId()); + } + private String findLatestNonSnapshotVersion() throws MavenRepositoryException { ImmutableList versions = RepositoryUtility.findVersions( From b673e2f57422254d61066f21b6087498b73971de Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 26 Oct 2021 20:16:33 -0400 Subject: [PATCH 019/113] Release 24.0.0-bom (#2232) * preparing release 24.0.0-bom * 24.0.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 40592f1095..8806d4822b 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 23.1.1-SNAPSHOT + 24.0.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 0edc1365bb..69f74eede8 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 23.1.1-SNAPSHOT + 24.0.1-SNAPSHOT pom import From 1ef5df924120e0b0942e68602e9e21c0bf7d7776 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 2 Nov 2021 14:12:03 -0400 Subject: [PATCH 020/113] Adding document URL to description (#2233) --- boms/cloud-oss-bom/pom.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 8806d4822b..a99a3eb214 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -11,7 +11,10 @@ pom Google Cloud Platform Supported Libraries - A compatible set of Google Cloud open source libraries. + + A compatible set of Google Cloud open source libraries. + Document: https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM + https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM Google LLC From d8a3b581a3e778b8cbcd6412a30d040d3212bbef Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 12 Nov 2021 10:56:45 -0500 Subject: [PATCH 021/113] Merging the latest gcp-lts-bom to master branch (#2235) --- boms/cloud-lts-bom/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index d1c948e512..56a2ef9950 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -62,16 +62,16 @@ 1.10.1-sp.1 0.25.2-sp.1 1.31.4-sp.1 - 6.4.4-sp.1 + 6.4.4-sp.3 2.1.0-sp.1 1.3.0-sp.1 1.111.0-sp.1 1.93.0-sp.1 1.127.12-sp.1 v2-rev20210410-1.31.0 - 1.22.0-sp.1 - 1.20.0-sp.1 - 1.113.14-sp.1 + 1.22.0-sp.2 + 1.20.0-sp.3 + 1.113.14-sp.2 1.6.4-sp.1 0.89.5-sp.1 1.9.89 From c4c121fab7de8f8dbfc6cbdc023b8675fb5614b2 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 12 Nov 2021 17:50:17 -0500 Subject: [PATCH 022/113] gcp-lts-bom version upgrade (#2236) * layer 1 set * Layer 2 set --- boms/cloud-lts-bom/pom.xml | 333 +++++++++++++++++++++++-------------- 1 file changed, 212 insertions(+), 121 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 56a2ef9950..cf4b5e676f 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -47,35 +47,51 @@ UTF-8 - 2.30.0 - - 30.1.1-jre - 1.8.1 - 3.16.0 - 1.39.2-sp.1 - 1.36.2 + + + 31.0.1-jre + 1.8.2 + 3.18.1 + 1.40.1 + 2.0.5 + 1.32.1 + 1.2.1 + 1.41.1 + 1.32.2 + 2.6.0 - 1.64.0-sp.1 - 0.81.0-sp.1 - 1.31.3-sp.1 - 1.10.1-sp.1 - 0.25.2-sp.1 - 1.31.4-sp.1 - 6.4.4-sp.3 - 2.1.0-sp.1 - 1.3.0-sp.1 - 1.111.0-sp.1 - 1.93.0-sp.1 - 1.127.12-sp.1 - v2-rev20210410-1.31.0 - 1.22.0-sp.2 - 1.20.0-sp.3 - 1.113.14-sp.2 - 1.6.4-sp.1 - 0.89.5-sp.1 - 1.9.89 - v3-rev20210429-1.31.0 + 2.6.1 + 0.92.0 + 2.2.0 + + + 1.9.91 + 1.0.0 + v3-rev20211021-1.32.1 + 2.3.3 + v2-rev20211017-1.32.1 + 2.4.2 + 2.1.9 + 2.0.6 + 3.1.0 + 6.14.0 + 2.0.6 + 1.25.2-sp.1 + 2.2.0 + 1.114.7 + 1.93.0-sp.1 + 2.1.3 + 0.92.3 + 2.1.3 + 2.2.1 + 1.0.0 + 1.1.4 + 2.0.6 + 2.2.3 + + + 2.35.0 @@ -87,39 +103,11 @@ + + - org.apache.beam - beam-sdks-java-core - ${beam.version} - - - org.apache.beam - beam-sdks-java-extensions-google-cloud-platform-core - ${beam.version} - - - org.apache.beam - beam-runners-google-cloud-dataflow-java - ${beam.version} - - - org.apache.beam - beam-sdks-java-io-google-cloud-platform - ${beam.version} - - - com.google.cloud - google-cloud-bigquery - ${google.cloud.bigquery.version} - - - com.google.apis - google-api-services-bigquery - ${google.api.services.bigquery} - - - + com.google.guava guava ${guava.version} @@ -127,7 +115,7 @@ com.google.auto.value auto-value-annotations - ${google.autovalue.version} + ${autovalue.version} com.google.protobuf @@ -139,6 +127,26 @@ protobuf-java-util ${protobuf.version} + + com.google.http-client + google-http-client + ${google-http-client.version} + + + com.google.api + api-common + ${api-common.version} + + + com.google.oauth-client + google-oauth-client + ${google-oauth-client.version} + + + com.google.auth + google-auth-library-oauth2-http + ${google-auth-library.version} + @@ -211,138 +219,221 @@ grpc-testing ${io.grpc.version} - - com.google.appengine - appengine-api-1.0-sdk - ${appengine.api.1.0.sdk.version} - com.google.api-client google-api-client - ${google.api.client.version} + ${google-api-client.version} com.google.api-client google-api-client-appengine - ${google.api.client.version} + ${google-api-client.version} - com.google.auth - google-auth-library-oauth2-http - ${google.auth.library.version} + com.google.api.grpc + proto-google-common-protos + ${proto-google-common-protos.version} - com.google.oauth-client - google-oauth-client - ${google.oauth.client.version} + com.google.api + gax + ${gax.version} + + + com.google.api + gax-grpc + ${gax.version} + + + com.google.api + gax-httpjson + ${gax-httpjson.version} + + + com.google.cloud + google-cloud-core + ${google-cloud-core.version} + + + + + com.google.appengine + appengine-api-1.0-sdk + ${appengine-api-1.0-sdk.version} + + + com.google.appengine + appengine-testing + ${appengine-api-1.0-sdk.version} + + + com.google.cloud + google-iam-admin + ${google-iam-admin.version} + + + com.google.apis + google-api-services-androidpublisher + ${google-api-services-androidpublisher.version} + + + com.google.cloud + google-cloud-bigquery + ${google-cloud-bigquery.version} + + + com.google.apis + google-api-services-bigquery + ${google-api-services-bigquery.version} + + + com.google.cloud + + google-cloud-bigquerystorage-bom + ${google-cloud-bigquerystorage.version} com.google.cloud google-cloud-storage - ${google.cloud.storage.version} + ${google-cloud-storage.version} com.google.cloud - google-cloud-bigtable - ${google.cloud.bigtable.version} + + google-cloud-trace-bom + ${google-cloud-trace.version} + + + com.google.cloud + + google-cloud-monitoring-bom + ${google-cloud-monitoring.version} + + + com.google.cloud + google-cloud-spanner + ${google-cloud-spanner.version} com.google.api.grpc - proto-google-cloud-bigtable-v2 - ${google.cloud.bigtable.version} + proto-google-cloud-spanner-admin-database-v1 + ${google-cloud-spanner.version} - com.google.cloud.bigtable - bigtable-hbase-beam - ${bigtable-hbase-beam.version} + com.google.api.grpc + proto-google-cloud-spanner-v1 + ${google-cloud-spanner.version} com.google.cloud - google-cloud-trace - ${google.cloud.trace.version} + + google-cloud-tasks-bom + ${google-cloud-tasks.version} - com.google.api.grpc - proto-google-cloud-trace-v1 - ${google.cloud.trace.version} + com.google.cloud.bigtable + bigtable-hbase-beam + ${bigtable-hbase-beam.version} com.google.cloud - google-cloud-monitoring - ${google.cloud.monitoring.version} + google-cloud-bigtable + ${google-cloud-bigtable.version} com.google.api.grpc - proto-google-cloud-monitoring-v3 - ${google.cloud.monitoring.version} + proto-google-cloud-bigtable-v2 + ${google-cloud-bigtable.version} com.google.cloud google-cloud-pubsub - ${google.cloud.pubsub.version} + ${google-cloud-pubsub.version} com.google.api.grpc proto-google-cloud-pubsub-v1 - ${proto.google.cloud.pubsub.version.v1} + ${proto-google-cloud-pubsub-v1.version} com.google.cloud.datastore datastore-v1-proto-client - ${datastore.v1.proto.client.version} + ${datastore-v1-proto-client.version} com.google.api.grpc proto-google-cloud-datastore-v1 - ${proto.google.cloud.datastore.v1} + ${proto-google-cloud-datastore-v1.version} com.google.cloud - google-cloud-spanner - ${google.cloud.spanner.version} + + google-cloud-service-usage-bom + ${google-cloud-service-usage.version} - com.google.api.grpc - proto-google-cloud-spanner-admin-database-v1 - ${google.cloud.spanner.version} + com.google.cloud + + google-cloud-container-bom + ${google-cloud-container.version} - com.google.api.grpc - proto-google-cloud-spanner-v1 - ${google.cloud.spanner.version} + com.google.cloud + + google-cloud-orchestration-airflow-bom + ${google-cloud-orchestration-airflow.version} - com.google.apis - google-api-services-androidpublisher - ${androidpublisher.version} + com.google.cloud + + google-cloud-resourcemanager-bom + ${google-cloud-resourcemanager.version} - - - com.google.api - api-common - ${api.common.version} + com.google.cloud + + google-cloud-redis-bom + ${google-cloud-redis.version} - com.google.api - gax - ${gax.version} + com.google.cloud.bigdataoss + gcs-connector + hadoop3-${gcs-connector.version} - com.google.api - gax-grpc - ${gax.version} + com.google.cloud.bigdataoss + gcsio + ${gcs-connector.version} - com.google.api - gax-httpjson - ${gax.httpjson.version} + com.google.cloud.bigdataoss + util + ${gcs-connector.version} + + + + From ecb2270e90d5d56decfe04c55bf59c7194bc946a Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 15 Nov 2021 23:04:29 -0500 Subject: [PATCH 023/113] Added a check for no-downgrade rule for BOMs (#2237) * Added a check for no-downgrade rule * Updated comment * Fixed the versions in the BOM * Applied review --- boms/cloud-lts-bom/pom.xml | 4 +- .../tools/opensource/dashboard/BomTest.java | 103 ++++++++++++++++-- 2 files changed, 94 insertions(+), 13 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index cf4b5e676f..021871a3f3 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -62,7 +62,7 @@ 2.6.1 - 0.92.0 + 0.91.1 2.2.0 @@ -80,7 +80,7 @@ 1.25.2-sp.1 2.2.0 1.114.7 - 1.93.0-sp.1 + 1.96.7 2.1.3 0.92.3 2.1.3 diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java index 56bd491bca..d1b8700422 100644 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java +++ b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java @@ -16,40 +16,52 @@ package com.google.cloud.tools.opensource.dashboard; +import com.google.cloud.tools.opensource.classpath.ClassPathBuilder; +import com.google.cloud.tools.opensource.classpath.ClassPathEntry; +import com.google.cloud.tools.opensource.classpath.ClassPathResult; +import com.google.cloud.tools.opensource.classpath.DependencyMediation; +import com.google.cloud.tools.opensource.dependencies.Artifacts; +import com.google.cloud.tools.opensource.dependencies.Bom; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.List; +import java.util.*; import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.util.version.GenericVersionScheme; +import org.eclipse.aether.version.InvalidVersionSpecificationException; +import org.eclipse.aether.version.Version; +import org.eclipse.aether.version.VersionScheme; import org.junit.Assert; import org.junit.Test; -import com.google.cloud.tools.opensource.dependencies.Bom; -import com.google.cloud.tools.opensource.dependencies.MavenRepositoryException; public class BomTest { - + private static VersionScheme versionScheme = new GenericVersionScheme(); + @Test - public void testLtsBom() - throws IOException, MavenRepositoryException { + public void testLtsBom() throws Exception { Path bomPath = Paths.get("..", "boms", "cloud-lts-bom", "pom.xml").toAbsolutePath(); checkBom(bomPath); } - + @Test - public void testLibrariesBom() - throws IOException, MavenRepositoryException { + public void testLibrariesBom() throws Exception { Path bomPath = Paths.get("..", "boms", "cloud-oss-bom", "pom.xml").toAbsolutePath(); checkBom(bomPath); } - private void checkBom(Path bomPath) throws MavenRepositoryException, IOException { - List artifacts = Bom.readBom(bomPath).getManagedDependencies(); + private void checkBom(Path bomPath) throws Exception { + Bom bom = Bom.readBom(bomPath); + List artifacts = bom.getManagedDependencies(); for (Artifact artifact : artifacts) { assertReachable(buildMavenCentralUrl(artifact)); } + + assertNoDowngradeRule(bom); } private static String buildMavenCentralUrl(Artifact artifact) { @@ -72,4 +84,73 @@ private static void assertReachable(String url) throws IOException { Assert.fail("Could not reach " + url + "\n" + ex.getMessage()); } } + + /** + * Asserts that the members of the {@code bom} satisfy the no-downgrade rule. This rule means that + * the members have the highest versions among the dependencies of them. If there's a violation, + * users of the BOM would see our BOM downgrading certain dependencies. Downgrading a dependency + * is bad practice in general because newer versions have more features (classes and methods). + * + *

For example, if google-http-client 1.40.1 is in the BOM, then no other libraries in the BOM + * depend on the higher version of the google-http-client. + * + * @param bom the BOM to assert with this no-downgrade rule. + */ + private static void assertNoDowngradeRule(Bom bom) throws InvalidVersionSpecificationException { + List violations = new ArrayList<>(); + Map bomArtifacts = new HashMap<>(); + for (Artifact artifact : bom.getManagedDependencies()) { + bomArtifacts.put(Artifacts.makeKey(artifact), artifact); + } + + for (Artifact artifact : bom.getManagedDependencies()) { + violations.addAll(findNoDowngradeViolation(bomArtifacts, artifact)); + } + + String violationMessage = Joiner.on("\n").join(violations); + Assert.assertTrue(violationMessage, violations.isEmpty()); + } + + /** + * Returns messages describing the violation of the no-downgrade rule by {@code artifact} against + * the BOM containing {@code bomArtifacts}. An empty list if there is no violations. + */ + private static ImmutableList findNoDowngradeViolation( + Map bomArtifacts, Artifact artifact) + throws InvalidVersionSpecificationException { + ImmutableList.Builder violations = ImmutableList.builder(); + + ClassPathBuilder classPathBuilder = new ClassPathBuilder(); + ClassPathResult result = + classPathBuilder.resolve(ImmutableList.of(artifact), false, DependencyMediation.MAVEN); + for (ClassPathEntry entry : result.getClassPath()) { + Artifact transitiveDependency = entry.getArtifact(); + String key = Artifacts.makeKey(transitiveDependency); + Artifact bomArtifact = bomArtifacts.get(key); + if (bomArtifact == null) { + // transitiveDependency is not part of the BOM + continue; + } + + Version versionInBom = versionScheme.parseVersion(bomArtifact.getVersion()); + Version versionInTransitiveDependency = + versionScheme.parseVersion(transitiveDependency.getVersion()); + + if (versionInTransitiveDependency.compareTo(versionInBom) <= 0) { + // When versionInTransitiveDependency is less than or equal to versionInBom, it satisfies + // the no-downgrade rule. + continue; + } + + // A violation of the no-downgrade rule is found. + violations.add( + artifact + + " has a transitive dependency " + + transitiveDependency + + ". This is higher version than " + + bomArtifact + + " in the BOM"); + } + return violations.build(); + } } From 90c299adab041f9092c083da94dac0fd8d60e2aa Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 17 Nov 2021 12:49:58 -0500 Subject: [PATCH 024/113] Moving BomTest from dashboard module to boms module (#2241) --- .../test/java/com/google/cloud/BomContentTest.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) rename dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java => boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java (94%) diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java similarity index 94% rename from dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java rename to boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index d1b8700422..720d77d3c6 100644 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/BomTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.cloud.tools.opensource.dashboard; +package com.google.cloud; import com.google.cloud.tools.opensource.classpath.ClassPathBuilder; import com.google.cloud.tools.opensource.classpath.ClassPathEntry; @@ -29,8 +29,10 @@ import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; - +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.util.version.GenericVersionScheme; import org.eclipse.aether.version.InvalidVersionSpecificationException; @@ -39,18 +41,18 @@ import org.junit.Assert; import org.junit.Test; -public class BomTest { +public class BomContentTest { private static VersionScheme versionScheme = new GenericVersionScheme(); @Test public void testLtsBom() throws Exception { - Path bomPath = Paths.get("..", "boms", "cloud-lts-bom", "pom.xml").toAbsolutePath(); + Path bomPath = Paths.get("..", "cloud-lts-bom", "pom.xml").toAbsolutePath(); checkBom(bomPath); } @Test public void testLibrariesBom() throws Exception { - Path bomPath = Paths.get("..", "boms", "cloud-oss-bom", "pom.xml").toAbsolutePath(); + Path bomPath = Paths.get("..", "cloud-oss-bom", "pom.xml").toAbsolutePath(); checkBom(bomPath); } From c04a2b6ddf50668f49a882b1d3452fd4483142e9 Mon Sep 17 00:00:00 2001 From: Daniel Zou Date: Thu, 18 Nov 2021 10:56:08 -0500 Subject: [PATCH 025/113] Extend test to find duplicate classes in artifacts (#2229) --- .../java/com/google/cloud/BomContentTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index 720d77d3c6..b7a8b460d7 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -64,6 +64,7 @@ private void checkBom(Path bomPath) throws Exception { } assertNoDowngradeRule(bom); + assertUniqueClasses(artifacts); } private static String buildMavenCentralUrl(Artifact artifact) { @@ -76,6 +77,66 @@ private static String buildMavenCentralUrl(Artifact artifact) { + "/"; } + /** + * Asserts that the BOM only provides JARs which contains unique class names to the classpath. + */ + private static void assertUniqueClasses(List allArtifacts) + throws InvalidVersionSpecificationException, IOException { + + StringBuilder errorMessageBuilder = new StringBuilder(); + + ClassPathBuilder classPathBuilder = new ClassPathBuilder(); + ClassPathResult result = + classPathBuilder.resolve(allArtifacts, false, DependencyMediation.MAVEN); + + // A Map of every class name to its artifact ID. + HashMap fullClasspathMap = new HashMap<>(); + + for (ClassPathEntry classPathEntry : result.getClassPath()) { + Artifact currentArtifact = classPathEntry.getArtifact(); + + if (!currentArtifact.getGroupId().contains("google") + || currentArtifact.getGroupId().contains("com.google.android") + || currentArtifact.getArtifactId().startsWith("proto-") + || currentArtifact.getArtifactId().equals("protobuf-javalite") + || currentArtifact.getArtifactId().equals("appengine-testing")) { + // Skip libraries that produce false positives. + // See: https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/2226 + continue; + } + + String artifactCoordinates = Artifacts.toCoordinates(currentArtifact); + + for (String className : classPathEntry.getFileNames()) { + if (className.contains("javax.annotation") + || className.contains("$") + || className.equals("com.google.cloud.location.LocationsGrpc") + || className.endsWith("package-info")) { + // Ignore annotations, nested classes, and package-info files. + // Ignore LocationsGrpc classes which are duplicated in generated grpc libraries. + continue; + } + + String previousArtifact = fullClasspathMap.get(className); + + if (previousArtifact != null) { + String msg = String.format( + "Duplicate class %s found in classpath. Found in artifacts %s and %s.\n", + className, + previousArtifact, + artifactCoordinates); + errorMessageBuilder.append(msg); + } else { + fullClasspathMap.put(className, artifactCoordinates); + } + } + } + + String error = errorMessageBuilder.toString(); + Assert.assertTrue( + "Failing test due to duplicate classes found on classpath:\n" + error, error.isEmpty()); + } + private static void assertReachable(String url) throws IOException { HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("HEAD"); From 0095e4ee89bf2329455f65236252cfc024fd71b0 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 18 Nov 2021 12:20:14 -0500 Subject: [PATCH 026/113] gcsio 2.2.4 (#2242) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 021871a3f3..59ec8aef3e 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -88,7 +88,7 @@ 1.0.0 1.1.4 2.0.6 - 2.2.3 + 2.2.4 2.35.0 From 901f00b49f5d79e915fb091a5277503df7553928 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 19 Nov 2021 17:34:08 -0500 Subject: [PATCH 027/113] gcp-lts-bom: clearing comments on BOMs (#2243) * gcp-lts-bom: clearing comments on BOMs * Using google-cloud-datastore-bom Google-cloud-datastore-bom includes google-cloud-datastore and its proto API surface * Updating variable to have google-cloud-datastore * BOM requires import --- boms/cloud-lts-bom/pom.xml | 45 ++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 59ec8aef3e..6e2179dd44 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -81,8 +81,7 @@ 2.2.0 1.114.7 1.96.7 - 2.1.3 - 0.92.3 + 2.1.3 2.1.3 2.2.1 1.0.0 @@ -288,9 +287,10 @@ com.google.cloud - google-cloud-bigquerystorage-bom ${google-cloud-bigquerystorage.version} + pom + import com.google.cloud @@ -299,15 +299,17 @@ com.google.cloud - google-cloud-trace-bom ${google-cloud-trace.version} + pom + import com.google.cloud - google-cloud-monitoring-bom ${google-cloud-monitoring.version} + pom + import com.google.cloud @@ -326,9 +328,10 @@ com.google.cloud - google-cloud-tasks-bom ${google-cloud-tasks.version} + pom + import com.google.cloud.bigtable @@ -337,6 +340,7 @@ com.google.cloud + google-cloud-bigtable ${google-cloud-bigtable.version} @@ -356,44 +360,51 @@ ${proto-google-cloud-pubsub-v1.version} - com.google.cloud.datastore - datastore-v1-proto-client - ${datastore-v1-proto-client.version} + com.google.cloud + google-cloud-datastore-bom + ${google-cloud-datastore.version} + pom + import - com.google.api.grpc - proto-google-cloud-datastore-v1 - ${proto-google-cloud-datastore-v1.version} + com.google.cloud.datastore + datastore-v1-proto-client + ${google-cloud-datastore.version} com.google.cloud - google-cloud-service-usage-bom ${google-cloud-service-usage.version} + pom + import com.google.cloud - google-cloud-container-bom ${google-cloud-container.version} + pom + import com.google.cloud - google-cloud-orchestration-airflow-bom ${google-cloud-orchestration-airflow.version} + pom + import com.google.cloud - google-cloud-resourcemanager-bom ${google-cloud-resourcemanager.version} + pom + import com.google.cloud - google-cloud-redis-bom ${google-cloud-redis.version} + pom + import com.google.cloud.bigdataoss From 56a0a893245c53f709b363fe16d4154241ea1e82 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 22 Nov 2021 17:49:48 -0500 Subject: [PATCH 028/113] BOM import type check (#2244) --- .../test/java/com/google/cloud/BomContentTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index b7a8b460d7..6daaff06b4 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -65,6 +65,7 @@ private void checkBom(Path bomPath) throws Exception { assertNoDowngradeRule(bom); assertUniqueClasses(artifacts); + assertBomIsImported(bom); } private static String buildMavenCentralUrl(Artifact artifact) { @@ -216,4 +217,14 @@ private static ImmutableList findNoDowngradeViolation( } return violations.build(); } + + private void assertBomIsImported(Bom bom) { + // BOMs must be declared as "import" type. Otherwise, the BOM users would see + // "google-cloud-XXX-bom" as an artifact declared in the BOM, not the content of it. + for (Artifact artifact : bom.getManagedDependencies()) { + String artifactId = artifact.getArtifactId(); + Assert.assertFalse( + artifactId + " must be declared with import type", artifactId.endsWith("-bom")); + } + } } From 16fcbb514722f6e6f5b630480386767b28336bac Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 23 Nov 2021 11:55:05 -0500 Subject: [PATCH 029/113] gcp-lts-bom: adding google-cloud-iamcredentials (#2246) --- boms/cloud-lts-bom/pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 6e2179dd44..3f98d1252d 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -68,6 +68,7 @@ 1.9.91 1.0.0 + 2.0.6 v3-rev20211021-1.32.1 2.3.3 v2-rev20211017-1.32.1 @@ -267,8 +268,17 @@ com.google.cloud - google-iam-admin + google-iam-admin-bom ${google-iam-admin.version} + pom + import + + + com.google.cloud + google-cloud-iamcredentials-bom + ${google-cloud-iamcredentials.version} + pom + import com.google.apis From 52895f2e36fccd16431f58013ee81e5060e33eb3 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 29 Nov 2021 16:41:31 -0500 Subject: [PATCH 030/113] gcp-lts-bom: adding google-cloud-logging (#2247) --- boms/cloud-lts-bom/pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 3f98d1252d..1cdd6ec730 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -88,6 +88,7 @@ 1.0.0 1.1.4 2.0.6 + 3.4.0 2.2.4 @@ -416,6 +417,13 @@ pom import + + com.google.cloud + google-cloud-logging-bom + ${google-cloud-logging.version} + pom + import + com.google.cloud.bigdataoss gcs-connector From 8e6aa8c492243c9c0c90a554734a265053d73a64 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 8 Dec 2021 11:50:47 -0500 Subject: [PATCH 031/113] Google Cloud BOM 0.164.0 (#2248) * Google Cloud BOM 0.164.0 * Filter linkage errors from com.oracle.svm * suppression rule for flogger class * flogger suppression rule * Adjusted invoker assertion --- boms/cloud-oss-bom/pom.xml | 20 +++++++------- .../linkage-checker-exclusion-default.xml | 27 ++++++++++++++++--- .../verify.groovy | 2 +- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index a99a3eb214..ec92650530 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,19 +48,19 @@ UTF-8 31.0.1-jre - 0.163.0 - 2.2.0 - 1.41.0 + 0.164.0 + 2.3.3 + 1.42.1 1.40.1 - 3.18.1 + 3.19.1 - 2.6.1 - 0.91.1 - 1.2.1 - 2.0.5 - 2.6.0 - 1.1.6 + 2.7.1 + 0.92.1 + 1.3.0 + 2.1.1 + 2.7.0 + 1.1.7 diff --git a/dependencies/src/main/resources/linkage-checker-exclusion-default.xml b/dependencies/src/main/resources/linkage-checker-exclusion-default.xml index 742570d89f..9721394e94 100644 --- a/dependencies/src/main/resources/linkage-checker-exclusion-default.xml +++ b/dependencies/src/main/resources/linkage-checker-exclusion-default.xml @@ -12,9 +12,6 @@ - - - @@ -404,4 +401,28 @@ https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/1871 + + + + + + + + + Flogger's JavaLangAccessStackGetter and StackWalkerStackGetter trys to use available classes + in different JDK versions. Certain classes are unavailable in a JDK. + + + + + + + + + + + Flogger's JavaLangAccessStackGetter and StackWalkerStackGetter trys to use available classes + in different JDK versions. Certain classes are unavailable in a JDK. + + diff --git a/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy b/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy index 1c46d86b5c..e5d69decfd 100644 --- a/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy +++ b/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy @@ -14,6 +14,6 @@ assert !buildLog.text.contains("NullPointerException") // 4 linkage errors are references to java.util.concurrent.Flow class, which does not exist in // Java 8 runtime yet. -def expectedErrorCount = System.getProperty("java.version").startsWith("1.8.") ? 798 : 794 +def expectedErrorCount = System.getProperty("java.version").startsWith("1.8.") ? 111 : 107 assert buildLog.text.contains("Linkage Checker rule found $expectedErrorCount errors:") From e96293c633be0aabd482d02b6e74846e45c4d822 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 8 Dec 2021 21:09:13 -0500 Subject: [PATCH 032/113] Release 24.1.0-bom (#2249) --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index ec92650530..58e859393e 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.0.1-SNAPSHOT + 24.1.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 69f74eede8..1ad6c754db 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.0.1-SNAPSHOT + 24.1.1-SNAPSHOT pom import From 6ac359965a1175802af7a961383e5d38106c7e13 Mon Sep 17 00:00:00 2001 From: Daniel Zou Date: Mon, 20 Dec 2021 10:11:48 -0500 Subject: [PATCH 033/113] bump bigtable-hbase-beam for 2.x lts bom (#2253) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 1cdd6ec730..4ec5b1a1fb 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -78,7 +78,7 @@ 3.1.0 6.14.0 2.0.6 - 1.25.2-sp.1 + 1.25.2-sp.2 2.2.0 1.114.7 1.96.7 From 1c722ca7eb39dba6935a2b63f468dcca3fe6461e Mon Sep 17 00:00:00 2001 From: Daniel Zou Date: Tue, 21 Dec 2021 15:33:05 -0500 Subject: [PATCH 034/113] Upgrades the Google BOM to 0.165.0 (#2254) --- boms/cloud-oss-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 58e859393e..70f80644f6 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,7 +48,7 @@ UTF-8 31.0.1-jre - 0.164.0 + 0.165.0 2.3.3 1.42.1 1.40.1 From b8833b1619d537d33444436fffeedc72ba6b0876 Mon Sep 17 00:00:00 2001 From: Daniel Zou Date: Tue, 4 Jan 2022 14:00:01 -0500 Subject: [PATCH 035/113] Release 24.1.1-bom (#2255) --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 70f80644f6..957b552810 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.1.1-SNAPSHOT + 24.1.2-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 1ad6c754db..7808edf6cf 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.1.1-SNAPSHOT + 24.1.2-SNAPSHOT pom import From 81bac6b81a2b30b62fa10dd82557faaf56f1fb19 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 4 Jan 2022 14:19:39 -0500 Subject: [PATCH 036/113] Uncomment Beam 2.35.0 in LTS BOM 2.0 (#2257) * Uncomment Beam 2.35.0 * exclude com.google.cloud.bigtable from unique class assertion --- boms/cloud-lts-bom/pom.xml | 2 -- .../src/test/java/com/google/cloud/BomContentTest.java | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 4ec5b1a1fb..bfc440a700 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -441,7 +441,6 @@ - diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index 6daaff06b4..cd50e3d9ee 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -98,6 +98,7 @@ private static void assertUniqueClasses(List allArtifacts) if (!currentArtifact.getGroupId().contains("google") || currentArtifact.getGroupId().contains("com.google.android") + || currentArtifact.getGroupId().contains("com.google.cloud.bigtable") || currentArtifact.getArtifactId().startsWith("proto-") || currentArtifact.getArtifactId().equals("protobuf-javalite") || currentArtifact.getArtifactId().equals("appengine-testing")) { From da6c77fe2907d32d0e3683ce296de9c049630fa4 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 4 Jan 2022 15:23:24 -0500 Subject: [PATCH 037/113] Spanner 6.14.1 in LTS BOM 2 (#2258) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index bfc440a700..9a58d46922 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -76,7 +76,7 @@ 2.1.9 2.0.6 3.1.0 - 6.14.0 + 6.14.1 2.0.6 1.25.2-sp.2 2.2.0 From a12464963688f75a86b124400d74a36b2e3671e7 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 5 Jan 2022 17:06:07 -0500 Subject: [PATCH 038/113] protobuf 3.19.2 (#2260) --- boms/cloud-oss-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 957b552810..46e9e5f99f 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -52,7 +52,7 @@ 2.3.3 1.42.1 1.40.1 - 3.19.1 + 3.19.2 2.7.1 From 39ba58d0a70e0a170155e05962b50e8e6c672a8d Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 7 Jan 2022 20:21:14 -0500 Subject: [PATCH 039/113] protobuf 3.18.2 (#2262) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 9a58d46922..1a62034ae6 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -51,7 +51,7 @@ 31.0.1-jre 1.8.2 - 3.18.1 + 3.18.2 1.40.1 2.0.5 1.32.1 From 76384f1fdc4e76419ab1864f5e4ee76b0b36fbbf Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 7 Jan 2022 20:21:41 -0500 Subject: [PATCH 040/113] Release 24.1.2-bom (#2261) --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 46e9e5f99f..ca4d1ee3a6 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.1.2-SNAPSHOT + 24.1.3-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 7808edf6cf..999ddcc3b6 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.1.2-SNAPSHOT + 24.1.3-SNAPSHOT pom import From a4a8d56f834a7cbd11aaa94388443b7e65df087c Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 10 Jan 2022 10:29:29 -0500 Subject: [PATCH 041/113] google-cloud-bom 0.166.0 and shared-deps 2.6.0 (#2267) Google Cloud BOM 0.166.0 is built on the shared dependnecies BOM 2.6.0 https://github.com/googleapis/java-shared-dependencies/blob/v2.6.0/first-party-dependencies/pom.xml There, GAX is 2.8.1 and it has gax-httpjson 0.93.1 https://search.maven.org/artifact/com.google.api/gax-bom/2.8.1/pom --- boms/cloud-oss-bom/pom.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index ca4d1ee3a6..23b4850b34 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,19 +48,19 @@ UTF-8 31.0.1-jre - 0.165.0 - 2.3.3 - 1.42.1 - 1.40.1 + 0.166.0 + 2.3.5 + 1.43.2 + 1.41.0 3.19.2 - 2.7.1 - 0.92.1 + 2.8.1 + 0.93.1 1.3.0 - 2.1.1 - 2.7.0 - 1.1.7 + 2.1.2 + 2.7.1 + 1.2.0 From 60c85a9cf1ce7309388477d9a473d712eecdc9ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 10:30:30 -0500 Subject: [PATCH 042/113] Bump protobuf-java from 3.18.1 to 3.18.2 in /boms/cloud-lts-bom (#2266) Bumps [protobuf-java](https://github.com/protocolbuffers/protobuf) from 3.18.1 to 3.18.2. - [Release notes](https://github.com/protocolbuffers/protobuf/releases) - [Changelog](https://github.com/protocolbuffers/protobuf/blob/master/generate_changelog.py) - [Commits](https://github.com/protocolbuffers/protobuf/compare/v3.18.1...v3.18.2) --- updated-dependencies: - dependency-name: com.google.protobuf:protobuf-java dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 3e5f2e024ab552cd78a1703e42cd69a03717d14f Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 10 Jan 2022 14:24:57 -0500 Subject: [PATCH 043/113] Release 24.2.0-bom (#2268) * preparing release 24.2.0-bom * 24.2.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 23b4850b34..50109f5cce 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.1.3-SNAPSHOT + 24.2.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 999ddcc3b6..d8c4414ff2 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.1.3-SNAPSHOT + 24.2.1-SNAPSHOT pom import From b60f12c76cb725111e1cd305172f3c0b9764a4f4 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 10 Jan 2022 14:25:18 -0500 Subject: [PATCH 044/113] appengine-api-sdk 1.9.93 in lts 2 (#2265) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 1a62034ae6..c874f8ae52 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -66,7 +66,7 @@ 2.2.0 - 1.9.91 + 1.9.93 1.0.0 2.0.6 v3-rev20211021-1.32.1 From 6f21998d5aa6ca8577aec6f55aee90235ca1aea4 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 13 Jan 2022 14:16:55 -0500 Subject: [PATCH 045/113] bigtable-hbase-beam 1.25.2-sp.3 (#2271) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index c874f8ae52..68a6781e5a 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -78,7 +78,7 @@ 3.1.0 6.14.1 2.0.6 - 1.25.2-sp.2 + 1.25.2-sp.3 2.2.0 1.114.7 1.96.7 From 2dca70383141a3281c2fba86a92c5f600cc0a582 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 18 Jan 2022 10:29:05 -0500 Subject: [PATCH 046/113] Bumping the gcp-lts-bom version to 3.0.0-SNAPSHOT (#2274) * test * Bump the major version in master branch --- README.md | 2 ++ boms/cloud-lts-bom/pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d0e828bc5f..a5854976be 100644 --- a/README.md +++ b/README.md @@ -62,3 +62,5 @@ This project is built using _Maven_. This is not an officially supported Google product. + + diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 68a6781e5a..b04ea348b1 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 2.0.0-SNAPSHOT + 3.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM From 97a8dc6a391abe4ff05153983e948a87e7600734 Mon Sep 17 00:00:00 2001 From: Mridula <66699525+mpeddada1@users.noreply.github.com> Date: Wed, 26 Jan 2022 15:41:57 -0500 Subject: [PATCH 047/113] Enable SonarCloud Github Action (#2275) Enable SonarCloud Github Action --- .github/workflows/sonar.yaml | 55 ++++++++++++++++++++++++++++++++++++ pom.xml | 36 +++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 .github/workflows/sonar.yaml diff --git a/.github/workflows/sonar.yaml b/.github/workflows/sonar.yaml new file mode 100644 index 0000000000..3e4525a8d2 --- /dev/null +++ b/.github/workflows/sonar.yaml @@ -0,0 +1,55 @@ +name: SonarCloud Analysis +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + schedule: + - cron: '30 9 * * *' # 09:30 UTC every day + +jobs: + build: + if: github.repository == 'GoogleCloudPlatform/cloud-opensource-java' # Only run on upstream branch + name: Build with Sonar + runs-on: ubuntu-20.04 + steps: + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d' --utc)" + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Cache SonarCloud packages + uses: actions/cache@v2 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - uses: actions/cache@v2 + id: mvn-cache + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.date }} + - name: Mvn install w/ coverage + run: | + ./mvnw -B -e -ntp --activate-profiles codecoverage clean install \ + -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false \ + -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 + - name: Analyze with SonarCloud + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: | + ./mvnw \ + -B \ + --activate-profiles codecoverage \ + -Dsonar.projectKey=GoogleCloudPlatform_cloud-opensource-java \ + -Dsonar.host.url=https://sonarcloud.io \ + -Dsonar.organization=googlecloudplatform \ + org.sonarsource.scanner.maven:sonar-maven-plugin:sonar diff --git a/pom.xml b/pom.xml index 3124fb497a..6b2572e862 100644 --- a/pom.xml +++ b/pom.xml @@ -280,6 +280,42 @@ + + codecoverage + + + + maven-surefire-plugin + + + @{argLine} -Xms1024m -Xmx1024m + + **/*Test.java + + + + + org.jacoco + jacoco-maven-plugin + 0.8.6 + + + + prepare-agent + + + + report + test + + report + + + + + + + From 5a9391eac91042f7963ec38ea86d2daa8b768743 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 27 Jan 2022 14:48:30 -0500 Subject: [PATCH 048/113] Updating BOM document URL (#2250) --- README.md | 2 +- boms/cloud-oss-bom/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a5854976be..4e18b55387 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/Linkage-Checke # GCP Libraries BOM -The [GCP Libraries BOM](https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM) is a Bill-of-Materials (BOM) that +The [GCP Libraries BOM](https://cloud.google.com/java/docs/bom) is a Bill-of-Materials (BOM) that provides consistent versions of Google Cloud Java libraries that work together without linkage errors. diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 50109f5cce..1ca6231be0 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -13,9 +13,9 @@ Google Cloud Platform Supported Libraries A compatible set of Google Cloud open source libraries. - Document: https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM + Document: https://cloud.google.com/java/docs/bom - https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM + https://cloud.google.com/java/docs/bom Google LLC https://cloud.google.com From 092d0ae9d903c8f745ba7e6bbac9ff05405e901a Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 4 Feb 2022 21:26:10 -0500 Subject: [PATCH 049/113] Add --no-transfer-progress option to mvn command (#2280) Fixes #2279 --- .github/workflows/sonar.yaml | 2 +- gradle-plugin/kokoro/release.sh | 2 +- kokoro/continuous.bat | 2 +- kokoro/parent_release_build.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sonar.yaml b/.github/workflows/sonar.yaml index 3e4525a8d2..3fff749d36 100644 --- a/.github/workflows/sonar.yaml +++ b/.github/workflows/sonar.yaml @@ -47,7 +47,7 @@ jobs: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | ./mvnw \ - -B \ + -B -ntp \ --activate-profiles codecoverage \ -Dsonar.projectKey=GoogleCloudPlatform_cloud-opensource-java \ -Dsonar.host.url=https://sonarcloud.io \ diff --git a/gradle-plugin/kokoro/release.sh b/gradle-plugin/kokoro/release.sh index 3c6632cb80..8f3e27f428 100755 --- a/gradle-plugin/kokoro/release.sh +++ b/gradle-plugin/kokoro/release.sh @@ -18,7 +18,7 @@ cat "${KOKORO_KEYSTORE_DIR}/72743_gradle_publish_secret" >> $HOME_GRADLE_PROPERT # The gradle plugin depends on the dependencies module cd github/cloud-opensource-java -./mvnw -V -B clean install +./mvnw -V -B -ntp clean install cd gradle-plugin diff --git a/kokoro/continuous.bat b/kokoro/continuous.bat index 0d758ee8c3..d090efe5a9 100644 --- a/kokoro/continuous.bat +++ b/kokoro/continuous.bat @@ -5,7 +5,7 @@ set PATH=%JAVA_HOME%\bin;%PATH% cd github/cloud-opensource-java -call mvnw.cmd -V -B clean install javadoc:jar +call mvnw.cmd -V -B -ntp clean install javadoc:jar if %errorlevel% neq 0 exit /b %errorlevel% @echo on diff --git a/kokoro/parent_release_build.sh b/kokoro/parent_release_build.sh index de48e414cd..9aebcb0925 100755 --- a/kokoro/parent_release_build.sh +++ b/kokoro/parent_release_build.sh @@ -9,7 +9,7 @@ cd github/cloud-opensource-java # Build the project (excluding boms) to ensure validity of parent pom # The artifact is unused in this parent-pom build. -./mvnw -V -pl 'dependencies,enforcer-rules' -Prelease -B -U verify +./mvnw -V -pl 'dependencies,enforcer-rules' -Prelease -B -ntp -U verify # copy pom with the name expected in the Maven repository ARTIFACT_ID=$(mvn -B help:evaluate -Dexpression=project.artifactId 2>/dev/null | grep -v "^\[") From 153eb29431fe99b5caee103a2623abad1d424adc Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 8 Feb 2022 12:36:39 -0500 Subject: [PATCH 050/113] Google Cloud BOM 0.167.0 and other related dependencies (#2281) * Google Cloud BOM 0.167.0 and other related dependencies * Debugging * cause may be null when printing * Added exclusion rule * Excluding com.oracle.objectfile --- boms/cloud-oss-bom/pom.xml | 22 +++++----- boms/integration-tests/pom.xml | 1 + .../opensource/classpath/LinkageProblem.java | 8 ++-- .../linkage-checker-exclusion-default.xml | 44 ++++++++++++++++--- 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 1ca6231be0..56e56c3a33 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,19 +48,19 @@ UTF-8 31.0.1-jre - 0.166.0 - 2.3.5 - 1.43.2 - 1.41.0 - 3.19.2 + 0.167.0 + 2.4.0 + 1.44.0 + 1.41.2 + 3.19.3 - 2.8.1 - 0.93.1 - 1.3.0 - 2.1.2 - 2.7.1 - 1.2.0 + 2.11.0 + 0.96.0 + 1.4.0 + 2.1.3 + 2.7.2 + 1.2.1 diff --git a/boms/integration-tests/pom.xml b/boms/integration-tests/pom.xml index e77d87d238..2d0f9eafd5 100644 --- a/boms/integration-tests/pom.xml +++ b/boms/integration-tests/pom.xml @@ -39,6 +39,7 @@ false -Xms128m -Xmx2048m + false diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblem.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblem.java index ceb25c3034..1eadf1133a 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblem.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageProblem.java @@ -218,10 +218,12 @@ public static String formatLinkageProblems( for (AbstractMethodProblem abstractMethodProblem : abstractMethodProblems.build()) { output.append(abstractMethodProblem + "\n"); - output.append(" Cause:\n"); LinkageProblemCause cause = abstractMethodProblem.getCause(); - String causeWithIndent = cause.toString().replaceAll("\n", "\n "); - output.append(" " + causeWithIndent + "\n"); + if (cause != null) { + output.append(" Cause:\n"); + String causeWithIndent = cause.toString().replaceAll("\n", "\n "); + output.append(" " + causeWithIndent + "\n"); + } } if (classPathResult != null) { diff --git a/dependencies/src/main/resources/linkage-checker-exclusion-default.xml b/dependencies/src/main/resources/linkage-checker-exclusion-default.xml index 9721394e94..2b6de4bc9e 100644 --- a/dependencies/src/main/resources/linkage-checker-exclusion-default.xml +++ b/dependencies/src/main/resources/linkage-checker-exclusion-default.xml @@ -10,7 +10,17 @@ https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/816 - + + + + + + GraalVM-related libraries depend on Java Compiler Interface (JVMCI) that + only exists in special JDK. These missing classes are false positives, because + the code is only invoked when running in a GraalVM. + https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/929 + + @@ -26,17 +36,16 @@ - - - - - - + + Substrate VM is part of GraalVM and the virtual machine references classes in the JVM-internal + package 'sun.text.normalizer' that are not available in JVM runtime. + https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/1825 + @@ -425,4 +434,25 @@ in different JDK versions. Certain classes are unavailable in a JDK. + + + + + + Google Cloud libraries do not use SMTP protocols. There are discrepancy in + javax.mail:mail:1.4.3 com.sun.mail:javax.mail:1.6.2 in dependency graph. + + + + + + + + + + + Shaded class in com.fasterxml.woodstox:woodstox-core:6.2.6 has a class + reference to the textui.Driver but the shading process didn't include it. + + From 16531ceb1b9a9bfaddb7dc829ddc45769c2f4983 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Wed, 9 Feb 2022 17:00:58 -0500 Subject: [PATCH 051/113] extending periodic job timeout to avoid flaky. (#2283) --- kokoro/ubuntu/periodic.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kokoro/ubuntu/periodic.cfg b/kokoro/ubuntu/periodic.cfg index 68610342db..cf6d39fd94 100644 --- a/kokoro/ubuntu/periodic.cfg +++ b/kokoro/ubuntu/periodic.cfg @@ -3,6 +3,8 @@ # Location of the periodic build bash script in git. build_file: "cloud-opensource-java/kokoro/ubuntu/periodic.sh" +timeout_mins: 240 + action { define_artifacts { regex: "**/target/com.google.cloud/**" From 9e97d0af318cfa09f183ae9b57b08e360e55d17b Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 10 Feb 2022 10:07:55 -0500 Subject: [PATCH 052/113] Release 24.3.0-bom (#2282) --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 56e56c3a33..d10efb4109 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.2.1-SNAPSHOT + 24.3.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index d8c4414ff2..70ebdbc511 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.2.1-SNAPSHOT + 24.3.1-SNAPSHOT pom import From 04280f7fa78618b92c3289ef2b90b0572ea94061 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 10 Feb 2022 15:38:25 -0500 Subject: [PATCH 053/113] Optimizing the periodic build. No need to run tests (#2284) --- kokoro/ubuntu/periodic.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kokoro/ubuntu/periodic.sh b/kokoro/ubuntu/periodic.sh index 152aafb3c0..c7f5d71901 100755 --- a/kokoro/ubuntu/periodic.sh +++ b/kokoro/ubuntu/periodic.sh @@ -6,8 +6,8 @@ set -e set -x cd github/cloud-opensource-java -# M2_HOME is not used since Maven 3.5.0 https://maven.apache.org/docs/3.5.0/release-notes.html -mvn -V -B clean install +# No need to run tests +./mvnw -V -B -ntp clean install -DskipTests -Denforcer.skip -Dinvoker.skip # Running target of dashboard submodule # https://stackoverflow.com/questions/3459928/running-a-specific-maven-plugin-goal-from-the-command-line-in-a-sub-module-of-a/26448447#26448447 @@ -15,8 +15,8 @@ mvn -V -B clean install cd dashboard # For all versions available in Maven Central and local repository -mvn -V -B exec:java -Dexec.mainClass="com.google.cloud.tools.opensource.dashboard.DashboardMain" \ +../mvnw -V -B -ntp exec:java -Dexec.mainClass="com.google.cloud.tools.opensource.dashboard.DashboardMain" \ -Dexec.arguments="-a com.google.cloud:libraries-bom" -mvn -V -B exec:java -Dexec.mainClass="com.google.cloud.tools.opensource.dashboard.DashboardMain" \ +../mvnw -V -B -ntp exec:java -Dexec.mainClass="com.google.cloud.tools.opensource.dashboard.DashboardMain" \ -Dexec.arguments="-a com.google.cloud:gcp-lts-bom" From 36e384ccb88ef8aea3193a4ea8eedf52f5727ff7 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 22 Feb 2022 19:13:53 -0500 Subject: [PATCH 054/113] Clarify the release pull request title and body (#2289) --- scripts/release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/release.sh b/scripts/release.sh index 7de44d7c6a..80b73d7f5c 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -124,8 +124,8 @@ git push origin "${RELEASE_TAG}" git push --set-upstream origin ${VERSION}-${SUFFIX} # Create the PR -gh pr create --title "Release ${VERSION}-${SUFFIX}" \ - --body "Release ${VERSION}-${SUFFIX}" \ +gh pr create --title "Release ${VERSION}-${SUFFIX}: Bumping to next version post release" \ + --body "1st commit marks ${VERSION}-${SUFFIX} release with the Git tag. 2nd commit bumps the version in the branch with SNAPSHOT suffix." \ --base ${BASE_BRANCH} # File a PR on Github for the new branch. Have someone LGTM it, which gives you permission to continue. From 91bc3a66144629853f9e6d6de5c61c5cb028b11c Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 1 Mar 2022 21:13:25 -0500 Subject: [PATCH 055/113] libraries-bom: google-cloud-bom 0.169.0 (#2290) --- boms/cloud-oss-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index d10efb4109..b911832800 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,7 +48,7 @@ UTF-8 31.0.1-jre - 0.167.0 + 0.169.0 2.4.0 1.44.0 1.41.2 From f9c017daa0718f6005097a6f980e30ae4fdd8f41 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 9 Mar 2022 22:43:08 -0500 Subject: [PATCH 056/113] Release 24.4.0-bom: Bumping to next version post release (#2291) * preparing release 24.4.0-bom * 24.4.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index b911832800..f3b1de4e93 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.3.1-SNAPSHOT + 24.4.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 70ebdbc511..4649fd471c 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.3.1-SNAPSHOT + 24.4.1-SNAPSHOT pom import From 198341131efb4f5e0f5937e98e28e3546e226c44 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 10 Mar 2022 15:02:33 -0500 Subject: [PATCH 057/113] Libraries BOM: Google Cloud BOM 0.171.0 (#2292) * Libraries BOM: Google Cloud BOM 0.170.0 * Google Cloud BOM 0.171.0 --- boms/cloud-oss-bom/pom.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index f3b1de4e93..4eb4e3d20d 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,19 +48,19 @@ UTF-8 31.0.1-jre - 0.169.0 - 2.4.0 - 1.44.0 - 1.41.2 - 3.19.3 + 0.171.0 + 2.5.6 + 1.44.1 + 1.41.4 + 3.19.4 - 2.11.0 - 0.96.0 - 1.4.0 - 2.1.3 - 2.7.2 - 1.2.1 + 2.12.2 + 0.97.2 + 1.5.3 + 2.1.4 + 2.7.4 + 1.2.6 From 882add2c082ac718ea76271d4a32b8332ec0b7ec Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 17 Mar 2022 09:51:18 -0400 Subject: [PATCH 058/113] Release 25.0.0-bom: Bumping to next version post release (#2293) --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 4eb4e3d20d..50a974eff0 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 24.4.1-SNAPSHOT + 25.0.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 4649fd471c..12cf803a6e 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 24.4.1-SNAPSHOT + 25.0.1-SNAPSHOT pom import From ba46591b9e3a0a76bd9789bcea1755cb5e685f00 Mon Sep 17 00:00:00 2001 From: donghui <977675308@qq.com> Date: Thu, 24 Mar 2022 04:33:57 +0800 Subject: [PATCH 059/113] update the url of google-cloud-bom (#2295) --- docs/JLBP-0015.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/JLBP-0015.md b/docs/JLBP-0015.md index 6c6dddec1f..7dbf8aaa36 100644 --- a/docs/JLBP-0015.md +++ b/docs/JLBP-0015.md @@ -47,7 +47,7 @@ dependencies in its `` section to ensure that its build is consistent, but these dependency versions shouldn't be imported by consumers who import the BOM. -Example BOM: [google-cloud-bom](https://github.com/GoogleCloudPlatform/google-cloud-java/blob/master/google-cloud-bom/pom.xml). +Example BOM: [google-cloud-bom](https://github.com/googleapis/java-cloud-bom/blob/main/pom.xml). ## Libraries built with Gradle From fb1f2a27c76e3f0f9c0359afbe87ca09dcdeb7e2 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 28 Mar 2022 16:59:25 -0400 Subject: [PATCH 060/113] adding gax in the libraries-bom (#2296) --- boms/cloud-oss-bom/pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 50a974eff0..5070878a02 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -48,6 +48,7 @@ UTF-8 31.0.1-jre + 2.9.0 0.171.0 2.5.6 1.44.1 @@ -84,7 +85,11 @@ guava-testlib ${guava.version} - + + com.google.code.gson + gson + ${gson.version} + com.google.protobuf From 669eb70f47571df6a9efcfd5e9d4834907037d6f Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 31 Mar 2022 12:31:52 -0400 Subject: [PATCH 061/113] Google Cloud BOM 0.172.0 and associated dependencies (#2298) --- boms/cloud-oss-bom/pom.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 5070878a02..160275dac2 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -47,21 +47,21 @@ UTF-8 - 31.0.1-jre + 31.1-jre 2.9.0 - 0.171.0 - 2.5.6 - 1.44.1 - 1.41.4 + 0.172.0 + 2.5.11 + 1.45.0 + 1.41.5 3.19.4 - 2.12.2 - 0.97.2 - 1.5.3 - 2.1.4 - 2.7.4 - 1.2.6 + 2.13.0 + 0.98.0 + 1.6.0 + 2.1.5 + 2.8.0 + 1.2.10 From bb4f90dcda6460f769caefdfb7c1808405344b45 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 22 Apr 2022 13:08:28 -0400 Subject: [PATCH 062/113] Release 25.1.0-bom: Bumping to next version post release (#2299) * preparing release 25.1.0-bom * 25.1.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 160275dac2..9b60efe96c 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 25.0.1-SNAPSHOT + 25.1.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 12cf803a6e..368db43608 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 25.0.1-SNAPSHOT + 25.1.1-SNAPSHOT pom import From a3b28296e6acdf16c8c9d34a899cffabfb424af9 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 26 Apr 2022 10:37:37 -0400 Subject: [PATCH 063/113] Google Cloud BOM 0.173.0 and associated dependencies (#2301) * Google Cloud BOM 0.173.0 and associated dependencies Google Cloud BOM 0.173.0 was built with the shared dependencies BOM 2.10.0. https://github.com/googleapis/java-shared-dependencies/blob/v2.10.0/first-party-dependencies/pom.xml Gax-bom 2.16.0 has gax-httpjson 0.101.0 https://search.maven.org/artifact/com.google.api/gax-bom/2.16.0/pom * ci: MAVEN_OPTS="-Xmx8g" for continuous build --- boms/cloud-oss-bom/pom.xml | 16 ++++++++-------- kokoro/continuous.bat | 1 + kokoro/continuous.sh | 2 ++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 9b60efe96c..706c59ae97 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -49,19 +49,19 @@ UTF-8 31.1-jre 2.9.0 - 0.172.0 - 2.5.11 - 1.45.0 - 1.41.5 + 0.173.0 + 2.6.0 + 1.45.1 + 1.41.7 3.19.4 - 2.13.0 - 0.98.0 + 2.16.0 + 0.101.0 1.6.0 2.1.5 - 2.8.0 - 1.2.10 + 2.8.3 + 1.3.1 diff --git a/kokoro/continuous.bat b/kokoro/continuous.bat index d090efe5a9..4910ad62d9 100644 --- a/kokoro/continuous.bat +++ b/kokoro/continuous.bat @@ -2,6 +2,7 @@ set JAVA_HOME=c:\program files\java\jdk1.8.0_152 set PATH=%JAVA_HOME%\bin;%PATH% +set MAVEN_OPTS="-Xmx8g" cd github/cloud-opensource-java diff --git a/kokoro/continuous.sh b/kokoro/continuous.sh index 86ab10066f..54d7f82154 100755 --- a/kokoro/continuous.sh +++ b/kokoro/continuous.sh @@ -5,6 +5,8 @@ set -e # Display commands being run. set -x +export MAVEN_OPTS="-Xmx8g" + cd github/cloud-opensource-java ./mvnw -V -B -ntp clean install javadoc:jar From 4cbb99a9f214a44cead346b07edd9b4beb5ecb6c Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 27 Apr 2022 11:55:06 -0400 Subject: [PATCH 064/113] Release 25.2.0-bom: Bumping to next version post release (#2302) * preparing release 25.2.0-bom * 25.2.1-SNAPSHOT --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 706c59ae97..105721f2a7 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 25.1.1-SNAPSHOT + 25.2.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 368db43608..1ab42ebdf0 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 25.1.1-SNAPSHOT + 25.2.1-SNAPSHOT pom import From 143b600fc6b7ae338a220a9cc701cf8d430669fa Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 13 May 2022 15:15:00 -0400 Subject: [PATCH 065/113] Google Cloud BOM 0.174.0 (#2305) --- boms/cloud-oss-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 105721f2a7..2f201e8743 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -49,7 +49,7 @@ UTF-8 31.1-jre 2.9.0 - 0.173.0 + 0.174.0 2.6.0 1.45.1 1.41.7 From f28675342d13714d19d0dc8123ec01ebc4100f8e Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 19 May 2022 14:44:22 -0400 Subject: [PATCH 066/113] Release 25.3.0-bom: Bumping to next version post release (#2306) * preparing release 25.3.0-bom * 25.3.1-SNAPSHOT * Xmx12g for Windows build --- boms/cloud-oss-bom/pom.xml | 2 +- boms/upper-bounds-check/pom.xml | 2 +- kokoro/continuous.bat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml index 2f201e8743..0fbd96533f 100644 --- a/boms/cloud-oss-bom/pom.xml +++ b/boms/cloud-oss-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud libraries-bom - 25.2.1-SNAPSHOT + 25.3.1-SNAPSHOT pom Google Cloud Platform Supported Libraries diff --git a/boms/upper-bounds-check/pom.xml b/boms/upper-bounds-check/pom.xml index 1ab42ebdf0..8d9e52a5cc 100644 --- a/boms/upper-bounds-check/pom.xml +++ b/boms/upper-bounds-check/pom.xml @@ -43,7 +43,7 @@ com.google.cloud libraries-bom - 25.2.1-SNAPSHOT + 25.3.1-SNAPSHOT pom import diff --git a/kokoro/continuous.bat b/kokoro/continuous.bat index 4910ad62d9..36a42bb5b4 100644 --- a/kokoro/continuous.bat +++ b/kokoro/continuous.bat @@ -2,7 +2,7 @@ set JAVA_HOME=c:\program files\java\jdk1.8.0_152 set PATH=%JAVA_HOME%\bin;%PATH% -set MAVEN_OPTS="-Xmx8g" +set MAVEN_OPTS="-Xmx12g" cd github/cloud-opensource-java From b08365a4826f88d2bc22805ea30a04278003b160 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 1 Jul 2022 14:29:28 -0400 Subject: [PATCH 067/113] gcp-lts-bom July 2022 (#2300) * gcp-lts-bom layer 1 * Google HTTP Client and API Client update * Layer 2 libraries * Exclude provided dependencies from the check * trying google-cloud-pubsub 1.117.0 * added Beam 2.40.0 * increase xmx * adding comments for supporting artifacts --- boms/cloud-lts-bom/pom.xml | 86 +++++++++++-------- boms/integration-tests/pom.xml | 2 +- .../java/com/google/cloud/BomContentTest.java | 33 ++++++- 3 files changed, 81 insertions(+), 40 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index b04ea348b1..40e6d6133e 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -49,50 +49,54 @@ UTF-8 - 31.0.1-jre - 1.8.2 - 3.18.2 - 1.40.1 - 2.0.5 - 1.32.1 - 1.2.1 - 1.41.1 - 1.32.2 - 2.6.0 + 31.1-jre + 1.9 + 3.19.4 + 1.41.8 + 2.1.5 + 1.33.3 + 1.6.0 + 1.45.1 + 1.34.1 + 2.8.3 - 2.6.1 - 0.91.1 - 2.2.0 + 2.16.0 + + 0.101.0 + 2.6.0 - 1.9.93 - 1.0.0 - 2.0.6 + 1.9.96 + 1.1.7 + 2.0.14 v3-rev20211021-1.32.1 - 2.3.3 - v2-rev20211017-1.32.1 - 2.4.2 - 2.1.9 - 2.0.6 - 3.1.0 - 6.14.1 - 2.0.6 - 1.25.2-sp.3 - 2.2.0 - 1.114.7 - 1.96.7 - 2.1.3 - 2.1.3 - 2.2.1 - 1.0.0 - 1.1.4 - 2.0.6 - 3.4.0 - 2.2.4 + 2.10.9 + + v2-rev20220326-1.32.1 + 2.12.2 + 2.6.1 + 2.1.11 + 3.2.8 + 6.23.3 + 2.1.11 + 2.1.1 + 2.6.2 + 1.117.0 + + 1.99.0 + 2.2.10 + 2.2.7 + 2.3.7 + 1.1.7 + 1.2.11 + 2.4.1 + 3.7.5 + 2.1.6 + 2.2.6 - 2.35.0 + 2.40.0 @@ -256,7 +260,6 @@ ${google-cloud-core.version} - com.google.appengine appengine-api-1.0-sdk @@ -424,6 +427,13 @@ pom import + + com.google.cloud + google-cloud-secretmanager-bom + ${google-cloud-secretmanager.version} + pom + import + com.google.cloud.bigdataoss gcs-connector diff --git a/boms/integration-tests/pom.xml b/boms/integration-tests/pom.xml index 2d0f9eafd5..e2af3230a1 100644 --- a/boms/integration-tests/pom.xml +++ b/boms/integration-tests/pom.xml @@ -38,7 +38,7 @@ false - -Xms128m -Xmx2048m + -Xms128m -Xmx4g false diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index cd50e3d9ee..6d01c8778e 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -22,7 +22,9 @@ import com.google.cloud.tools.opensource.classpath.DependencyMediation; import com.google.cloud.tools.opensource.dependencies.Artifacts; import com.google.cloud.tools.opensource.dependencies.Bom; +import com.google.cloud.tools.opensource.dependencies.DependencyPath; import com.google.common.base.Joiner; +import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import java.io.IOException; import java.net.HttpURLConnection; @@ -34,6 +36,7 @@ import java.util.List; import java.util.Map; import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.util.version.GenericVersionScheme; import org.eclipse.aether.version.InvalidVersionSpecificationException; import org.eclipse.aether.version.Version; @@ -44,6 +47,11 @@ public class BomContentTest { private static VersionScheme versionScheme = new GenericVersionScheme(); + // List of Maven dependency scopes that are visible to library users. For example "provided" scope + // dependencies do not appear in users' class path. + private static final ImmutableList dependencyScopesVisibleToUsers = + ImmutableList.of("compile", "runtime"); + @Test public void testLtsBom() throws Exception { Path bomPath = Paths.get("..", "cloud-lts-bom", "pom.xml").toAbsolutePath(); @@ -207,6 +215,28 @@ private static ImmutableList findNoDowngradeViolation( continue; } + // Filter by scopes that are invisible to library users + ImmutableList dependencyPaths = result.getDependencyPaths(entry); + Verify.verify( + !dependencyPaths.isEmpty(), + "The class path entry should have at least one dependency path from the root"); + boolean dependencyVisibleToUsers = false; + for (DependencyPath dependencyPath : dependencyPaths) { + int length = dependencyPath.size(); + // As the root element is an empty node, the last element is at "length - 2". + Dependency dependency = dependencyPath.getDependency(length - 2); + if (dependencyScopesVisibleToUsers.contains(dependency.getScope())) { + dependencyVisibleToUsers = true; + break; + } + } + if (!dependencyVisibleToUsers) { + // For provided-scope dependencies, we don't have to worry about them because they don't + // appear in library users' class path. For example, appengine-api-1.0-sdk are used via + // provided scope. + continue; + } + // A violation of the no-downgrade rule is found. violations.add( artifact @@ -214,7 +244,8 @@ private static ImmutableList findNoDowngradeViolation( + transitiveDependency + ". This is higher version than " + bomArtifact - + " in the BOM"); + + " in the BOM. Example dependency path: " + + dependencyPaths.get(0)); } return violations.build(); } From b84addb547f27aaad663742866d6f4be7e8ad445 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 11 Jul 2022 11:13:46 -0400 Subject: [PATCH 068/113] BomContentTest disableMavenCentralCheck property (#2310) --- .../java/com/google/cloud/BomContentTest.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index 6d01c8778e..49e94feaaf 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -44,6 +44,10 @@ import org.junit.Assert; import org.junit.Test; +/** + * Checks the content of the BOMs in this repository. When some artifacts are not available in Maven + * Central yet, use "-DdisableMavenCentralCheck=true" system property when running this test. + */ public class BomContentTest { private static VersionScheme versionScheme = new GenericVersionScheme(); @@ -66,9 +70,17 @@ public void testLibrariesBom() throws Exception { private void checkBom(Path bomPath) throws Exception { Bom bom = Bom.readBom(bomPath); + + // Sometimes the artifacts are not yet available in Maven Central and only available in local + // Maven repository. Use this property in that case. + boolean disableMavenCentralCheck = + "true".equals(System.getProperty("disableMavenCentralCheck")); + List artifacts = bom.getManagedDependencies(); - for (Artifact artifact : artifacts) { - assertReachable(buildMavenCentralUrl(artifact)); + if (!disableMavenCentralCheck) { + for (Artifact artifact : artifacts) { + assertReachable(buildMavenCentralUrl(artifact)); + } } assertNoDowngradeRule(bom); From 60718abb6b8f8d7bea3287351f9dc919de2cb3d3 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 10 Nov 2022 10:24:53 -0500 Subject: [PATCH 069/113] deps: Apache BCEL 6.6.1 (#2318) * deps: Apache BCEL 6.6.1 * Removing MaximumLinkageErrorsTest for the libraries-bom The Libraries BOM has moved to java-cloud-bom repository. --- .../java/com/google/cloud/BomContentTest.java | 6 -- .../cloud/MaximumLinkageErrorsTest.java | 97 ------------------- dependencies/pom.xml | 2 +- 3 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index 49e94feaaf..d344d0b41c 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -62,12 +62,6 @@ public void testLtsBom() throws Exception { checkBom(bomPath); } - @Test - public void testLibrariesBom() throws Exception { - Path bomPath = Paths.get("..", "cloud-oss-bom", "pom.xml").toAbsolutePath(); - checkBom(bomPath); - } - private void checkBom(Path bomPath) throws Exception { Bom bom = Bom.readBom(bomPath); diff --git a/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java b/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java deleted file mode 100644 index 05569e4a49..0000000000 --- a/boms/integration-tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.google.cloud; - -import com.google.cloud.tools.opensource.classpath.ClassPathEntry; -import com.google.cloud.tools.opensource.classpath.LinkageChecker; -import com.google.cloud.tools.opensource.classpath.LinkageProblem; -import com.google.cloud.tools.opensource.dependencies.Bom; -import com.google.cloud.tools.opensource.dependencies.MavenRepositoryException; -import com.google.cloud.tools.opensource.dependencies.RepositoryUtility; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import org.eclipse.aether.RepositoryException; -import org.eclipse.aether.artifact.Artifact; -import org.junit.Assert; -import org.junit.Test; - -public class MaximumLinkageErrorsTest { - - @Test - public void testForNewLinkageErrors() - throws IOException, MavenRepositoryException, RepositoryException { - // Not using RepositoryUtility.findLatestCoordinates, which may return a snapshot version - String version = findLatestNonSnapshotVersion(); - String baselineCoordinates = "com.google.cloud:libraries-bom:" + version; - Bom baseline = Bom.readBom(baselineCoordinates); - - Path bomFile = Paths.get("../cloud-oss-bom/pom.xml"); - Bom bom = Bom.readBom(bomFile); - - ImmutableSet oldProblems = - LinkageChecker.create(baseline).findLinkageProblems(); - LinkageChecker checker = LinkageChecker.create(bom); - ImmutableSet currentProblems = checker.findLinkageProblems(); - - // This only tests for newly missing methods, not new invocations of - // previously missing methods. - Set newProblems = Sets.difference(currentProblems, oldProblems); - - // Appengine-api-1.0-sdk is known to contain linkage errors because it shades dependencies - // https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/441 - newProblems = - newProblems.stream() - .filter(problem -> !hasLinkageProblemFromArtifactId(problem, "appengine-api-1.0-sdk")) - .collect(Collectors.toSet()); - - // Check that no new linkage errors have been introduced since the baseline - StringBuilder message = new StringBuilder("Baseline BOM: " + baselineCoordinates + "\n"); - if (!newProblems.isEmpty()) { - message.append("Newly introduced problems:\n"); - message.append(LinkageProblem.formatLinkageProblems(newProblems, null)); - Assert.fail(message.toString()); - } - } - - private boolean hasLinkageProblemFromArtifactId(LinkageProblem problem, String artifactId) { - ClassPathEntry sourceClassPathEntry = problem.getSourceClass().getClassPathEntry(); - Artifact sourceArtifact = sourceClassPathEntry.getArtifact(); - return artifactId.equals(sourceArtifact.getArtifactId()); - } - - private String findLatestNonSnapshotVersion() throws MavenRepositoryException { - ImmutableList versions = - RepositoryUtility.findVersions( - RepositoryUtility.newRepositorySystem(), "com.google.cloud", "libraries-bom"); - ImmutableList versionsLatestFirst = versions.reverse(); - Optional highestNonsnapshotVersion = - versionsLatestFirst.stream().filter(version -> !version.contains("SNAPSHOT")).findFirst(); - if (!highestNonsnapshotVersion.isPresent()) { - Assert.fail("Could not find non-snapshot version of the BOM"); - } - return highestNonsnapshotVersion.get(); - } -} diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 2b12153cfe..503a2fe86a 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -46,7 +46,7 @@ org.apache.bcel bcel - 6.5.0 + 6.6.1 org.apache.maven From a05c5d0a32f517d1a901027fb9c450c76e79da6e Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 28 Nov 2022 10:39:39 -0500 Subject: [PATCH 070/113] Release 1.5.13-dependencies: Bumping to next version post release (#2319) * preparing release 1.5.13-dependencies * 1.5.14-SNAPSHOT --- boms/integration-tests/pom.xml | 2 +- dashboard/pom.xml | 2 +- dependencies/pom.xml | 2 +- enforcer-rules/pom.xml | 2 +- gradle-plugin/gradle.properties | 2 +- linkage-monitor/action.yml | 2 +- linkage-monitor/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/boms/integration-tests/pom.xml b/boms/integration-tests/pom.xml index e2af3230a1..d5a7cf22b1 100644 --- a/boms/integration-tests/pom.xml +++ b/boms/integration-tests/pom.xml @@ -18,7 +18,7 @@ com.google.cloud.tools dependencies - 1.5.13-SNAPSHOT + 1.5.14-SNAPSHOT junit diff --git a/dashboard/pom.xml b/dashboard/pom.xml index 9ca8c550cc..7b774ef0c2 100644 --- a/dashboard/pom.xml +++ b/dashboard/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.13-SNAPSHOT + 1.5.14-SNAPSHOT dashboard diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 503a2fe86a..39fcb51695 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -8,7 +8,7 @@ com.google.cloud.tools dependencies-parent - 1.5.13-SNAPSHOT + 1.5.14-SNAPSHOT dependencies diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index d61460799c..c76849188f 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.13-SNAPSHOT + 1.5.14-SNAPSHOT linkage-checker-enforcer-rules diff --git a/gradle-plugin/gradle.properties b/gradle-plugin/gradle.properties index 1c080e7b8b..8f47c24584 100644 --- a/gradle-plugin/gradle.properties +++ b/gradle-plugin/gradle.properties @@ -1,2 +1,2 @@ # scripts/prepare_release.sh maintains this value. -version = 1.5.13-SNAPSHOT +version = 1.5.14-SNAPSHOT diff --git a/linkage-monitor/action.yml b/linkage-monitor/action.yml index a28324738f..76bddd68e9 100644 --- a/linkage-monitor/action.yml +++ b/linkage-monitor/action.yml @@ -7,7 +7,7 @@ runs: # scripts/release.sh updates the version part in the URL run: | curl --output /tmp/linkage-monitor.jar \ - "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-1.5.13-SNAPSHOT-all-deps.jar" + "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-1.5.14-SNAPSHOT-all-deps.jar" shell: bash - run: java -jar /tmp/linkage-monitor.jar com.google.cloud:libraries-bom shell: bash diff --git a/linkage-monitor/pom.xml b/linkage-monitor/pom.xml index f04db82c2b..984f5e3e44 100644 --- a/linkage-monitor/pom.xml +++ b/linkage-monitor/pom.xml @@ -22,7 +22,7 @@ com.google.cloud.tools dependencies-parent - 1.5.13-SNAPSHOT + 1.5.14-SNAPSHOT linkage-monitor diff --git a/pom.xml b/pom.xml index 6b2572e862..2827a5e2cd 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.google.cloud.tools dependencies-parent pom - 1.5.13-SNAPSHOT + 1.5.14-SNAPSHOT Cloud Tools Open Source Code Hygiene Tooling https://github.com/GoogleCloudPlatform/cloud-opensource-java/ From 9014c7176eb8d8938a8e8ff33890864fb8a3f1ad Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 11 Jan 2023 16:44:09 -0500 Subject: [PATCH 071/113] Dashboard to process latest 10 versions (#2323) This will fix the problem of timeout: ``` Wrote dashboard for com.google.cloud:gcp-lts-bom:3.0.0-SNAPSHOT to target/com.google.cloud/gcp-lts-bom/snapshot ERROR: Aborting VM command due to timeout of 14400 seconds ``` --- .../opensource/dashboard/DashboardMain.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java index 9b1e1e7f78..94427516e2 100644 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java +++ b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java @@ -86,6 +86,7 @@ public class DashboardMain { public static final String TEST_NAME_UPPER_BOUND = "Upper Bounds"; public static final String TEST_NAME_GLOBAL_UPPER_BOUND = "Global Upper Bounds"; public static final String TEST_NAME_DEPENDENCY_CONVERGENCE = "Dependency Convergence"; + public static final int LATEST_VERSIONS_COUNT = 10; private static final Configuration freemarkerConfiguration = configureFreemarker(); @@ -107,7 +108,7 @@ public static void main(String[] arguments) DashboardArguments dashboardArguments = DashboardArguments.readCommandLine(arguments); if (dashboardArguments.hasVersionlessCoordinates()) { - generateAllVersions( + generateLatestVersions( dashboardArguments.getVersionlessCoordinates(), dashboardArguments.getDependencyMediation()); } else if (dashboardArguments.hasFile()) { @@ -117,10 +118,10 @@ public static void main(String[] arguments) } } - private static void generateAllVersions( + private static void generateLatestVersions( String versionlessCoordinates, DependencyMediationAlgorithm dependencyMediationAlgorithm) throws IOException, TemplateException, RepositoryException, URISyntaxException, - MavenRepositoryException { + MavenRepositoryException { List elements = Splitter.on(':').splitToList(versionlessCoordinates); if (elements.size() != 2) { System.err.println( @@ -131,9 +132,14 @@ private static void generateAllVersions( String artifactId = elements.get(1); RepositorySystem repositorySystem = RepositoryUtility.newRepositorySystem(); + // The highest version comes last. ImmutableList versions = RepositoryUtility.findVersions(repositorySystem, groupId, artifactId); - for (String version : versions) { + ImmutableList latestVersions = + versions.size() > LATEST_VERSIONS_COUNT ? versions.subList( + versions.size() - LATEST_VERSIONS_COUNT, + versions.size()) : versions; + for (String version : latestVersions) { generate( String.format("%s:%s:%s", groupId, artifactId, version), dependencyMediationAlgorithm); } @@ -176,7 +182,7 @@ static Path generate( @VisibleForTesting static Path generate(Path bomFile, DependencyMediationAlgorithm dependencyMediationAlgorithm) throws IOException, TemplateException, URISyntaxException, MavenRepositoryException, - InvalidVersionSpecificationException { + InvalidVersionSpecificationException { checkArgument(Files.isRegularFile(bomFile), "The input BOM %s is not a regular file", bomFile); checkArgument(Files.isReadable(bomFile), "The input BOM %s is not readable", bomFile); Path output = generate(Bom.readBom(bomFile), dependencyMediationAlgorithm); @@ -186,7 +192,7 @@ static Path generate(Path bomFile, DependencyMediationAlgorithm dependencyMediat private static Path generate(Bom bom, DependencyMediationAlgorithm dependencyMediationAlgorithm) throws IOException, TemplateException, URISyntaxException, - InvalidVersionSpecificationException { + InvalidVersionSpecificationException { ImmutableList managedDependencies = bom.getManagedDependencies(); @@ -562,8 +568,8 @@ public static long countFailures(List table, String columnName) * *

Using this summary in the BOM dashboard avoids repetitive items in the {@link * DependencyPath} list that share the same root problem caused by widely-used libraries, for - * example, {@code commons-logging:commons-logging}, {@code - * com.google.http-client:google-http-client} and {@code log4j:log4j}. + * example, {@code commons-logging:commons-logging}, {@code com.google.http-client:google-http-client} + * and {@code log4j:log4j}. */ private static ImmutableMap findRootCauses(ClassPathResult classPathResult) { // Freemarker is not good at handling non-string keys. Path object in .ftl is automatically From 344dc707956803d6d572add82667679307748bef Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 30 Jan 2023 13:57:39 -0500 Subject: [PATCH 072/113] Setup allstar ignore file for binary files (#2324) * Adjusting Allstar binary file alerts * Not to add Maven wrapper JAR file * install Java 11 in Kokoro MacOS * follow error message * test temurin * skip javadoc job --- .allstar/binary_artifacts.yaml | 5 +++++ .gitignore | 2 +- .mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes kokoro/continuous.sh | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .allstar/binary_artifacts.yaml delete mode 100644 .mvn/wrapper/maven-wrapper.jar diff --git a/.allstar/binary_artifacts.yaml b/.allstar/binary_artifacts.yaml new file mode 100644 index 0000000000..ed03308c1a --- /dev/null +++ b/.allstar/binary_artifacts.yaml @@ -0,0 +1,5 @@ +# Linkage Checker has test to examine JAR files and class files +ignorePaths: +- enforcer-rules/src/test/resources/dummy-0.0.1.jar +- example-problems/gradle-project/build/classes/java/main/App.class + diff --git a/.gitignore b/.gitignore index 09f3031d79..f40f7ab851 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ example-problems/*/gradle example-problems/*/gradlew example-problems/*/gradlew.bat gradle-plugin/.gradle/ - +.mvn/wrapper/maven-wrapper.jar diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/kokoro/continuous.sh b/kokoro/continuous.sh index 54d7f82154..9e1444550d 100755 --- a/kokoro/continuous.sh +++ b/kokoro/continuous.sh @@ -9,7 +9,7 @@ export MAVEN_OPTS="-Xmx8g" cd github/cloud-opensource-java -./mvnw -V -B -ntp clean install javadoc:jar +./mvnw -V -B -ntp clean install -Djavadoc.skip cd gradle-plugin ./gradlew build publishToMavenLocal From 17df2e96859fbcf918655a55eddb6aabf4e16422 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 17 Feb 2023 15:21:30 -0500 Subject: [PATCH 073/113] fix: Exclude appengine artifacts from duplicate class check (#2326) --- .../java/com/google/cloud/BomContentTest.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index d344d0b41c..e6d82e9e04 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -110,12 +110,16 @@ private static void assertUniqueClasses(List allArtifacts) for (ClassPathEntry classPathEntry : result.getClassPath()) { Artifact currentArtifact = classPathEntry.getArtifact(); - if (!currentArtifact.getGroupId().contains("google") - || currentArtifact.getGroupId().contains("com.google.android") - || currentArtifact.getGroupId().contains("com.google.cloud.bigtable") - || currentArtifact.getArtifactId().startsWith("proto-") - || currentArtifact.getArtifactId().equals("protobuf-javalite") - || currentArtifact.getArtifactId().equals("appengine-testing")) { + String artifactId = currentArtifact.getArtifactId(); + String groupId = currentArtifact.getGroupId(); + if (!groupId.contains("google") + || groupId.contains("com.google.android") + || groupId.contains("com.google.cloud.bigtable") + || artifactId.startsWith("proto-") + || artifactId.equals("protobuf-javalite") + || artifactId.equals("appengine-testing") + || artifactId.equals("appengine-remote-api") + || artifactId.equals("appengine-api-1.0-sdk")) { // Skip libraries that produce false positives. // See: https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/2226 continue; From 592c498a08c63a6ead4ee154ed454e4b3446c5a7 Mon Sep 17 00:00:00 2001 From: Blake Li Date: Tue, 21 Feb 2023 10:26:51 -0500 Subject: [PATCH 074/113] fix: Ignore all appengine dependencies for checking duplicate classes (#2327) --- .../src/test/java/com/google/cloud/BomContentTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index e6d82e9e04..dd8bdc4081 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -117,9 +117,7 @@ private static void assertUniqueClasses(List allArtifacts) || groupId.contains("com.google.cloud.bigtable") || artifactId.startsWith("proto-") || artifactId.equals("protobuf-javalite") - || artifactId.equals("appengine-testing") - || artifactId.equals("appengine-remote-api") - || artifactId.equals("appengine-api-1.0-sdk")) { + || artifactId.startsWith("appengine-")) { // Skip libraries that produce false positives. // See: https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/2226 continue; From 5889ccce09f232294a5e57ac36310de0c4f7d84b Mon Sep 17 00:00:00 2001 From: Blake Li Date: Mon, 27 Feb 2023 16:44:14 -0500 Subject: [PATCH 075/113] deps: Update libraries versions for LTS 4.0.0 (#2325) --- boms/cloud-lts-bom/pom.xml | 95 ++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 40e6d6133e..c37765de80 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 3.0.0-SNAPSHOT + 4.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM @@ -50,53 +50,55 @@ 31.1-jre - 1.9 - 3.19.4 - 1.41.8 - 2.1.5 - 1.33.3 - 1.6.0 - 1.45.1 - 1.34.1 - 2.8.3 + 1.10 + 3.21.10 + 1.42.3 + 2.2.2 + 1.34.1 + 1.12.1 + 1.50.2 + 2.0.1 + 2.10.0 - 2.16.0 + 2.19.6 - 0.101.0 - 2.6.0 + 0.104.6 + 2.8.27 - 1.9.96 - 1.1.7 - 2.0.14 - v3-rev20211021-1.32.1 - 2.10.9 + 2.0.10 + 3.1.0 + 2.6.0 + v3-rev20221108-2.0.0 + 2.19.1 - v2-rev20220326-1.32.1 - 2.12.2 - 2.6.1 - 2.1.11 - 3.2.8 - 6.23.3 - 2.1.11 - 2.1.1 - 2.6.2 - 1.117.0 + v2-rev20221028-2.0.0 + 2.25.0 + 2.15.0 + 2.6.0 + 3.7.0 + 6.33.0 + 2.6.0 + 2.6.6 + 2.16.0 + 1.121.0 - 1.99.0 - 2.2.10 - 2.2.7 - 2.3.7 - 1.1.7 - 1.2.11 - 2.4.1 - 3.7.5 - 2.1.6 - 2.2.6 + 1.103.0 + 2.12.5 + 2.6.0 + 2.9.0 + 1.6.0 + 1.8.0 + 2.9.0 + 3.13.1 + 2.6.0 + 2.9.0 + 3.4.0 + 2.2.10 - 2.40.0 + 2.44.0 @@ -434,6 +436,21 @@ pom import + + com.google.cloud + google-cloud-kms-bom + ${google-cloud-kms.version} + pom + import + + + com.google.cloud + google-cloud-vision-bom + ${google-cloud-vision.version} + pom + import + + com.google.cloud.bigdataoss gcs-connector From d9c56b068c571d4d5f88ab7726b678db8afd10c2 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 15 May 2023 10:45:48 -0400 Subject: [PATCH 076/113] Remove BOM_SKIP_ARTIFACT_IDS (#2338) * Remove BOM_SKIP_ARTIFACT_IDS * fixing assertions * Using jdk1.8.0_211 in kokoro-windows * do not care new line characters --- .../tools/opensource/dashboard/DashboardTest.java | 5 +++-- .../cloud/tools/opensource/dependencies/Bom.java | 11 +---------- .../opensource/classpath/ClassPathBuilderTest.java | 3 ++- .../opensource/classpath/ExclusionFilesTest.java | 11 ++++++----- .../classpath/LinkageCheckerMainIntegrationTest.java | 4 ++-- .../cloud/tools/opensource/dependencies/BomTest.java | 2 +- kokoro/continuous.bat | 2 +- 7 files changed, 16 insertions(+), 22 deletions(-) diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java index ae8e8dbdcb..b62589cbc4 100644 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java +++ b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java @@ -421,7 +421,8 @@ public void testGlobalUpperBoundUpgradeMessage() throws IOException, ParsingExce String bomUpgradeMessage = globalUpperBoundBomUpgradeNodes.get(0).getValue(); assertThat(bomUpgradeMessage) .contains( - "Upgrade com.google.protobuf:protobuf-java-util:jar:3.6.1 in the BOM to version \"3.7.1\""); + "Upgrade com.google.protobuf:protobuf-java-util:jar:3.6.1 in the BOM to version" + + " \"3.7.1\""); // Case 2: Dependency needs to be updated Nodes globalUpperBoundDependencyUpgradeNodes = @@ -469,7 +470,7 @@ public void testDependencyTrees() throws IOException, ParsingException { Nodes dependencyTreeParagraph = document.query("//p[@class='dependency-tree-node']"); // characterization test - assertThat(dependencyTreeParagraph).hasSize(38391); + assertThat(dependencyTreeParagraph).hasSize(39649); Assert.assertEquals( "com.google.protobuf:protobuf-java:jar:3.6.1", dependencyTreeParagraph.get(0).getValue()); } diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/Bom.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/Bom.java index c0eda3e0d6..3d35310444 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/Bom.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/dependencies/Bom.java @@ -19,7 +19,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -38,9 +37,6 @@ import org.eclipse.aether.resolution.ArtifactDescriptorResult; public final class Bom { - - private static final ImmutableSet BOM_SKIP_ARTIFACT_IDS = - ImmutableSet.of("google-cloud-logging-logback", "google-cloud-contrib"); private final ImmutableList artifacts; private final String coordinates; @@ -151,12 +147,7 @@ public static boolean shouldSkipBomMember(Artifact artifact) { if ("test-jar".equals(type)) { return true; } - - // TODO remove this hack once we get these out of google-cloud-java's BOM - if (BOM_SKIP_ARTIFACT_IDS.contains(artifact.getArtifactId())) { - return true; - } - + return false; } } diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathBuilderTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathBuilderTest.java index 86d645e640..3104f444f9 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathBuilderTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ClassPathBuilderTest.java @@ -108,7 +108,8 @@ public void testBomToPaths_firstElementsAreBomMembers() throws RepositoryExcepti .isEqualTo("com.google.api:api-common:1.7.0"); // first element in the BOM int bomSize = managedDependencies.size(); String lastFileName = entries.get(bomSize - 1).toString(); - assertThat(lastFileName).isEqualTo("com.google.api:gax-httpjson:0.57.0"); // last element in BOM + assertThat(lastFileName) + .isEqualTo("com.google.code.findbugs:jsr305:3.0.2"); // last element in BOM } @Test diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesTest.java index 197466eb45..cd8245bc7d 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesTest.java @@ -340,14 +340,15 @@ public void testWriteExclusionFile_indent() ExclusionFiles.write(output, linkageErrors); - String actual = new String(Files.readAllBytes(output)); + String actual = new String(Files.readAllBytes(output)).replaceAll("\\R", "\n"); String expected = new String( - Files.readAllBytes( - absolutePathOfResource( - "exclusion-sample-rules/expected-exclusion-output-file.xml")), - StandardCharsets.UTF_8); + Files.readAllBytes( + absolutePathOfResource( + "exclusion-sample-rules/expected-exclusion-output-file.xml")), + StandardCharsets.UTF_8) + .replaceAll("\\R", "\n"); assertEquals(expected, actual); } diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java index 231e63928e..8a1d1179cf 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java @@ -138,7 +138,7 @@ public void testBom_java8() LinkageCheckerMain.main(new String[] {"-b", "com.google.cloud:libraries-bom:1.0.0"}); fail("LinkageCheckerMain should throw LinkageCheckResultException upon errors"); } catch (LinkageCheckResultException expected) { - assertEquals("Found 631 linkage errors", expected.getMessage()); + assertEquals("Found 734 linkage errors", expected.getMessage()); } String output = readCapturedStdout(); @@ -172,7 +172,7 @@ public void testBom_java11() LinkageCheckerMain.main(new String[] {"-b", "com.google.cloud:libraries-bom:1.0.0"}); fail("LinkageCheckerMain should throw LinkageCheckResultException upon errors"); } catch (LinkageCheckResultException expected) { - assertEquals("Found 653 linkage errors", expected.getMessage()); + assertEquals("Found 756 linkage errors", expected.getMessage()); } String output = readCapturedStdout(); diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/dependencies/BomTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/dependencies/BomTest.java index 29f32f7a41..200d7e8ca3 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/dependencies/BomTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/dependencies/BomTest.java @@ -39,7 +39,7 @@ public void testReadBom_coordinates() throws ArtifactDescriptorException { List managedDependencies = bom.getManagedDependencies(); // Characterization test. As long as the artifact doesn't change (and it shouldn't) // the answer won't change. - Assert.assertEquals(134, managedDependencies.size()); + Assert.assertEquals(136, managedDependencies.size()); Assert.assertEquals("com.google.cloud:google-cloud-bom:0.61.0-alpha", bom.getCoordinates()); } diff --git a/kokoro/continuous.bat b/kokoro/continuous.bat index 36a42bb5b4..df44fdaae8 100644 --- a/kokoro/continuous.bat +++ b/kokoro/continuous.bat @@ -1,6 +1,6 @@ @echo on -set JAVA_HOME=c:\program files\java\jdk1.8.0_152 +set JAVA_HOME=c:\program files\java\jdk1.8.0_211 set PATH=%JAVA_HOME%\bin;%PATH% set MAVEN_OPTS="-Xmx12g" From a460bf9b249f1b88e773abfa98291bfc8bb42b6a Mon Sep 17 00:00:00 2001 From: Burke Davison <40617934+burkedavison@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:14:13 +0000 Subject: [PATCH 077/113] chore: add temurin-install-testing (#2339) * chore: add temurin-install-testing * chore: add ./test-all.sh for easier full suite execution * chore: add snippet region tags and test-all.sh file * chore: improve readme --- temurin-install-testing/.gitignore | 7 + temurin-install-testing/README.md | 62 ++++++++ temurin-install-testing/connect.sh | 29 ++++ temurin-install-testing/inputs.auto.tfvars | 4 + temurin-install-testing/main.tf | 176 +++++++++++++++++++++ temurin-install-testing/outputs.tf | 9 ++ temurin-install-testing/startup.ps1 | 96 +++++++++++ temurin-install-testing/startup.sh | 136 ++++++++++++++++ temurin-install-testing/test-all.sh | 34 ++++ temurin-install-testing/variables.tf | 153 ++++++++++++++++++ 10 files changed, 706 insertions(+) create mode 100644 temurin-install-testing/.gitignore create mode 100644 temurin-install-testing/README.md create mode 100755 temurin-install-testing/connect.sh create mode 100644 temurin-install-testing/inputs.auto.tfvars create mode 100644 temurin-install-testing/main.tf create mode 100644 temurin-install-testing/outputs.tf create mode 100644 temurin-install-testing/startup.ps1 create mode 100644 temurin-install-testing/startup.sh create mode 100755 temurin-install-testing/test-all.sh create mode 100644 temurin-install-testing/variables.tf diff --git a/temurin-install-testing/.gitignore b/temurin-install-testing/.gitignore new file mode 100644 index 0000000000..587889aad2 --- /dev/null +++ b/temurin-install-testing/.gitignore @@ -0,0 +1,7 @@ +*.tfstate.backup +*.tfstate +private.auto.tfvars +.terraform/ +.idea/ +.terraform.lock.hcl +.terraform.tfstate.lock.info diff --git a/temurin-install-testing/README.md b/temurin-install-testing/README.md new file mode 100644 index 0000000000..8bb6580faa --- /dev/null +++ b/temurin-install-testing/README.md @@ -0,0 +1,62 @@ +# temurin-testing + +This Terraform configuration installs Temurin on a matrix of GCE machine types and OS boot images. +The tests are split into three batches to prevent hitting standard compute quotas, and are enabled +using three boolean input variables: + +* `enable_arm`: Performs testing on `arm_machine_types` x `arm_boot_images` +* `enable_linux`: Performs testing on `x86_machine_types` x `x86_boot_images` +* `enable_windows`: Performs testing on `x86_machine_types` x `x86_windows_boot_images` + +Defaults for the above values are found in `variables.tf`. + +## Snippet Region Tags + +The `startup.sh` and `startup.ps1` files have region tags used to identify the boundaries of the +snippets to include in Temurin installation documentation. + +## Workflow + +1. Create a file named `private.auto.tfvars` in this folder with contents: + ```shell + user_email = "[gcloud account email]" + project_id = "[gcp project id]" + bucket = "[cloud storage bucket id for results]" + ``` + +2. Invoke the tests + * To invoke the full test suite, execute `terraform init`, then `./test-all.sh` + * To invoke a single test batch, modify `inputs.auto.tfvars` to enable one batch, then execute + `terraform apply`. To destroy these resources later, set the batch variable back + to false and execute `terraform apply` again.cd + * (Optional) Review the input matrix for the batch you've enabled in `variables.tf`. + +3. (Parsing Results) Test results are uploaded to the specified GCS bucket at + `gs://[BUCKET]/[TIMESTAMP]/[MACHINE TYPE]` and full logs are available + at `gs://[BUCKET]/[TIMESTAMP]/logs`. + +4. (Debugging) To SSH into a created VM instance: + * Find the VM instance name by either navigating to + https://console.cloud.google.com/compute/instances, or by looking at Terraform's console + output. + * Example Terraform output: + ``` + google_compute_instance.default["n2-standard-2-centos-stream-8"]: Creation complete after 14s [id=projects/PROJECT_ID/zones/ZONE_ID/instances/n2-standard-2-centos-stream-8] + ``` + Where `n2-standard-2-centos-stream-8` is the VM instance name. + * Invoke the `connect.sh` helper script with the VM instance name: + ```shell + ./connect.sh [VM_INSTANCE_NAME] + ``` + Example: + ```shell + ./connect.sh n2-standard-2-centos-stream-8 + ``` + +## Support + +This repository is not intended for public consumption. + +For source code and support for Google cloud libraries, start here: + +https://cloud.google.com/apis/docs/cloud-client-libraries \ No newline at end of file diff --git a/temurin-install-testing/connect.sh b/temurin-install-testing/connect.sh new file mode 100755 index 0000000000..f1ebfb77f0 --- /dev/null +++ b/temurin-install-testing/connect.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +set -eo pipefail + +ZONE=$(terraform output -raw zone) +PROJECT=$(terraform output -raw project) + +echo "" +echo "Once connection is complete, to see startup script logs in Linux:" +echo " sudo journalctl -u google-startup-scripts.service" +echo "To rerun startup script in Windows:" +echo ' "C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd"' + +gcloud compute ssh --project="$PROJECT" --zone="$ZONE" "$1" diff --git a/temurin-install-testing/inputs.auto.tfvars b/temurin-install-testing/inputs.auto.tfvars new file mode 100644 index 0000000000..bee7d57c4c --- /dev/null +++ b/temurin-install-testing/inputs.auto.tfvars @@ -0,0 +1,4 @@ +# Only enable one test category at a time to avoid hitting default compute quotas. +enable_arm = false +enable_windows = false +enable_linux = false diff --git a/temurin-install-testing/main.tf b/temurin-install-testing/main.tf new file mode 100644 index 0000000000..2f2090ca03 --- /dev/null +++ b/temurin-install-testing/main.tf @@ -0,0 +1,176 @@ +terraform { + required_providers { + google = { + source = "hashicorp/google" + } + } +} +provider "google" { + project = var.project_id + region = var.region + zone = var.zone +} +resource "google_project_service" "compute" { + service = "compute.googleapis.com" + disable_on_destroy = false +} +resource "google_project_service" "storage" { + service = "storage.googleapis.com" + disable_on_destroy = false +} + +resource "google_service_account" "default" { + account_id = "temurin-service-account" + display_name = "Service Account" +} + + +locals { + x86_instances = var.enable_linux ? setproduct(var.x86_machine_types, var.x86_boot_images) : [] + arm_instances = var.enable_arm ? setproduct(var.arm_machine_types, var.arm_boot_images) : [] + + linux_instances = [ + for entry in concat(local.x86_instances, local.arm_instances) : { + name = "${entry[0]}-${split("/", entry[1])[1]}" + type = entry[0] + image = entry[1] + os_name = split("/", entry[1])[1] + } + ] + + windows_instances = var.enable_windows ? [ + for entry in setproduct(var.x86_machine_types, var.x86_windows_boot_images) : { + name = "${entry[0]}-${split("/", entry[1])[1]}" + type = entry[0] + image = entry[1] + os_name = split("/", entry[1])[1] + } + ] : [] + + all_instances = concat(local.linux_instances, local.windows_instances) + + bucket_folder = var.bucket_folder == "" ? timestamp() : var.bucket_folder +} + +resource "google_compute_instance" "windows" { + for_each = { + for index, vm in local.windows_instances : vm.name => vm + } + + name = each.value.name + machine_type = each.value.type + tags = ["https-server", "http-server"] + + metadata = { + windows-startup-script-cmd = "googet -noconfirm=true update && googet -noconfirm=true install google-compute-engine-ssh" + enable-windows-ssh = "true" + serial-port-logging-enable = "true" + windows-startup-script-ps1 = templatefile( + "${path.module}/startup.ps1", + { + bucket = data.google_storage_bucket.results.name + vm_name = each.value.name + bucket_folder = local.bucket_folder + vm_zone = var.zone + os_name = each.value.os_name + machine_type = each.value.type + }) + } + + boot_disk { + initialize_params { + image = each.value.image + } + } + network_interface { + network = "default" + access_config { + // Ephemeral public IP + } + } + service_account { + email = google_service_account.default.email + scopes = ["cloud-platform"] + } + + depends_on = [ + google_project_service.compute, + google_service_account.default, + google_storage_bucket_iam_policy.storage_policy + ] +} + +resource "google_compute_instance" "linux" { + for_each = { + for index, vm in local.linux_instances : vm.name => vm + } + + name = each.value.name + machine_type = each.value.type + tags = ["https-server", "http-server"] + metadata_startup_script = templatefile( + "${path.module}/startup.sh", + { + bucket = data.google_storage_bucket.results.name + vm_name = each.value.name + bucket_folder = local.bucket_folder + vm_zone = var.zone + os_name = each.value.os_name + machine_type = each.value.type + }) + + boot_disk { + initialize_params { + image = each.value.image + } + } + network_interface { + network = "default" + access_config { + // Ephemeral public IP + } + } + service_account { + email = google_service_account.default.email + scopes = ["cloud-platform"] + } + + depends_on = [ + google_project_service.compute, + google_service_account.default, + google_storage_bucket_iam_policy.storage_policy + ] +} + +data "google_iam_policy" "compute_viewer" { + binding { + role = "roles/compute.viewer" + members = [ + "serviceAccount:${google_service_account.default.email}" + ] + } +} +resource "google_compute_instance_iam_policy" "compute_policy" { + for_each = { + for index, vm in local.all_instances : vm.name => vm + } + instance_name = each.value.name + policy_data = data.google_iam_policy.compute_viewer.policy_data + depends_on = [google_compute_instance.linux, google_compute_instance.windows] +} + +data "google_storage_bucket" "results" { + name = var.bucket +} +data "google_iam_policy" "storage_policy" { + binding { + role = "roles/storage.admin" + members = [ + "serviceAccount:${google_service_account.default.email}" + ] + } +} +resource "google_storage_bucket_iam_policy" "storage_policy" { + bucket = data.google_storage_bucket.results.name + policy_data = data.google_iam_policy.storage_policy.policy_data +} diff --git a/temurin-install-testing/outputs.tf b/temurin-install-testing/outputs.tf new file mode 100644 index 0000000000..d8d198314e --- /dev/null +++ b/temurin-install-testing/outputs.tf @@ -0,0 +1,9 @@ +output "zone" { + value = var.zone +} +output "project" { + value = var.project_id +} +output "bucket_folder" { + value = local.bucket_folder +} diff --git a/temurin-install-testing/startup.ps1 b/temurin-install-testing/startup.ps1 new file mode 100644 index 0000000000..168274bcd9 --- /dev/null +++ b/temurin-install-testing/startup.ps1 @@ -0,0 +1,96 @@ +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function Refresh-Path +{ + # [START windows_env_reset] + $MachinePath = [System.Environment]::GetEnvironmentVariable('Path', 'Machine') + $UserPath = [System.Environment]::GetEnvironmentVariable('Path', 'User') + $env:Path = "$MachinePath;$UserPath" + # [END windows_env_reset] +} + +function Perform-Test +{ + param ( + $JdkVersion + ) + $BaseFileName = "${os_name}-jdk$JdkVersion" + $SuccessFileName = "$BaseFileName.txt" + $ErrorFileName = "$BaseFileName-error.txt" + $OriginalPath = $env:Path + + try + { + # [START windows_temurin_download] + $JdkUrl = "https://api.adoptium.net/v3/binary/latest/$JdkVersion/ga/windows/x64/jdk/hotspot/normal/eclipse?project=jdk" + $JdkExtractionPath = "C:\temurin-$JdkVersion-jdk" + $JdkDownload = "$JdkExtractionPath.zip" + [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls12' + Invoke-WebRequest -Uri $JdkUrl -OutFile $JdkDownload + Expand-Archive $JdkDownload -DestinationPath $JdkExtractionPath -Force + # [END windows_temurin_download] + "Downloaded: $JdkUrl" + + # [START windows_temurin_install] + pushd $JdkExtractionPath + $JdkPath = (Get-ChildItem).FullName + popd + [System.Environment]::SetEnvironmentVariable('JAVA_HOME', $JdkPath, 'Machine') + [System.Environment]::SetEnvironmentVariable('Path', "$env:Path;$JdkPath\bin", 'Machine') + # [END windows_temurin_install] + + Refresh-Path + java -version 2>&1 | %%{ "$_" } > $SuccessFileName # For syntax, see https://stackoverflow.com/a/20950421 + + # Reset for next test + [System.Environment]::SetEnvironmentVariable('JAVA_HOME', '', 'Machine') + [System.Environment]::SetEnvironmentVariable('Path', $OriginalPath, 'Machine') + Refresh-Path + try + { + java -version # Expect failure. + + "Java not fully uninstalled from Path: $env:Path" | Out-File -FilePath $ErrorFileName + gcloud storage cp $ErrorFileName "gs://${bucket}/${bucket_folder}/${machine_type}/" + exit 1 + } + catch + { + # Expected. Successfully removed from path. + gcloud storage cp $SuccessFileName "gs://${bucket}/${bucket_folder}/${machine_type}/" + } + } + catch + { + Write-Output $_ + Write-Output $_.ScriptStackTrace + + "Error. See VM serial port 1 logs for details." | Out-File -FilePath $ErrorFileName + gcloud storage cp $ErrorFileName "gs://${bucket}/${bucket_folder}/${machine_type}/" + } +} + +Perform-Test -JdkVersion 8 +Perform-Test -JdkVersion 11 +Perform-Test -JdkVersion 17 +Perform-Test -JdkVersion 19 +Perform-Test -JdkVersion 20 + +# Store the VM's console logs +gcloud compute instances get-serial-port-output "${vm_name}" --zone "${vm_zone}" > "${vm_name}.txt" +gcloud storage cp "${vm_name}.txt" "gs://${bucket}/${bucket_folder}/logs/${vm_name}.txt" +"Done with JDK testing." diff --git a/temurin-install-testing/startup.sh b/temurin-install-testing/startup.sh new file mode 100644 index 0000000000..ae8db1651b --- /dev/null +++ b/temurin-install-testing/startup.sh @@ -0,0 +1,136 @@ +#!/bin/bash + +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function prepare_installer_debian_ubuntu { + # [START debian_adoptium_key] + sudo mkdir -p /etc/apt/keyrings + sudo wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | + sudo tee /etc/apt/keyrings/adoptium.asc + # [END debian_adoptium_key] + +# [START debian_adoptium_repo] +eval "$(grep VERSION_CODENAME /etc/os-release)" +sudo tee /etc/apt/sources.list.d/adoptium.list </dev/null; then + echo "Java already installed." + exit 1 + fi + + $INSTALLER update -y + if ! $INSTALLER install -y "$1" 2>"result.txt"; then + FILE=$ERROR_FILE + else + # java -version uses the error stream + if ! java -version 2>"result.txt"; then + FILE=$ERROR_FILE + fi + fi + cat "result.txt" >"$FILE" + gcloud storage cp "$FILE" "gs://${bucket}/${bucket_folder}/${machine_type}/" + $INSTALLER remove -y "$1" +} + +prepare_installer +perform_test temurin-8-jdk +perform_test temurin-11-jdk +perform_test temurin-17-jdk +perform_test temurin-19-jdk +perform_test temurin-20-jdk + +# Store the VM's console logs +gcloud compute instances get-serial-port-output "${vm_name}" --zone "${vm_zone}" >"${vm_name}.txt" +gcloud storage cp "${vm_name}.txt" "gs://${bucket}/${bucket_folder}/logs/${vm_name}.txt" diff --git a/temurin-install-testing/test-all.sh b/temurin-install-testing/test-all.sh new file mode 100755 index 0000000000..3fd7c654da --- /dev/null +++ b/temurin-install-testing/test-all.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +set -eo pipefail + +function wait { + echo "$(date +%T) Sleeping 20 min" + sleep 1200 +} + +terraform apply -var="enable_arm=true" -auto-approve +wait +BUCKET_FOLDER=$(terraform output --raw bucket_folder) +terraform apply -auto-approve +terraform apply -var="enable_linux=true" -var="bucket_folder=$BUCKET_FOLDER" -auto-approve +wait +terraform apply -auto-approve +terraform apply -var="enable_windows=true" -var="bucket_folder=$BUCKET_FOLDER" -auto-approve +wait +terraform apply -auto-approve diff --git a/temurin-install-testing/variables.tf b/temurin-install-testing/variables.tf new file mode 100644 index 0000000000..7a5be9055b --- /dev/null +++ b/temurin-install-testing/variables.tf @@ -0,0 +1,153 @@ +variable "user_email" { + type = string + description = "Current user email" +} +variable "project_id" { + type = string + description = "GCP Project ID of the project being used" +} +variable "bucket" { + type = string + description = "Result storage bucket" +} + +variable "enable_arm" { + type = bool + description = "If true, perform arm tests" + default = false +} +variable "enable_windows" { + type = bool + description = "If true, perform x86 Windows tests" + default = false +} +variable "enable_linux" { + type = bool + description = "If true, perform x86 Linux tests" + default = false +} + +variable "location" { + type = string + description = "Bucket location used for GCS" + default = "US-CENTRAL1" +} +variable "region" { + type = string + description = "GCP region used to deploy resources" + default = "us-central1" +} +variable "zone" { + type = string + description = "GCP zone used to deploy resources. Must be a zone in the chosen region." + default = "us-central1-a" +} +variable "bucket_folder" { + type = string + description = "Generally, leave empty. By default, a timestamp will be provided as the value." + default = "" +} + + +## See https://cloud.google.com/compute/docs/machine-resource +variable "x86_machine_types" { + type = list(string) + description = "GCE machine types to create instances of" + default = [ + #"c3-highcpu-4", + #"n2-standard-96", + ##"m3-ultramem-32", # Requires special quota + #"n2-standard-2", + #"c2-standard-4", + ##"m2-ultramem-208", # Requires special quota + #"a2-highgpu-1g", + ##"m1-megamem-96", # Requires special quota + ##"m1-ultramem-40", # Requires special quota + "n1-standard-1", + #"t2d-standard-1", + #"n2d-standard-2", + ] +} + +# See https://cloud.google.com/compute/docs/images +variable "x86_boot_images" { + type = list(string) + description = "GCE boot image to use with created instance" + default = [ + "debian-cloud/debian-11", + "debian-cloud/debian-10", + + "rhel-cloud/rhel-9", + "rhel-cloud/rhel-7", + "rhel-sap-cloud/rhel-9-0-sap-ha", + "rhel-sap-cloud/rhel-7-7-sap-ha", + + "centos-cloud/centos-stream-9", + "centos-cloud/centos-stream-8", + "centos-cloud/centos-7", + + "rocky-linux-cloud/rocky-linux-9-optimized-gcp", + "rocky-linux-cloud/rocky-linux-8-optimized-gcp", + "rocky-linux-cloud/rocky-linux-8", + + "ubuntu-os-cloud/ubuntu-2204-lts", + "ubuntu-os-cloud/ubuntu-2004-lts", + "ubuntu-os-pro-cloud/ubuntu-pro-2204-lts", + "ubuntu-os-pro-cloud/ubuntu-pro-1804-lts", + "ubuntu-os-pro-cloud/ubuntu-pro-1604-lts", + + "suse-cloud/sles-15", + "suse-byos-cloud/sles-12-byos", + "suse-sap-cloud/sles-12-sp5-sap", + ] +} + + +# See https://cloud.google.com/compute/docs/images +variable "x86_windows_boot_images" { + type = list(string) + description = "GCE Windows boot image to use with created instance" + default = [ + "windows-cloud/windows-2022", + "windows-cloud/windows-2022-core", + "windows-cloud/windows-2012-r2", + "windows-cloud/windows-2012-r2-core", + + "windows-sql-cloud/sql-web-2022-win-2022", + "windows-sql-cloud/sql-std-2022-win-2022", + "windows-sql-cloud/sql-ent-2022-win-2022", + + "windows-sql-cloud/sql-web-2022-win-2019", + "windows-sql-cloud/sql-std-2022-win-2019", + "windows-sql-cloud/sql-ent-2022-win-2019", + + "windows-sql-cloud/sql-web-2014-win-2012-r2", + "windows-sql-cloud/sql-std-2014-win-2012-r2", + "windows-sql-cloud/sql-ent-2014-win-2012-r2", + ] +} + +## See https://cloud.google.com/compute/docs/machine-resource +variable "arm_machine_types" { + type = list(string) + description = "GCE machine types to create instances of" + default = [ + "t2a-standard-1" + ] +} + +# See https://cloud.google.com/compute/docs/images +variable "arm_boot_images" { + type = list(string) + description = "GCE boot image to use with created instance" + default = [ + "debian-cloud/debian-11-arm64", + "rhel-cloud/rhel-9-arm64", + "rocky-linux-cloud/rocky-linux-9-arm64", + "rocky-linux-cloud/rocky-linux-9-optimized-gcp-arm64", + "rocky-linux-cloud/rocky-linux-8-optimized-gcp-arm64", + "suse-cloud/sles-15-arm64", + "ubuntu-os-cloud/ubuntu-2204-lts-arm64", + "ubuntu-os-cloud/ubuntu-2004-lts-arm64", + ] +} From f4c258f74a86d4dd56dc2320040f63c255c08bd9 Mon Sep 17 00:00:00 2001 From: Burke Davison <40617934+burkedavison@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:25:27 +0000 Subject: [PATCH 078/113] ci: remove mac ci (#2346) --- kokoro/macos_external/continuous.cfg | 4 ---- kokoro/macos_external/presubmit.cfg | 4 ---- 2 files changed, 8 deletions(-) delete mode 100644 kokoro/macos_external/continuous.cfg delete mode 100644 kokoro/macos_external/presubmit.cfg diff --git a/kokoro/macos_external/continuous.cfg b/kokoro/macos_external/continuous.cfg deleted file mode 100644 index 43ded92399..0000000000 --- a/kokoro/macos_external/continuous.cfg +++ /dev/null @@ -1,4 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Location of the continuous build bash script in git. -build_file: "cloud-opensource-java/kokoro/continuous.sh" diff --git a/kokoro/macos_external/presubmit.cfg b/kokoro/macos_external/presubmit.cfg deleted file mode 100644 index 7cbe5d0058..0000000000 --- a/kokoro/macos_external/presubmit.cfg +++ /dev/null @@ -1,4 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Location of the presubmit build bash script in git. -build_file: "cloud-opensource-java/kokoro/continuous.sh" From 8f5275ecd684d0b1e84faddf1de50e78a52d747d Mon Sep 17 00:00:00 2001 From: Burke Davison <40617934+burkedavison@users.noreply.github.com> Date: Tue, 1 Aug 2023 17:33:30 +0000 Subject: [PATCH 079/113] chore: LTS 5 versions (#2343) * chore: LTS 5 layer 1 versions * chore: update with most layer 2 versions * chore: disable hbase connector dep (temporary) * chore: update to latest appengine, gcs-connector, and android publisher * chore: downgrade gcs-connector to 2.2.15 * chore: update to gRPC 1.55.3 * chore: guava 32.1.1, protobuf 3.23.4, auth 1.17.1 * chore: auth 1.19.0 * ci: add verbose mvn flag to failing Kokoro script * chore: logging 3.15.6, spanner 6.43.2 * chore: pubsub 1.123.18 * chore: api-common 2.14.0 * chore: proto-google-common-protos 2.22.0 * chore: google-cloud-core 2.21.0 * chore: gax 2.31.0 * chore: beam 2.49.0, bigtable-hbase-beam 2.9.1 * chore: remove bigtable-hbase-beam (not yet available) * chore: add bigtable-hbase-beam * chore: java-bigtable 2.25.0 * chore: java-monitoring 3.22.0 * chore: java-datastore 2.15.1 * chore: guava 32.1.2-jre * chore: 5.0.0-SNAPSHOT --- boms/cloud-lts-bom/pom.xml | 98 +++++++++++++++++++------------------- kokoro/continuous.sh | 2 +- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index c37765de80..f5a38fc18f 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM @@ -49,56 +49,55 @@ UTF-8 - 31.1-jre - 1.10 - 3.21.10 - 1.42.3 - 2.2.2 + 32.1.2-jre + 1.10.1 + 3.23.4 + 1.43.3 + 2.14.0 1.34.1 - 1.12.1 - 1.50.2 - 2.0.1 - 2.10.0 + 1.19.0 + 1.55.3 + 2.2.0 + 2.22.0 - 2.19.6 - - 0.104.6 - 2.8.27 + 2.31.0 + 2.21.0 - 2.0.10 - 3.1.0 - 2.6.0 - v3-rev20221108-2.0.0 - 2.19.1 + 2.0.16 + 3.14.0 + 2.19.0 + v3-rev20230615-2.0.0 + 2.27.1 - v2-rev20221028-2.0.0 - 2.25.0 - 2.15.0 - 2.6.0 - 3.7.0 - 6.33.0 - 2.6.0 - 2.6.6 - 2.16.0 - 1.121.0 + v2-rev20230520-2.0.0 + 2.38.0 + 2.22.6 + 2.19.0 + 3.22.0 + 6.43.2 + 2.19.0 + 2.25.0 + 1.123.18 - 1.103.0 - 2.12.5 - 2.6.0 - 2.9.0 - 1.6.0 - 1.8.0 - 2.9.0 - 3.13.1 - 2.6.0 - 2.9.0 - 3.4.0 - 2.2.10 + 1.105.18 + 2.15.1 + 2.19.0 + 2.22.0 + 1.19.0 + 1.21.0 + 2.22.0 + 3.15.6 + 2.19.0 + 2.22.0 + 3.17.0 + 2.2.15 - 2.44.0 + 2.49.0 + + 2.9.1 @@ -254,7 +253,7 @@ com.google.api gax-httpjson - ${gax-httpjson.version} + ${gax.version} com.google.cloud @@ -262,6 +261,7 @@ ${google-cloud-core.version} + com.google.appengine appengine-api-1.0-sdk @@ -349,11 +349,6 @@ pom import - - com.google.cloud.bigtable - bigtable-hbase-beam - ${bigtable-hbase-beam.version} - com.google.cloud @@ -488,6 +483,13 @@ beam-sdks-java-io-google-cloud-platform ${beam.version} + + + + com.google.cloud.bigtable + bigtable-hbase-beam + ${bigtable-hbase-beam.version} + diff --git a/kokoro/continuous.sh b/kokoro/continuous.sh index 9e1444550d..374f9e7941 100755 --- a/kokoro/continuous.sh +++ b/kokoro/continuous.sh @@ -9,7 +9,7 @@ export MAVEN_OPTS="-Xmx8g" cd github/cloud-opensource-java -./mvnw -V -B -ntp clean install -Djavadoc.skip +./mvnw -V -B -X -ntp clean install -Djavadoc.skip cd gradle-plugin ./gradlew build publishToMavenLocal From c57e981defc33dea16e8f12d1a5d4c9248cca3a9 Mon Sep 17 00:00:00 2001 From: Burke Davison <40617934+burkedavison@users.noreply.github.com> Date: Tue, 22 Aug 2023 18:30:49 +0000 Subject: [PATCH 080/113] chore: bump main lts to 6.0.0-SNAPSHOT (#2348) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index f5a38fc18f..dfaac3cae0 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 5.0.0-SNAPSHOT + 6.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM From 9ce7438cd0ac98c658e30c5416d0ff7e206cf5ef Mon Sep 17 00:00:00 2001 From: Burke Davison <40617934+burkedavison@users.noreply.github.com> Date: Wed, 4 Oct 2023 15:34:59 -0400 Subject: [PATCH 081/113] chore: update Temurin/SLES installation instructions (#2353) --- temurin-install-testing/startup.sh | 12 ++++++++++-- temurin-install-testing/test-all.sh | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/temurin-install-testing/startup.sh b/temurin-install-testing/startup.sh index ae8db1651b..2c833fcd1f 100644 --- a/temurin-install-testing/startup.sh +++ b/temurin-install-testing/startup.sh @@ -59,6 +59,15 @@ EOM } function prepare_installer_sles { + # [START centos_major_version] + eval "$(grep VERSION_ID /etc/os-release)" + OLD_IFS=$IFS + IFS='.' + read -ra split_version <<<"$VERSION_ID" + IFS=$OLD_IFS + MAJOR_VERSION=$split_version + # [END centos_major_version] + # [START sles_adoptium_key] sudo mkdir -p /etc/zypp/keyrings sudo wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | @@ -67,8 +76,7 @@ function prepare_installer_sles { # [START sles_adoptium_key] # [START sles_adoptium_repo] - eval "$(grep VERSION_ID /etc/os-release)" - sudo zypper ar -f "https://packages.adoptium.net/artifactory/rpm/opensuse/$VERSION_ID/$(uname -m)" adoptium + sudo zypper ar -f "https://packages.adoptium.net/artifactory/rpm/sles/$MAJOR_VERSION/$(uname -m)" adoptium # [START sles_adoptium_repo] export INSTALLER="zypper" diff --git a/temurin-install-testing/test-all.sh b/temurin-install-testing/test-all.sh index 3fd7c654da..3e080fd90c 100755 --- a/temurin-install-testing/test-all.sh +++ b/temurin-install-testing/test-all.sh @@ -27,8 +27,10 @@ wait BUCKET_FOLDER=$(terraform output --raw bucket_folder) terraform apply -auto-approve terraform apply -var="enable_linux=true" -var="bucket_folder=$BUCKET_FOLDER" -auto-approve +# For single invocations: terraform apply -var="enable_linux=true" -auto-approve wait terraform apply -auto-approve terraform apply -var="enable_windows=true" -var="bucket_folder=$BUCKET_FOLDER" -auto-approve +# For single invocations: terraform apply -var="enable_windows=true" -auto-approve wait terraform apply -auto-approve From 02c26c9e270668fb926f00284d43da134a02ed2d Mon Sep 17 00:00:00 2001 From: Burke Davison <40617934+burkedavison@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:15:36 -0500 Subject: [PATCH 082/113] chore: update linkage tests (#2358) * chore: fake update * chore: @Ignore LinkageCheckerMainIntegrationTest.testBom_java11 * chore: change expected linkage errors in grpc-netty-shaded from 4 to 5 * chore: change expected Linkage Checker rule errors in bom-project-using-spring-repository from 107 to 108 * chore: relocate linkage error assertion to JDK-version specific test * chore: update LinkageCheckerMainIntegrationTest expected error count * chore: remove unused import * chore: remove outdated comments --- .../opensource/dashboard/DashboardTest.java | 16 +++++++++++----- dependencies/README.md | 2 +- .../LinkageCheckerMainIntegrationTest.java | 2 +- .../verify.groovy | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java index b62589cbc4..ffeba49324 100644 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java +++ b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java @@ -214,11 +214,6 @@ public void testDashboard_statisticBox() { @Test public void testLinkageReports() { - Nodes reports = details.query("//p[@class='jar-linkage-report']"); - // appengine-api-sdk, shown as first item in linkage errors, has these errors - assertThat(trimAndCollapseWhiteSpace(reports.get(0).getValue())) - .isEqualTo("4 target classes causing linkage errors referenced from 4 source classes."); - Nodes dependencyPaths = details.query("//p[@class='linkage-check-dependency-paths']"); Node dependencyPathMessageOnProblem = dependencyPaths.get(dependencyPaths.size() - 1); Assert.assertEquals( @@ -296,6 +291,12 @@ public void testComponent_linkageCheckResult_java8() throws IOException, Parsing assertThat(trimAndCollapseWhiteSpace(reports.get(0).getValue())) .isEqualTo("100 target classes causing linkage errors referenced from 540 source classes."); + + Nodes artifactDetailsReports = details.query("//p[@class='jar-linkage-report']"); + // appengine-api-sdk, shown as first item in linkage errors, has these errors + assertThat(trimAndCollapseWhiteSpace(artifactDetailsReports.get(0).getValue())) + .isEqualTo("4 target classes causing linkage errors referenced from 4 source classes."); + Nodes causes = document.query("//p[@class='jar-linkage-report-cause']"); assertWithMessage( "google-http-client-appengine should show linkage errors for RpcStubDescriptor") @@ -313,6 +314,11 @@ public void testComponent_linkageCheckResult_java11() throws IOException, Parsin int javaMajorVersion = Integer.parseInt(javaVersion.split("\\.")[0]); Assume.assumeTrue(javaMajorVersion >= 11); + Nodes artifactDetailsReports = details.query("//p[@class='jar-linkage-report']"); + // appengine-api-sdk, shown as first item in linkage errors, has these errors + assertThat(trimAndCollapseWhiteSpace(artifactDetailsReports.get(0).getValue())) + .isEqualTo("5 target classes causing linkage errors referenced from 5 source classes."); + // The version used in libraries-bom 1.0.0. The google-http-client-appengine has been known to // have linkage errors in its dependency appengine-api-1.0-sdk:1.9.71. Document document = diff --git a/dependencies/README.md b/dependencies/README.md index c265ab122d..585e9e5b84 100644 --- a/dependencies/README.md +++ b/dependencies/README.md @@ -5,7 +5,7 @@ Linkage Checker is a tool that finds [linkage errors]( path. It scans the class files in the class path for references to other classes and reports any reference that cannot be satisfied. -#### User Documentation +### User Documentation Linkage Checker can be used from Maven or Gradle. diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java index 8a1d1179cf..992f544656 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMainIntegrationTest.java @@ -172,7 +172,7 @@ public void testBom_java11() LinkageCheckerMain.main(new String[] {"-b", "com.google.cloud:libraries-bom:1.0.0"}); fail("LinkageCheckerMain should throw LinkageCheckResultException upon errors"); } catch (LinkageCheckResultException expected) { - assertEquals("Found 756 linkage errors", expected.getMessage()); + assertEquals("Found 758 linkage errors", expected.getMessage()); } String output = readCapturedStdout(); diff --git a/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy b/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy index e5d69decfd..ce90a31ff6 100644 --- a/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy +++ b/enforcer-rules/src/it/bom-project-using-spring-repository/verify.groovy @@ -14,6 +14,6 @@ assert !buildLog.text.contains("NullPointerException") // 4 linkage errors are references to java.util.concurrent.Flow class, which does not exist in // Java 8 runtime yet. -def expectedErrorCount = System.getProperty("java.version").startsWith("1.8.") ? 111 : 107 +def expectedErrorCount = System.getProperty("java.version").startsWith("1.8.") ? 111 : 108 assert buildLog.text.contains("Linkage Checker rule found $expectedErrorCount errors:") From 9b8b9ff41e164385739eeaf6628d4a50d09e4058 Mon Sep 17 00:00:00 2001 From: Arun Sathiya Date: Mon, 22 Jan 2024 20:52:55 -0800 Subject: [PATCH 083/113] ci: Use GITHUB_OUTPUT envvar instead of set-output command (#2362) --- .github/workflows/ci.yaml | 2 +- .github/workflows/sonar.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 23a0b0c6fc..0fc55c63d8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,7 +17,7 @@ jobs: java-version: ${{matrix.java}} - name: Get current date id: date - run: echo "::set-output name=date::$(date +'%Y-%m-%d' --utc)" + run: echo "date=$(date +'%Y-%m-%d' --utc)" >> "$GITHUB_OUTPUT" - uses: actions/cache@v2 id: mvn-cache with: diff --git a/.github/workflows/sonar.yaml b/.github/workflows/sonar.yaml index 3fff749d36..64fdd4977b 100644 --- a/.github/workflows/sonar.yaml +++ b/.github/workflows/sonar.yaml @@ -17,7 +17,7 @@ jobs: steps: - name: Get current date id: date - run: echo "::set-output name=date::$(date +'%Y-%m-%d' --utc)" + run: echo "date=$(date +'%Y-%m-%d' --utc)" >> "$GITHUB_OUTPUT" - uses: actions/checkout@v2 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis From 6b9240114536a03b72929d5fade85599fbdbbdd0 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 1 Feb 2024 20:36:44 +0000 Subject: [PATCH 084/113] deps: LTS 6 Versions (#2361) * deps: Update library versions * chore: Organize the dependencies * deps: Update library versions * deps: Use bigtable v2.30.0 * deps: Use Beam v2.52.0 * chore: Use Guava 32.1.3-jre * chore: Update Beam to v2.53.0 * chore: Update bigtable-hbase-beam version to v2.12.0 * chore: Update to storage v2.30.2 --- boms/cloud-lts-bom/pom.xml | 84 +++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index dfaac3cae0..336c46907a 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -49,55 +49,56 @@ UTF-8 - 32.1.2-jre - 1.10.1 - 3.23.4 + 32.1.3-jre + 1.10.4 + 3.25.1 + 1.59.1 1.43.3 - 2.14.0 1.34.1 - 1.19.0 - 1.55.3 + 1.20.0 2.2.0 - 2.22.0 - 2.31.0 - 2.21.0 + When updating gax.version, update gax.httpjson.version too. --> + 2.38.0 + 2.21.0 + 2.28.0 + 2.29.0 - 2.0.16 - 3.14.0 - 2.19.0 - v3-rev20230615-2.0.0 - 2.27.1 + 2.34.0 + 2.34.0 + 3.32.0 + 1.31.0 + 2.34.0 + 1.33.0 + 2.31.0 + 2.31.0 + 2.31.0 + 2.31.0 + 3.29.0 + 3.26.0 + 2.31.0 + 2.31.0 + v3-rev20231111-2.0.0 + 2.0.21 + 2.2.17 + 2.35.0 - v2-rev20230520-2.0.0 - 2.38.0 - 2.22.6 - 2.19.0 - 3.22.0 - 6.43.2 - 2.19.0 - 2.25.0 - 1.123.18 + v2-rev20231111-2.0.0 + 2.47.0 + 2.30.0 + 3.15.14 + 2.17.6 + 1.125.13 - 1.105.18 - 2.15.1 - 2.19.0 - 2.22.0 - 1.19.0 - 1.21.0 - 2.22.0 - 3.15.6 - 2.19.0 - 2.22.0 - 3.17.0 - 2.2.15 + 1.107.13 + 6.55.0 + 2.30.2 - 2.49.0 + 2.53.0 - 2.9.1 + 2.12.0 @@ -320,6 +321,13 @@ pom import + + com.google.cloud + google-cloud-translate-bom + ${google-cloud-translate.version} + pom + import + com.google.cloud google-cloud-monitoring-bom From db980dd0cf19c40bcfc9a7b8c754cca78fd556eb Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 28 Feb 2024 13:56:16 -0500 Subject: [PATCH 085/113] chore: updating contribution guideline (#2364) b/323263307 --- CONTRIBUTING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84296313e5..11257a8cdb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,10 @@ # How to become a contributor and submit your own code -Pull requests are welcome. +The code in this repository is only intended to be used as part of the Google Cloud SDK build/test/release infrastructure, and it is not a supported Google product. Please make sure you understand the purpose of this repo before contributing. If you still would like to contribute, please follow the guidelines below before opening an issue or a PR: +1. Ensure the issue was not already reported. +2. Open a new issue if you are unable to find an existing issue addressing your problem. Make sure to include a title and clear description, as much relevant information as possible, and a code sample or an executable test case demonstrating the expected behavior that is not occurring. +3. Discuss the priority and potential solutions with the maintainers in the issue. The maintainers would review the issue and add a label "Accepting Contributions" once the issue is ready for accepting contributions. +4. Open a PR only if the issue is labeled with "Accepting Contributions", ensure the PR description clearly describes the problem and solution. Note that an open PR without an "Accepting Contributions" issue will not be accepted. ## Contributor License Agreements From f1cd6dc0814ea6973875ef2cca0f8b4c2b203424 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 11 Apr 2024 13:10:20 -0400 Subject: [PATCH 086/113] fix: add module-info to be ignored in unique classes test. (#2369) Fix test failure by ignoring module-info in unique class check. --- .../src/test/java/com/google/cloud/BomContentTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index dd8bdc4081..d13978a5ac 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -129,8 +129,10 @@ private static void assertUniqueClasses(List allArtifacts) if (className.contains("javax.annotation") || className.contains("$") || className.equals("com.google.cloud.location.LocationsGrpc") - || className.endsWith("package-info")) { + || className.endsWith("package-info") + || className.endsWith("module-info")) { // Ignore annotations, nested classes, and package-info files. + // Ignore module-info files. // Ignore LocationsGrpc classes which are duplicated in generated grpc libraries. continue; } From a94d70e8dab128512cf23b5a1fbd05c87f7a07fb Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 27 Jun 2024 20:01:23 -0400 Subject: [PATCH 087/113] ci: remove SonarCloud (#2370) --- .github/workflows/sonar.yaml | 55 ------------------------------------ 1 file changed, 55 deletions(-) delete mode 100644 .github/workflows/sonar.yaml diff --git a/.github/workflows/sonar.yaml b/.github/workflows/sonar.yaml deleted file mode 100644 index 64fdd4977b..0000000000 --- a/.github/workflows/sonar.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: SonarCloud Analysis -on: - push: - branches: - - master - pull_request: - types: [opened, synchronize, reopened] - workflow_dispatch: - schedule: - - cron: '30 9 * * *' # 09:30 UTC every day - -jobs: - build: - if: github.repository == 'GoogleCloudPlatform/cloud-opensource-java' # Only run on upstream branch - name: Build with Sonar - runs-on: ubuntu-20.04 - steps: - - name: Get current date - id: date - run: echo "date=$(date +'%Y-%m-%d' --utc)" >> "$GITHUB_OUTPUT" - - uses: actions/checkout@v2 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: 11 - - name: Cache SonarCloud packages - uses: actions/cache@v2 - with: - path: ~/.sonar/cache - key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar - - uses: actions/cache@v2 - id: mvn-cache - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.date }} - - name: Mvn install w/ coverage - run: | - ./mvnw -B -e -ntp --activate-profiles codecoverage clean install \ - -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false \ - -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 - - name: Analyze with SonarCloud - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: | - ./mvnw \ - -B -ntp \ - --activate-profiles codecoverage \ - -Dsonar.projectKey=GoogleCloudPlatform_cloud-opensource-java \ - -Dsonar.host.url=https://sonarcloud.io \ - -Dsonar.organization=googlecloudplatform \ - org.sonarsource.scanner.maven:sonar-maven-plugin:sonar From fe6d4defb2ddc5d013e785c61a40a66f512ac8eb Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Thu, 1 Aug 2024 09:54:10 -0400 Subject: [PATCH 088/113] chore: bump main lts to 7.0.0-SNAPSHOT (#2374) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 336c46907a..c07cef49f3 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 6.0.0-SNAPSHOT + 7.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM From 25ffc3101b199ab27a04402749eaafc60fba646a Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 2 Aug 2024 10:02:46 -0400 Subject: [PATCH 089/113] deps: update LTS 7 versions. (#2368) * deps: update layer 1 versions. * update layer 1&2 versions. * update beam version * fix typo. * test androidpublisher version. * downgrade androidpublisher version for test. * test androidpublisher version v3-rev20240328-2.0.0. * chore: update androidpublisher to v3-rev20240418-2.0.0. * update protobuf to 3.25.4 * chore: update Bigtable HBase Beam to 2.14.3 --- boms/cloud-lts-bom/pom.xml | 80 +++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index c07cef49f3..8ab5121d36 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -49,56 +49,56 @@ UTF-8 - 32.1.3-jre + 33.1.0-jre 1.10.4 - 3.25.1 - 1.59.1 - 1.43.3 - 1.34.1 - 1.20.0 - 2.2.0 + 3.25.4 + 1.62.2 + 1.44.1 + 1.35.0 + 1.23.0 + 2.4.0 - 2.38.0 - 2.21.0 - 2.28.0 - 2.29.0 + 2.48.0 + 2.31.0 + 2.38.0 + 2.39.0 - 2.34.0 - 2.34.0 - 3.32.0 - 1.31.0 - 2.34.0 - 1.33.0 - 2.31.0 - 2.31.0 - 2.31.0 - 2.31.0 - 3.29.0 - 3.26.0 - 2.31.0 - 2.31.0 - v3-rev20231111-2.0.0 - 2.0.21 - 2.2.17 - 2.35.0 + 2.46.0 + 2.46.0 + 3.44.0 + 1.43.0 + 2.46.0 + 1.45.0 + 2.43.0 + 2.43.0 + 2.43.0 + 2.43.0 + 3.41.0 + 3.38.0 + 2.43.0 + 2.43.0 + v3-rev20240418-2.0.0 + 2.0.26 + 2.2.22 + 2.40.1 - v2-rev20231111-2.0.0 - 2.47.0 - 2.30.0 - 3.15.14 - 2.17.6 - 1.125.13 + v2-rev20240323-2.0.0 + 3.5.1 + 2.39.2 + 3.17.1 + 2.19.2 + 1.129.3 - 1.107.13 - 6.55.0 - 2.30.2 + 1.111.3 + 6.66.0 + 2.38.0 - 2.53.0 + 2.57.0 - 2.12.0 + 2.14.3 From f50c4db2542ea8051222b61ea9cdb2bcd5a610f6 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 2 Aug 2024 16:13:13 -0400 Subject: [PATCH 090/113] chore: remove outdated comment. (#2375) --- boms/cloud-lts-bom/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 8ab5121d36..795fa874cb 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -57,8 +57,7 @@ 1.35.0 1.23.0 2.4.0 - + 2.48.0 2.31.0 2.38.0 From 7c7fe4f4f09b8057d0e9245693a85ca346c0a1c1 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 23 Sep 2024 10:38:48 -0400 Subject: [PATCH 091/113] deps: upgrade enforcer rule to the latest 3.5.0 (#2379) * deps: upgrade enforcer rule to the latest 3.5.0 Credit: this change is based on the proposed changes by Robert Scholte in https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/2378#issuecomment-2340864202 * Fixing integration tests to use a better syntax in the new enforcer rule version * Detailed error message for the new enforcer rule version --- enforcer-rules/README.md | 9 +- enforcer-rules/pom.xml | 16 +- .../src/it/abstract-method-errors/pom.xml | 6 +- .../src/it/bom-project-error/pom.xml | 7 +- .../src/it/bom-project-no-error/pom.xml | 2 +- .../src/it/bom-project-no-packaging/pom.xml | 7 +- .../pom.xml | 7 +- .../it/fail-build-for-linkage-errors/pom.xml | 6 +- .../src/it/inaccessible-class-error/pom.xml | 6 +- .../src/it/missing-filter-file-error/pom.xml | 2 +- .../src/it/report-only-reachable-bom/pom.xml | 7 +- .../src/it/report-only-reachable/pom.xml | 7 +- .../src/it/return-type-mismatch/pom.xml | 6 +- enforcer-rules/src/it/test-scope/pom.xml | 7 +- .../it/war-project-private-modifier/pom.xml | 2 +- .../enforcer/LinkageCheckerRule.java | 257 +++++++++--------- .../enforcer/LinkageCheckerRuleTest.java | 80 +++--- 17 files changed, 234 insertions(+), 200 deletions(-) diff --git a/enforcer-rules/README.md b/enforcer-rules/README.md index 80e364243b..42c89389fb 100644 --- a/enforcer-rules/README.md +++ b/enforcer-rules/README.md @@ -17,8 +17,13 @@ $ mvn verify Listening for transport dt_socket at address: 5005 ``` -When you debug one of the integration tests in the "src/it" directory, use the following -command to specify the test case and to provide the debug parameter to Maven invoker plugin. +When you debug one of the integration tests in the "src/it" directory, check the +`build.log` files in the `enforcer-rules/target/it` directory (run +`find enforcer-rules -name 'build.log'`). +The file is used in verification scripts and usually contains build errors. + +If you want to attach a debugger, use the following command to specify the test +case and to provide the debug parameter to Maven invoker plugin. ``` mvn install -Dmaven.test.skip -Dinvoker.test=bom-project-using-spring-repository \ diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index c76849188f..627b1e82ce 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -48,7 +48,7 @@ - 3.0.0-M3 + 3.5.0 1.8 1.8 @@ -131,6 +131,20 @@ + + + org.eclipse.sisu + sisu-maven-plugin + 0.9.0.M1 + + + + main-index + + + + maven-invoker-plugin 3.2.2 diff --git a/enforcer-rules/src/it/abstract-method-errors/pom.xml b/enforcer-rules/src/it/abstract-method-errors/pom.xml index 13163944c4..c0f89086d7 100644 --- a/enforcer-rules/src/it/abstract-method-errors/pom.xml +++ b/enforcer-rules/src/it/abstract-method-errors/pom.xml @@ -52,7 +52,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -69,9 +69,7 @@ - - + diff --git a/enforcer-rules/src/it/bom-project-error/pom.xml b/enforcer-rules/src/it/bom-project-error/pom.xml index a2067b092a..673ab39bd8 100644 --- a/enforcer-rules/src/it/bom-project-error/pom.xml +++ b/enforcer-rules/src/it/bom-project-error/pom.xml @@ -54,7 +54,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -71,10 +71,9 @@ - + DEPENDENCY_MANAGEMENT - + diff --git a/enforcer-rules/src/it/bom-project-no-error/pom.xml b/enforcer-rules/src/it/bom-project-no-error/pom.xml index 8d2eb3767f..11e41ed0b3 100644 --- a/enforcer-rules/src/it/bom-project-no-error/pom.xml +++ b/enforcer-rules/src/it/bom-project-no-error/pom.xml @@ -50,7 +50,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools diff --git a/enforcer-rules/src/it/bom-project-no-packaging/pom.xml b/enforcer-rules/src/it/bom-project-no-packaging/pom.xml index 387a516efc..40549d43eb 100644 --- a/enforcer-rules/src/it/bom-project-no-packaging/pom.xml +++ b/enforcer-rules/src/it/bom-project-no-packaging/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -65,10 +65,9 @@ - + DEPENDENCY_MANAGEMENT - + diff --git a/enforcer-rules/src/it/bom-project-using-spring-repository/pom.xml b/enforcer-rules/src/it/bom-project-using-spring-repository/pom.xml index a734c6e5d4..47429492f5 100644 --- a/enforcer-rules/src/it/bom-project-using-spring-repository/pom.xml +++ b/enforcer-rules/src/it/bom-project-using-spring-repository/pom.xml @@ -67,7 +67,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -84,10 +84,9 @@ - + DEPENDENCY_MANAGEMENT - + diff --git a/enforcer-rules/src/it/fail-build-for-linkage-errors/pom.xml b/enforcer-rules/src/it/fail-build-for-linkage-errors/pom.xml index 744213021f..1f3936fd00 100644 --- a/enforcer-rules/src/it/fail-build-for-linkage-errors/pom.xml +++ b/enforcer-rules/src/it/fail-build-for-linkage-errors/pom.xml @@ -50,7 +50,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -67,9 +67,7 @@ - - + diff --git a/enforcer-rules/src/it/inaccessible-class-error/pom.xml b/enforcer-rules/src/it/inaccessible-class-error/pom.xml index e002ae31c8..2ac107a3e3 100644 --- a/enforcer-rules/src/it/inaccessible-class-error/pom.xml +++ b/enforcer-rules/src/it/inaccessible-class-error/pom.xml @@ -52,7 +52,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -69,9 +69,7 @@ - - + diff --git a/enforcer-rules/src/it/missing-filter-file-error/pom.xml b/enforcer-rules/src/it/missing-filter-file-error/pom.xml index d0ba489324..452b37cf43 100644 --- a/enforcer-rules/src/it/missing-filter-file-error/pom.xml +++ b/enforcer-rules/src/it/missing-filter-file-error/pom.xml @@ -50,7 +50,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools diff --git a/enforcer-rules/src/it/report-only-reachable-bom/pom.xml b/enforcer-rules/src/it/report-only-reachable-bom/pom.xml index 2fbec94a2f..d26886752f 100644 --- a/enforcer-rules/src/it/report-only-reachable-bom/pom.xml +++ b/enforcer-rules/src/it/report-only-reachable-bom/pom.xml @@ -59,7 +59,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -76,11 +76,10 @@ - + DEPENDENCY_MANAGEMENT true - + diff --git a/enforcer-rules/src/it/report-only-reachable/pom.xml b/enforcer-rules/src/it/report-only-reachable/pom.xml index 4a73f04618..f7949a142c 100644 --- a/enforcer-rules/src/it/report-only-reachable/pom.xml +++ b/enforcer-rules/src/it/report-only-reachable/pom.xml @@ -51,7 +51,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -68,10 +68,9 @@ - + true - + diff --git a/enforcer-rules/src/it/return-type-mismatch/pom.xml b/enforcer-rules/src/it/return-type-mismatch/pom.xml index 0d0948b72c..f002511ce7 100644 --- a/enforcer-rules/src/it/return-type-mismatch/pom.xml +++ b/enforcer-rules/src/it/return-type-mismatch/pom.xml @@ -47,7 +47,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -64,9 +64,7 @@ - - + diff --git a/enforcer-rules/src/it/test-scope/pom.xml b/enforcer-rules/src/it/test-scope/pom.xml index 9a06e22261..7713b68dfb 100644 --- a/enforcer-rules/src/it/test-scope/pom.xml +++ b/enforcer-rules/src/it/test-scope/pom.xml @@ -56,7 +56,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools @@ -73,10 +73,9 @@ - + true - + diff --git a/enforcer-rules/src/it/war-project-private-modifier/pom.xml b/enforcer-rules/src/it/war-project-private-modifier/pom.xml index d30a4b2012..b0917c13ea 100644 --- a/enforcer-rules/src/it/war-project-private-modifier/pom.xml +++ b/enforcer-rules/src/it/war-project-private-modifier/pom.xml @@ -46,7 +46,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M3 + @enforcer.version@ com.google.cloud.tools diff --git a/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java b/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java index cd7cba74cc..81f102ad41 100644 --- a/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java +++ b/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java @@ -48,24 +48,23 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.annotation.Nonnull; +import javax.inject.Inject; +import javax.inject.Named; import org.apache.maven.RepositoryUtils; +import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule; +import org.apache.maven.enforcer.rule.api.EnforcerLogger; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecution; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.enforcer.AbstractNonCacheableEnforcerRule; import org.apache.maven.project.DefaultDependencyResolutionRequest; import org.apache.maven.project.DependencyResolutionException; import org.apache.maven.project.DependencyResolutionRequest; import org.apache.maven.project.DependencyResolutionResult; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectDependenciesResolver; -import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.eclipse.aether.DefaultRepositoryCache; import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.ArtifactTypeRegistry; @@ -79,7 +78,8 @@ import org.eclipse.aether.version.InvalidVersionSpecificationException; /** Linkage Checker Maven Enforcer Rule. */ -public class LinkageCheckerRule extends AbstractNonCacheableEnforcerRule { +@Named("linkageCheckerRule") +public class LinkageCheckerRule extends AbstractEnforcerRule { /** * Maven packaging values known to be irrelevant to Linkage Check for non-BOM project. @@ -110,6 +110,31 @@ public class LinkageCheckerRule extends AbstractNonCacheableEnforcerRule { private ClassPathBuilder classPathBuilder; + // Properties managed by the dependency injection + private MavenProject project; + + private MavenSession session; + + private ProjectDependenciesResolver projectDependenciesResolver; + + private MojoExecution execution; + + private final RepositorySystem repoSystem; + + @Inject + public LinkageCheckerRule( + MavenProject project, + MavenSession session, + MojoExecution execution, + ProjectDependenciesResolver projectDependenciesResolver, + RepositorySystem repoSystem) { + this.project = project; + this.session = session; + this.execution = execution; + this.projectDependenciesResolver = projectDependenciesResolver; + this.repoSystem = repoSystem; + } + @VisibleForTesting void setDependencySection(DependencySection dependencySection) { this.dependencySection = dependencySection; @@ -133,139 +158,131 @@ void setExclusionFile(String exclusionFile) { this.exclusionFile = exclusionFile; } - private static Log logger; + private static EnforcerLogger logger; @Override - public void execute(@Nonnull EnforcerRuleHelper helper) throws EnforcerRuleException { - logger = helper.getLog(); + public void execute() throws EnforcerRuleException { + logger = getLog(); - try { - MavenProject project = (MavenProject) helper.evaluate("${project}"); - MavenSession session = (MavenSession) helper.evaluate("${session}"); - MojoExecution execution = (MojoExecution) helper.evaluate("${mojoExecution}"); - RepositorySystemSession repositorySystemSession = session.getRepositorySession(); - - ImmutableList repositoryUrls = - project.getRemoteProjectRepositories().stream() - .map(RemoteRepository::getUrl) - .collect(toImmutableList()); - DependencyGraphBuilder dependencyGraphBuilder = new DependencyGraphBuilder(repositoryUrls); - classPathBuilder = new ClassPathBuilder(dependencyGraphBuilder); - - boolean readingDependencyManagementSection = - dependencySection == DependencySection.DEPENDENCY_MANAGEMENT; - if (readingDependencyManagementSection - && (project.getDependencyManagement() == null - || project.getDependencyManagement().getDependencies() == null - || project.getDependencyManagement().getDependencies().isEmpty())) { - logger.warn("The rule is set to read dependency management section but it is empty."); - } + RepositorySystemSession repositorySystemSession = session.getRepositorySession(); - String projectType = project.getArtifact().getType(); - if (readingDependencyManagementSection) { - if (!"pom".equals(projectType)) { - logger.warn("A BOM should have packaging pom"); - return; - } - } else { - if (UNSUPPORTED_NONBOM_PACKAGING.contains(projectType)) { - return; - } - if (!"verify".equals(execution.getLifecyclePhase())) { - throw new EnforcerRuleException( - "To run the check on the compiled class files, the linkage checker enforcer rule" - + " should be bound to the 'verify' phase. Current phase: " - + execution.getLifecyclePhase()); - } - if (project.getArtifact().getFile() == null) { - // Skipping projects without a file, such as Guava's guava-tests module. - // https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/850 - return; - } - } + ImmutableList repositoryUrls = + project.getRemoteProjectRepositories().stream() + .map(RemoteRepository::getUrl) + .collect(toImmutableList()); + DependencyGraphBuilder dependencyGraphBuilder = new DependencyGraphBuilder(repositoryUrls); + classPathBuilder = new ClassPathBuilder(dependencyGraphBuilder); + + boolean readingDependencyManagementSection = + dependencySection == DependencySection.DEPENDENCY_MANAGEMENT; + if (readingDependencyManagementSection + && (project.getDependencyManagement() == null + || project.getDependencyManagement().getDependencies() == null + || project.getDependencyManagement().getDependencies().isEmpty())) { + logger.warn("The rule is set to read dependency management section but it is empty."); + } - ClassPathResult classPathResult = - readingDependencyManagementSection - ? findBomClasspath(project, repositorySystemSession) - : findProjectClasspath(project, repositorySystemSession, helper); - ImmutableList classPath = classPathResult.getClassPath(); - if (classPath.isEmpty()) { - logger.warn("Class path is empty."); + String projectType = project.getArtifact().getType(); + if (readingDependencyManagementSection) { + if (!"pom".equals(projectType)) { + logger.warn("A BOM should have packaging pom"); + return; + } + } else { + if (UNSUPPORTED_NONBOM_PACKAGING.contains(projectType)) { + return; + } + if (!"verify".equals(execution.getLifecyclePhase())) { + throw new EnforcerRuleException( + "To run the check on the compiled class files, the linkage checker enforcer rule" + + " should be bound to the 'verify' phase. Current phase: " + + execution.getLifecyclePhase()); + } + if (project.getArtifact().getFile() == null) { + // Skipping projects without a file, such as Guava's guava-tests module. + // https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/850 return; } + } - List entryPoints = entryPoints(project, classPath); - - try { - - // TODO LinkageChecker.create and LinkageChecker.findLinkageProblems - // should not be two separate public methods since we always call - // findLinkageProblems immediately after create. - - Path exclusionFile = this.exclusionFile == null ? null : Paths.get(this.exclusionFile); - LinkageChecker linkageChecker = - LinkageChecker.create(classPath, entryPoints, exclusionFile); - ImmutableSet linkageProblems = linkageChecker.findLinkageProblems(); - if (reportOnlyReachable) { - ClassReferenceGraph classReferenceGraph = linkageChecker.getClassReferenceGraph(); - linkageProblems = - linkageProblems.stream() - .filter( - entry -> - classReferenceGraph.isReachable(entry.getSourceClass().getBinaryName())) - .collect(toImmutableSet()); - } + ClassPathResult classPathResult = + readingDependencyManagementSection + ? findBomClasspath(project, repositorySystemSession) + : findProjectClasspath(project, repositorySystemSession, projectDependenciesResolver); + ImmutableList classPath = classPathResult.getClassPath(); + if (classPath.isEmpty()) { + logger.warn("Class path is empty."); + return; + } - if (classPathResult != null) { - LinkageProblemCauseAnnotator.annotate(classPathBuilder, classPathResult, linkageProblems); - } + List entryPoints = entryPoints(project, classPath); - // Count unique LinkageProblems by their symbols - long errorCount = - linkageProblems.stream().map(LinkageProblem::formatSymbolProblem).distinct().count(); + try { - String foundError = reportOnlyReachable ? "reachable error" : "error"; - if (errorCount > 1) { - foundError += "s"; - } - if (errorCount > 0) { - String message = - String.format( - "Linkage Checker rule found %d %s:\n%s", - errorCount, - foundError, - LinkageProblem.formatLinkageProblems(linkageProblems, classPathResult)); - if (getLevel() == WARN) { - logger.warn(message); - } else { - logger.error(message); - logger.info( - "For the details of the linkage errors, see " - + "https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/Linkage-Checker-Messages"); - throw new EnforcerRuleException( - "Failed while checking class path. See above error report."); - } + // TODO LinkageChecker.create and LinkageChecker.findLinkageProblems + // should not be two separate public methods since we always call + // findLinkageProblems immediately after create. + + Path exclusionFile = this.exclusionFile == null ? null : Paths.get(this.exclusionFile); + LinkageChecker linkageChecker = LinkageChecker.create(classPath, entryPoints, exclusionFile); + ImmutableSet linkageProblems = linkageChecker.findLinkageProblems(); + if (reportOnlyReachable) { + ClassReferenceGraph classReferenceGraph = linkageChecker.getClassReferenceGraph(); + linkageProblems = + linkageProblems.stream() + .filter( + entry -> + classReferenceGraph.isReachable(entry.getSourceClass().getBinaryName())) + .collect(toImmutableSet()); + } + + if (classPathResult != null) { + LinkageProblemCauseAnnotator.annotate(classPathBuilder, classPathResult, linkageProblems); + } + + // Count unique LinkageProblems by their symbols + long errorCount = + linkageProblems.stream().map(LinkageProblem::formatSymbolProblem).distinct().count(); + + String foundError = reportOnlyReachable ? "reachable error" : "error"; + if (errorCount > 1) { + foundError += "s"; + } + if (errorCount > 0) { + String message = + String.format( + "Linkage Checker rule found %d %s:\n%s", + errorCount, + foundError, + LinkageProblem.formatLinkageProblems(linkageProblems, classPathResult)); + if (getLevel() == WARN) { + logger.warn(message); } else { - // arguably shouldn't log anything on success - logger.info("No " + foundError + " found"); + logger.error(message); + logger.info( + "For the details of the linkage errors, see " + + "https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/Linkage-Checker-Messages"); + throw new EnforcerRuleException( + "Failed while checking class path. See above error report."); } - } catch (IOException ex) { - // Maven's "-e" flag does not work for EnforcerRuleException. Print stack trace here. - logger.warn("Failed to run Linkage Checker:" + ex.getMessage(), ex); - throw new EnforcerRuleException("Failed to run Linkage Checker", ex); + } else { + // arguably shouldn't log anything on success + logger.info("No " + foundError + " found"); } - } catch (ExpressionEvaluationException ex) { - throw new EnforcerRuleException("Unable to lookup an expression " + ex.getMessage(), ex); + } catch (IOException ex) { + // Maven's "-e" flag does not work for EnforcerRuleException + logger.warn("Failed to run Linkage Checker:" + ex); + throw new EnforcerRuleException("Failed to run Linkage Checker: " + ex, ex); } } /** Builds a class path for {@code mavenProject}. */ private static ClassPathResult findProjectClasspath( - MavenProject mavenProject, RepositorySystemSession session, EnforcerRuleHelper helper) + MavenProject mavenProject, + RepositorySystemSession session, + ProjectDependenciesResolver projectDependenciesResolver) throws EnforcerRuleException { try { - ProjectDependenciesResolver projectDependenciesResolver = - helper.getComponent(ProjectDependenciesResolver.class); DefaultRepositorySystemSession fullDependencyResolutionSession = new DefaultRepositorySystemSession(session); @@ -293,8 +310,6 @@ private static ClassPathResult findProjectClasspath( projectDependenciesResolver.resolve(dependencyResolutionRequest); return buildClassPathResult(resolutionResult); - } catch (ComponentLookupException e) { - throw new EnforcerRuleException("Unable to lookup a component " + e.getMessage(), e); } catch (DependencyResolutionException e) { return buildClasspathFromException(e); } diff --git a/enforcer-rules/src/test/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRuleTest.java b/enforcer-rules/src/test/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRuleTest.java index a6aec1f2de..7fd0dc427a 100644 --- a/enforcer-rules/src/test/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRuleTest.java +++ b/enforcer-rules/src/test/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRuleTest.java @@ -41,12 +41,11 @@ import java.util.stream.Collectors; import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.enforcer.rule.api.EnforcerLevel; +import org.apache.maven.enforcer.rule.api.EnforcerLogger; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; -import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.DependencyManagement; import org.apache.maven.plugin.MojoExecution; -import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.DependencyResolutionException; import org.apache.maven.project.DependencyResolutionRequest; import org.apache.maven.project.DependencyResolutionResult; @@ -75,14 +74,13 @@ public class LinkageCheckerRuleTest { - private LinkageCheckerRule rule = new LinkageCheckerRule(); + private LinkageCheckerRule rule; private RepositorySystem repositorySystem; private RepositorySystemSession repositorySystemSession; private Artifact dummyArtifactWithFile; private MavenProject mockProject; - private EnforcerRuleHelper mockRuleHelper; - private Log mockLog; + private EnforcerLogger mockLog; private MavenSession mockMavenSession; private MojoExecution mockMojoExecution; private ProjectDependenciesResolver mockProjectDependenciesResolver; @@ -96,6 +94,15 @@ public void setup() repositorySystemSession = RepositoryUtility.newSession(repositorySystem); dummyArtifactWithFile = createArtifactWithDummyFile("a:b:0.1"); setupMock(); + + rule = + new LinkageCheckerRule( + mockProject, + mockMavenSession, + mockMojoExecution, + mockProjectDependenciesResolver, + repositorySystem); + rule.setLog(mockLog); } private Artifact createArtifactWithDummyFile(String coordinates) throws URISyntaxException { @@ -109,20 +116,13 @@ private void setupMock() mockProject = mock(MavenProject.class); mockMavenSession = mock(MavenSession.class); when(mockMavenSession.getRepositorySession()).thenReturn(repositorySystemSession); - mockRuleHelper = mock(EnforcerRuleHelper.class); mockProjectDependenciesResolver = mock(ProjectDependenciesResolver.class); mockDependencyResolutionResult = mock(DependencyResolutionResult.class); - mockLog = mock(Log.class); - when(mockRuleHelper.getLog()).thenReturn(mockLog); - when(mockRuleHelper.getComponent(ProjectDependenciesResolver.class)) - .thenReturn(mockProjectDependenciesResolver); + mockLog = mock(EnforcerLogger.class); when(mockProjectDependenciesResolver.resolve(any(DependencyResolutionRequest.class))) .thenReturn(mockDependencyResolutionResult); - when(mockRuleHelper.evaluate("${session}")).thenReturn(mockMavenSession); - when(mockRuleHelper.evaluate("${project}")).thenReturn(mockProject); mockMojoExecution = mock(MojoExecution.class); when(mockMojoExecution.getLifecyclePhase()).thenReturn("verify"); - when(mockRuleHelper.evaluate("${mojoExecution}")).thenReturn(mockMojoExecution); org.apache.maven.artifact.DefaultArtifact rootArtifact = new org.apache.maven.artifact.DefaultArtifact( "com.google.cloud", @@ -194,7 +194,7 @@ public void testExecute_shouldPassGoodProject() // Since Guava 27, it requires com.google.guava:failureaccess artifact in its dependency. setupMockDependencyResolution("com.google.guava:guava:27.0.1-jre"); // This should not raise an EnforcerRuleException - rule.execute(mockRuleHelper); + rule.execute(); verify(mockLog).info("No error found"); } @@ -203,7 +203,7 @@ public void testExecute_shouldPassGoodProject_sessionProperties() throws EnforcerRuleException, RepositoryException, DependencyResolutionException { setupMockDependencyResolution("com.google.guava:guava:27.0.1-jre"); - rule.execute(mockRuleHelper); + rule.execute(); ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(DependencyResolutionRequest.class); @@ -225,7 +225,7 @@ public void testExecute_shouldFailForBadProject() throws RepositoryException { try { // This artifact is known to contain classes missing dependencies setupMockDependencyResolution("com.google.appengine:appengine-api-1.0-sdk:1.9.64"); - rule.execute(mockRuleHelper); + rule.execute(); Assert.fail( "The rule should raise an EnforcerRuleException for artifacts missing dependencies"); } catch (EnforcerRuleException ex) { @@ -259,7 +259,7 @@ public void testExecute_shouldFailForBadProject_reachableErrors() throws Reposit setupMockDependencyResolution( "com.google.api-client:google-api-client:1.27.0", "io.grpc:grpc-core:1.17.1"); rule.setReportOnlyReachable(true); - rule.execute(mockRuleHelper); + rule.execute(); Assert.fail( "The rule should raise an EnforcerRuleException for artifacts with reachable errors"); } catch (EnforcerRuleException ex) { @@ -278,9 +278,23 @@ public void testExecute_shouldPassForBadProject_levelWarn() // grpc-core is included in entry point jars, the errors are reachable. setupMockDependencyResolution( "com.google.api-client:google-api-client:1.27.0", "io.grpc:grpc-core:1.17.1"); + + rule = + new LinkageCheckerRule( + mockProject, + mockMavenSession, + mockMojoExecution, + mockProjectDependenciesResolver, + repositorySystem) { + @Override + public EnforcerLevel getLevel() { + return EnforcerLevel.WARN; + } + }; + rule.setLog(mockLog); + rule.setReportOnlyReachable(true); - rule.setLevel(EnforcerLevel.WARN); - rule.execute(mockRuleHelper); + rule.execute(); verify(mockLog) .warn(ArgumentMatchers.startsWith("Linkage Checker rule found 1 reachable error:")); } @@ -293,7 +307,7 @@ public void testExecute_shouldPassGoodProject_unreachableErrors() setupMockDependencyResolution("com.google.cloud:google-cloud-automl:0.81.0-beta"); rule.setReportOnlyReachable(true); // This should not raise EnforcerRuleException because the linkage errors are unreachable. - rule.execute(mockRuleHelper); + rule.execute(); } private void setupMockDependencyManagementSection(String... coordinates) { @@ -341,7 +355,7 @@ public void testExecute_shouldPassEmptyBom() throws EnforcerRuleException { setupMockDependencyManagementSection(); // empty BOM // This should not raise an EnforcerRuleException - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -352,7 +366,7 @@ public void testExecute_shouldPassGoodBom() throws EnforcerRuleException { "io.grpc:grpc-auth:1.18.0", "com.google.api:api-common:1.7.0"); // This should not raise an EnforcerRuleException - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -362,7 +376,7 @@ public void testExecute_shouldFailBadBom() { "com.google.api-client:google-api-client:1.27.0", "io.grpc:grpc-core:1.17.1"); try { - rule.execute(mockRuleHelper); + rule.execute(); Assert.fail("Enforcer rule should detect conflict between google-api-client and grpc-core"); } catch (EnforcerRuleException ex) { // pass @@ -384,7 +398,7 @@ public void testExecute_shouldSkipBadBomWithNonPomPackaging() throws EnforcerRul "jar", // BOM should have pom here null, new DefaultArtifactHandler())); - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -400,7 +414,7 @@ public void testExecute_shouldSkipNonBomPom() throws EnforcerRuleException { null, new DefaultArtifactHandler())); // No exception - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -419,7 +433,7 @@ public void testExecute_shouldExcludeTestScope() throws EnforcerRuleException { when(mockProject.getDependencies()) .thenReturn(ImmutableList.of(dependency)); - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -440,7 +454,7 @@ public void testExecute_shouldFailForBadProjectWithBundlePackaging() throws Repo rootArtifact.setFile(new File("dummy.jar")); when(mockProject.getArtifact()).thenReturn(rootArtifact); - rule.execute(mockRuleHelper); + rule.execute(); Assert.fail( "The rule should raise an EnforcerRuleException for artifacts missing dependencies"); } catch (EnforcerRuleException ex) { @@ -470,7 +484,7 @@ public void testExecute_shouldFilterExclusionRule_java8() .toAbsolutePath() .toString(); rule.setExclusionFile(exclusionFileLocation); - rule.execute(mockRuleHelper); + rule.execute(); Assert.fail( "The rule should raise an EnforcerRuleException for artifacts missing dependencies"); } catch (EnforcerRuleException ex) { @@ -510,7 +524,7 @@ public void testArtifactTransferError() when(mockProjectDependenciesResolver.resolve(any())).thenThrow(exception); try { - rule.execute(mockRuleHelper); + rule.execute(); fail("The rule should throw EnforcerRuleException upon dependency resolution exception"); } catch (EnforcerRuleException expected) { verify(mockLog) @@ -565,7 +579,7 @@ public void testArtifactTransferError_acceptableMissingArtifact() // Should not throw DependencyResolutionException, because the missing xerces-impl is under both // provided and optional dependencies. - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -603,7 +617,7 @@ public void testArtifactTransferError_missingArtifactNotInGraph() when(mockProjectDependenciesResolver.resolve(any())).thenThrow(exception); - rule.execute(mockRuleHelper); + rule.execute(); verify(mockLog) .warn("xerces:xerces-impl:jar:2.6.2 was not resolved. Dependency path is unknown."); } @@ -620,7 +634,7 @@ public void testSkippingProjectWithoutFile() throws EnforcerRuleException { "jar", null, new DefaultArtifactHandler())); - rule.execute(mockRuleHelper); + rule.execute(); } @Test @@ -638,7 +652,7 @@ public void testValidatePhase() { when(mockMojoExecution.getLifecyclePhase()).thenReturn("validate"); try { - rule.execute(mockRuleHelper); + rule.execute(); fail("The rule should throw EnforcerRuleException when running in validate phase"); } catch (EnforcerRuleException ex) { assertEquals( From a290256d9eda9a5fbd3b63ed1b9ec1b066f2a2a7 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Wed, 25 Sep 2024 10:59:38 -0400 Subject: [PATCH 092/113] chore: bump main lts to 8.0.0-SNAPSHOT (#2377) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 795fa874cb..372ed32061 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 7.0.0-SNAPSHOT + 8.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM From 081130c57d465274da9f5c64e0e1bc482ba27c62 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 7 Nov 2024 10:40:43 -0500 Subject: [PATCH 093/113] Warn incompatible class files (#2391) Fixes #2390 --- .../opensource/classpath/ClassDumper.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassDumper.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassDumper.java index 45564253f6..82115b7e03 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassDumper.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/ClassDumper.java @@ -89,7 +89,7 @@ static ClassDumper create(List entries) throws IOException { .collect(toImmutableList()); checkArgument( unreadableFiles.isEmpty(), "Some jar files are not readable: %s", unreadableFiles); - + Map map = new HashMap<>(); for (ClassPathEntry entry : entries) { for (String className : entry.getFileNames()) { @@ -98,7 +98,7 @@ static ClassDumper create(List entries) throws IOException { } } } - + return new ClassDumper(entries, extensionClassLoader, map); } @@ -141,37 +141,54 @@ static boolean isArrayClass(String className) { return className.startsWith("["); } - /** - * Returns a map from classes to the symbol references they contain. - */ + /** Returns a map from classes to the symbol references they contain. */ SymbolReferences findSymbolReferences() throws IOException { SymbolReferences.Builder builder = new SymbolReferences.Builder(); for (ClassPathEntry jar : inputClassPath) { + int totalClassFileCount = 0; + int incompatibleClassFileCount = 0; for (JavaClass javaClass : listClasses(jar)) { + totalClassFileCount++; if (isCompatibleClassFileVersion(javaClass)) { String className = javaClass.getClassName(); // In listClasses(jar), ClassPathRepository creates JavaClass through the first JAR file // that contains the class. It may be different from "jar" for an overlapping class. ClassFile source = new ClassFile(findClassLocation(className), className); builder.addAll(findSymbolReferences(source, javaClass)); + } else { + incompatibleClassFileCount++; } } + if (incompatibleClassFileCount > 0) { + logger.warning( + String.format( + "%s has %d (out of %d) incompatible class files (class file major version is outside %d <= v <= %d).", + jar, + incompatibleClassFileCount, + totalClassFileCount, + MINIMUM_CLASS_FILE_MAJOR_VERSION, + MAXIMUM_CLASS_FILE_MAJOR_VERSION)); + } } return builder.build(); } + private static final int MINIMUM_CLASS_FILE_MAJOR_VERSION = 45; + private static final int MAXIMUM_CLASS_FILE_MAJOR_VERSION = 52; + /** - * Returns true if {@code javaClass} file format is compatible with this tool. Currently - * Java 8 and earlier are supported. + * Returns true if {@code javaClass} file format is compatible with this tool. Currently Java 8 + * (class file major version 52) and earlier are supported. * * @see Java * Virtual Machine Specification: The ClassFile Structure: minor_version, major_version */ private static boolean isCompatibleClassFileVersion(JavaClass javaClass) { int classFileMajorVersion = javaClass.getMajor(); - return 45 <= classFileMajorVersion && classFileMajorVersion <= 52; + return MINIMUM_CLASS_FILE_MAJOR_VERSION <= classFileMajorVersion + && classFileMajorVersion <= MAXIMUM_CLASS_FILE_MAJOR_VERSION; } private static SymbolReferences.Builder findSymbolReferences( @@ -182,7 +199,7 @@ private static SymbolReferences.Builder findSymbolReferences( Constant[] constants = constantPool.getConstantPool(); for (Constant constant : constants) { if (constant == null) { - continue; + continue; } byte constantTag = constant.getTag(); @@ -262,8 +279,7 @@ private static ClassSymbol makeSymbol( return new ClassSymbol(targetClassName); } - private static MethodSymbol makeSymbol( - ConstantCP constantMethodref, ConstantPool constantPool) { + private static MethodSymbol makeSymbol(ConstantCP constantMethodref, ConstantPool constantPool) { String className = constantMethodref.getClass(constantPool); ConstantNameAndType constantNameAndType = constantNameAndType(constantMethodref, constantPool); String methodName = constantNameAndType.getName(constantPool); @@ -303,7 +319,7 @@ static ImmutableSet listInnerClassNames(JavaClass javaClass) { continue; } } - + // Class names stored in constant pool have '/' as separator. We want '.' (as binary name) String normalInnerClassName = innerClassName.replace('/', '.'); innerClassNames.add(normalInnerClassName); From 58dd1d1eb2059e8fdf2e2a88ffe1f4b18bb5cfa8 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 20 Feb 2025 11:46:58 -0800 Subject: [PATCH 094/113] feat: Add option to filter linkage checker problems coming from a list of artifacts (#2393) * feat: Allow LinkageChecker to be called via exec:java goal * feat: Add an Source filter to check if errors come from subset of files * chore: Source Filter takes a list of artifacts * chore: Update source filter to take in multiple args * chore: Fix broken tests * chore: Add comments and update artifacts equals method * chore: Fix broken tests * chore: Fix broken tests * chore: Fix issues * chore: Fix issues * Revert "chore: Fix issues" This reverts commit 3701953b4de95a9cec37943f92c3d8a46cd43f28. * chore: Fix issues * chore: update comments to explain why not use problemFilter * chore: Add test for source-filter * chore: Add comments about including areArtifactsEquals helper method --- .../LinkageCheckResultException.java | 2 +- .../opensource/classpath/LinkageChecker.java | 44 ++++++++++++++++--- .../classpath/LinkageCheckerArguments.java | 28 ++++++++++++ .../classpath/LinkageCheckerMain.java | 6 +-- .../ExclusionFilesIntegrationTest.java | 2 +- .../classpath/LinkageCheckerTest.java | 28 ++++++++++++ .../enforcer/LinkageCheckerRule.java | 2 +- .../dependencies/gradle/LinkageCheckTask.java | 2 +- .../linkagemonitor/LinkageMonitor.java | 2 +- 9 files changed, 102 insertions(+), 14 deletions(-) diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckResultException.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckResultException.java index d7acd68a89..3e66a5ab7d 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckResultException.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckResultException.java @@ -22,7 +22,7 @@ *

The caller of the tool can tell the existence of linkage errors by checking the exit status of * the {@link LinkageCheckerMain}. */ -final class LinkageCheckResultException extends Exception { +public final class LinkageCheckResultException extends Exception { LinkageCheckResultException(int linkageErrorCount) { super( "Found " diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageChecker.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageChecker.java index 12dfc715de..4e4f74b572 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageChecker.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageChecker.java @@ -36,6 +36,7 @@ import java.util.Queue; import java.util.Set; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.FieldOrMethod; @@ -54,6 +55,7 @@ public class LinkageChecker { private final ImmutableList classPath; private final SymbolReferences symbolReferences; private final ClassReferenceGraph classReferenceGraph; + private final List sourceFilterList; private final ExcludedErrors excludedErrors; @VisibleForTesting @@ -66,7 +68,7 @@ public ClassReferenceGraph getClassReferenceGraph() { } public static LinkageChecker create(List classPath) throws IOException { - return create(classPath, ImmutableSet.copyOf(classPath), null); + return create(classPath, ImmutableSet.copyOf(classPath), ImmutableList.of(), null); } /** @@ -79,6 +81,7 @@ public static LinkageChecker create(List classPath) throws IOExc public static LinkageChecker create( List classPath, Iterable entryPoints, + List sourceFilterList, @Nullable Path exclusionFile) throws IOException { Preconditions.checkArgument(!classPath.isEmpty(), "The linkage classpath is empty."); @@ -93,6 +96,7 @@ public static LinkageChecker create( classPath, symbolReferenceMaps, classReferenceGraph, + sourceFilterList, ExcludedErrors.create(exclusionFile)); } @@ -129,13 +133,13 @@ public static LinkageChecker create(Bom bom, Path exclusionFile) List artifactsInBom = classpath.subList(0, managedDependencies.size()); ImmutableSet entryPoints = ImmutableSet.copyOf(artifactsInBom); - return LinkageChecker.create(classpath, entryPoints, exclusionFile); + return LinkageChecker.create(classpath, entryPoints, ImmutableList.of(), exclusionFile); } @VisibleForTesting LinkageChecker cloneWith(SymbolReferences newSymbolMaps) { return new LinkageChecker( - classDumper, classPath, newSymbolMaps, classReferenceGraph, excludedErrors); + classDumper, classPath, newSymbolMaps, classReferenceGraph, ImmutableList.of(), excludedErrors); } private LinkageChecker( @@ -143,14 +147,28 @@ private LinkageChecker( List classPath, SymbolReferences symbolReferenceMaps, ClassReferenceGraph classReferenceGraph, + List sourceFilterList, ExcludedErrors excludedErrors) { this.classDumper = Preconditions.checkNotNull(classDumper); this.classPath = ImmutableList.copyOf(classPath); this.classReferenceGraph = Preconditions.checkNotNull(classReferenceGraph); this.symbolReferences = Preconditions.checkNotNull(symbolReferenceMaps); + this.sourceFilterList = sourceFilterList; this.excludedErrors = Preconditions.checkNotNull(excludedErrors); } + /** + * Two artifacts are considered equal if only the Maven Coordinates (GAV) are equal. This is + * included instead of using Artifact.equals() because the `equals()` implementation + * of DefaultArtifact checks more fields than just the GAV Coordinates (also checks the classifier, + * file path, properties, etc are all equal). + */ + private boolean areArtifactsEquals(Artifact artifact1, Artifact artifact2) { + return artifact1.getGroupId().equals(artifact2.getGroupId()) + && artifact1.getArtifactId().equals(artifact2.getArtifactId()) + && artifact1.getVersion().equals(artifact2.getVersion()); + } + /** * Searches the classpath for linkage errors. * @@ -161,7 +179,21 @@ public ImmutableSet findLinkageProblems() throws IOException { ImmutableSet.Builder problemToClass = ImmutableSet.builder(); // This sourceClassFile is a source of references to other symbols. - for (ClassFile classFile : symbolReferences.getClassFiles()) { + Set classFiles = symbolReferences.getClassFiles(); + + // Filtering the classFiles from the JARs (instead of using the problem filter) has additional a few + // additional benefits. 1. Reduces the total amount of linkage references to match and 2. Doesn't require + // an exclusion file to know all the possible flaky or false positive problems + if (!sourceFilterList.isEmpty()) { + // Filter the list to only contain class files that come from the classes we are interested in. + // Run through each class file and check that the class file's corresponding artifact matches + // any artifact specified in the sourceFilterList + classFiles = classFiles.stream() + .filter(x -> sourceFilterList.stream() + .anyMatch(y -> areArtifactsEquals(x.getClassPathEntry().getArtifact(), y))) + .collect(Collectors.toSet()); + } + for (ClassFile classFile : classFiles) { ImmutableSet classSymbols = symbolReferences.getClassSymbols(classFile); for (ClassSymbol classSymbol : classSymbols) { if (classSymbol instanceof SuperClassSymbol) { @@ -202,7 +234,7 @@ public ImmutableSet findLinkageProblems() throws IOException { } } - for (ClassFile classFile : symbolReferences.getClassFiles()) { + for (ClassFile classFile : classFiles) { ImmutableSet methodSymbols = symbolReferences.getMethodSymbols(classFile); ImmutableSet classFileNames = classFile.getClassPathEntry().getFileNames(); for (MethodSymbol methodSymbol : methodSymbols) { @@ -215,7 +247,7 @@ public ImmutableSet findLinkageProblems() throws IOException { } } - for (ClassFile classFile : symbolReferences.getClassFiles()) { + for (ClassFile classFile : classFiles) { ImmutableSet fieldSymbols = symbolReferences.getFieldSymbols(classFile); ImmutableSet classFileNames = classFile.getClassPathEntry().getFileNames(); for (FieldSymbol fieldSymbol : fieldSymbols) { diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerArguments.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerArguments.java index 04a5556f86..1696fe095d 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerArguments.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerArguments.java @@ -25,6 +25,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.DefaultParser; @@ -124,6 +127,17 @@ private static Options configureOptions() { .build(); inputGroup.addOption(jarOption); + Option sourceFilter = + Option.builder("s") + .longOpt("source-filter") + .hasArgs() + .valueSeparator(',') + .desc("List of maven coordinates for artifacts (separated by ','). " + + "These are artifacts whose class files are searched as the source of the " + + "potential Linkage Errors.") + .build(); + options.addOption(sourceFilter); + Option repositoryOption = Option.builder("m") .longOpt("maven-repositories") @@ -277,4 +291,18 @@ Path getOutputExclusionFile() { } return null; } + + /** + * Returns a list of artifacts to search where Linkage Errors stem from. If the argument is not + * specified, return an empty List. + */ + List getSourceFilterArtifactList() { + if (commandLine.hasOption("s")) { + String[] mavenCoordinatesOption = commandLine.getOptionValues("s"); + return Arrays.stream(mavenCoordinatesOption) + .map(DefaultArtifact::new) + .collect(Collectors.toList()); + } + return ImmutableList.of(); + } } diff --git a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMain.java b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMain.java index 73102c3174..834b872cd2 100644 --- a/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMain.java +++ b/dependencies/src/main/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerMain.java @@ -33,7 +33,7 @@ /** * A tool to find linkage errors in a class path. */ -class LinkageCheckerMain { +public class LinkageCheckerMain { /** * Forms a classpath from Maven coordinates or a list of jar files and reports linkage errors in @@ -133,7 +133,7 @@ private static Problems checkJarFiles( ImmutableSet entryPoints = ImmutableSet.copyOf(inputClassPath); LinkageChecker linkageChecker = LinkageChecker.create( - inputClassPath, entryPoints, linkageCheckerArguments.getInputExclusionFile()); + inputClassPath, entryPoints, ImmutableList.of(), linkageCheckerArguments.getInputExclusionFile()); ImmutableSet linkageProblems = findLinkageProblems(linkageChecker, linkageCheckerArguments.getReportOnlyReachable()); @@ -161,7 +161,7 @@ private static Problems checkArtifacts( LinkageChecker linkageChecker = LinkageChecker.create( - inputClassPath, entryPoints, linkageCheckerArguments.getInputExclusionFile()); + inputClassPath, entryPoints, linkageCheckerArguments.getSourceFilterArtifactList(), linkageCheckerArguments.getInputExclusionFile()); ImmutableSet linkageProblems = findLinkageProblems(linkageChecker, linkageCheckerArguments.getReportOnlyReachable()); diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesIntegrationTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesIntegrationTest.java index a0431398c5..c8bdf99fb4 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesIntegrationTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/ExclusionFilesIntegrationTest.java @@ -58,7 +58,7 @@ public void testExclusion() classPathBuilder.resolve(ImmutableList.of(artifact), false, DependencyMediation.MAVEN); LinkageChecker linkagechecker = - LinkageChecker.create(classPathResult.getClassPath(), ImmutableList.of(), exclusionFile); + LinkageChecker.create(classPathResult.getClassPath(), ImmutableList.of(), ImmutableList.of(), exclusionFile); ImmutableSet linkageProblems = linkagechecker.findLinkageProblems(); Truth.assertThat(linkageProblems).isEmpty(); diff --git a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerTest.java b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerTest.java index df2912d2d5..96556c330f 100644 --- a/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerTest.java +++ b/dependencies/src/test/java/com/google/cloud/tools/opensource/classpath/LinkageCheckerTest.java @@ -1340,4 +1340,32 @@ public void testProtectedMethodsOfObject() throws Exception { "has linkage errors that reference symbols on class")) .doesNotContain("java.lang.Object"); } + + @Test + public void testSourceFilter() throws InvalidVersionSpecificationException, IOException { + // BQ-Storage v3.9.3 contains 3 known binary incompatibilities with Protobuf-Java 4.x + DefaultArtifact sourceArtifact = new DefaultArtifact("com.google.cloud:google-cloud-bigquerystorage:3.9.3"); + ClassPathResult classPathResult = + new ClassPathBuilder() + .resolve( + ImmutableList.of( + sourceArtifact, + new DefaultArtifact("com.google.protobuf:protobuf-java:4.27.4"), + new DefaultArtifact("com.google.protobuf:protobuf-java-util:4.27.4")), + false, + DependencyMediation.MAVEN); + + ImmutableList classPath = classPathResult.getClassPath(); + LinkageChecker linkageChecker = LinkageChecker.create( + classPath, + ImmutableSet.copyOf(classPath), + ImmutableList.of(sourceArtifact), + null); + + // Without a source-filter to narrow down the linkage errors that stem from BQ-Storage, Linkage Checker + // would report 119 errors. Narrowing it down with the source filter will only report the 3 known binary + // incompatibilities + ImmutableSet problems = linkageChecker.findLinkageProblems(); + Truth.assertThat(problems.size()).isEqualTo(3); + } } diff --git a/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java b/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java index 81f102ad41..cd69e51907 100644 --- a/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java +++ b/enforcer-rules/src/main/java/com/google/cloud/tools/dependencies/enforcer/LinkageCheckerRule.java @@ -224,7 +224,7 @@ public void execute() throws EnforcerRuleException { // findLinkageProblems immediately after create. Path exclusionFile = this.exclusionFile == null ? null : Paths.get(this.exclusionFile); - LinkageChecker linkageChecker = LinkageChecker.create(classPath, entryPoints, exclusionFile); + LinkageChecker linkageChecker = LinkageChecker.create(classPath, entryPoints, ImmutableList.of(), exclusionFile); ImmutableSet linkageProblems = linkageChecker.findLinkageProblems(); if (reportOnlyReachable) { ClassReferenceGraph classReferenceGraph = linkageChecker.getClassReferenceGraph(); diff --git a/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java b/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java index fbb1cd2010..1526af1edf 100644 --- a/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java +++ b/gradle-plugin/src/main/java/com/google/cloud/tools/dependencies/gradle/LinkageCheckTask.java @@ -145,7 +145,7 @@ private boolean findLinkageErrors(Configuration configuration) throws IOExceptio } // TODO(suztomo): Specify correct entry points if reportOnlyReachable is true. - LinkageChecker linkageChecker = LinkageChecker.create(classPath, classPath, exclusionFile); + LinkageChecker linkageChecker = LinkageChecker.create(classPath, classPath, ImmutableList.of(), exclusionFile); ImmutableSet linkageProblems = linkageChecker.findLinkageProblems(); diff --git a/linkage-monitor/src/main/java/com/google/cloud/tools/dependencies/linkagemonitor/LinkageMonitor.java b/linkage-monitor/src/main/java/com/google/cloud/tools/dependencies/linkagemonitor/LinkageMonitor.java index 9e492a83d4..42cff216dd 100644 --- a/linkage-monitor/src/main/java/com/google/cloud/tools/dependencies/linkagemonitor/LinkageMonitor.java +++ b/linkage-monitor/src/main/java/com/google/cloud/tools/dependencies/linkagemonitor/LinkageMonitor.java @@ -294,7 +294,7 @@ private ImmutableSet run(String groupId, String artifactId) List entryPointJars = classpath.subList(0, snapshotManagedDependencies.size()); ImmutableSet problemsInSnapshot = - LinkageChecker.create(classpath, ImmutableSet.copyOf(entryPointJars), null) + LinkageChecker.create(classpath, ImmutableSet.copyOf(entryPointJars), ImmutableList.of(), null) .findLinkageProblems(); if (problemsInBaseline.equals(problemsInSnapshot)) { From 3ea7d57e5a0e30961ae453df5d1f39461566a37d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 7 Mar 2025 11:44:46 -0800 Subject: [PATCH 095/113] ci: Update Github Action Cache to v4 (#2399) --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0fc55c63d8..051d58f0e7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,14 +11,14 @@ jobs: matrix: java: [8, 11] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: actions/setup-java@v1 with: java-version: ${{matrix.java}} - name: Get current date id: date run: echo "date=$(date +'%Y-%m-%d' --utc)" >> "$GITHUB_OUTPUT" - - uses: actions/cache@v2 + - uses: actions/cache@v4 id: mvn-cache with: path: ~/.m2/repository From 1d0e7284180f3c2e4035c0d0b0ea2833f6994025 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 7 Mar 2025 12:10:48 -0800 Subject: [PATCH 096/113] ci: Add exec-linkage-checker maven profile to run linkage checker (#2398) --- dependencies/pom.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 39fcb51695..1ed34a35ea 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -121,6 +121,22 @@ + + exec-linkage-checker + + + + org.codehaus.mojo + exec-maven-plugin + 3.5.0 + + false + com.google.cloud.tools.opensource.classpath.LinkageCheckerMain + + + + + java8-incompatible-reference-check From 543f79d5a4681c1b997f257d218afd44a5caf650 Mon Sep 17 00:00:00 2001 From: Blake Li Date: Thu, 24 Apr 2025 11:23:42 -0400 Subject: [PATCH 097/113] deps: Update maven version to 3.8.8 (#2401) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2827a5e2cd..4ef99134bb 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ UTF-8 30.1.1-jre 9+181-r4173-1 - 3.6.3 + 3.8.8 1.7.1 1.1.3 From 6aa0d5f1b11e38dd5720fc665577a333eb89fa8a Mon Sep 17 00:00:00 2001 From: ldetmer <1771267+ldetmer@users.noreply.github.com> Date: Thu, 8 May 2025 21:34:38 -0400 Subject: [PATCH 098/113] feat: LTS8 (#2397) * feat: LTS8 * fix version translate and vision * update guava version * temp update bigtable until we have new version * update bigtable with correct version * update protobuf to be version 3.25 + use exclusions * update protobuf to be version 3.25.6 * exclude json pulled in by protobuf 3.25 * update beam to 2.64 * temporarily ignore downgrades * fix versions of bigtable and storage * update hbase version * add hbase dependency * revert typo * Updated protobuf to 3.25.7 --- boms/cloud-lts-bom/pom.xml | 128 ++++++++++++------ .../java/com/google/cloud/BomContentTest.java | 4 +- 2 files changed, 89 insertions(+), 43 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 372ed32061..36317ed119 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -49,55 +49,55 @@ UTF-8 - 33.1.0-jre - 1.10.4 - 3.25.4 - 1.62.2 - 1.44.1 - 1.35.0 - 1.23.0 - 2.4.0 + 33.4.0-jre + 1.11.0 + 3.25.7 + 1.70.0 + 1.46.3 + 1.38.0 + 1.33.1 + 2.7.2 - 2.48.0 - 2.31.0 - 2.38.0 - 2.39.0 + 2.62.0 + 2.45.0 + 2.52.0 + 2.53.0 - 2.46.0 - 2.46.0 - 3.44.0 - 1.43.0 - 2.46.0 - 1.45.0 - 2.43.0 - 2.43.0 - 2.43.0 - 2.43.0 - 3.41.0 - 3.38.0 - 2.43.0 - 2.43.0 - v3-rev20240418-2.0.0 - 2.0.26 - 2.2.22 - 2.40.1 + 2.62.0 + 2.62.0 + 3.60.0 + 1.59.0 + 2.62.0 + 1.61.0 + 2.59.0 + 2.59.0 + 2.59.0 + 2.59.0 + 3.57.0 + 3.54.0 + 2.59.0 + 2.59.0 + v3-rev20250102-2.0.0 + 2.0.31 + 2.2.26 + 2.48.1 - v2-rev20240323-2.0.0 - 3.5.1 - 2.39.2 - 3.17.1 - 2.19.2 - 1.129.3 + v2-rev20250216-2.0.0 + 3.11.4 + 2.54.0 + 3.21.4 + 2.26.4 + 1.137.1 - 1.111.3 - 6.66.0 - 2.38.0 + 1.119.1 + 6.88.0 + 2.49.0 - 2.57.0 + 2.64.0 - 2.14.3 + 2.14.9 @@ -132,6 +132,12 @@ com.google.protobuf protobuf-java-util ${protobuf.version} + + + com.google.code.gson + gson + + com.google.http-client @@ -474,21 +480,61 @@ org.apache.beam beam-sdks-java-core ${beam.version} + + + com.google.protobuf + protobuf-java + + + com.google.protobuf + protobuf-java-util + + org.apache.beam beam-sdks-java-extensions-google-cloud-platform-core ${beam.version} + + + com.google.protobuf + protobuf-java + + + com.google.protobuf + protobuf-java-util + + org.apache.beam beam-runners-google-cloud-dataflow-java ${beam.version} + + + com.google.protobuf + protobuf-java + + + com.google.protobuf + protobuf-java-util + + org.apache.beam beam-sdks-java-io-google-cloud-platform ${beam.version} + + + com.google.protobuf + protobuf-java + + + com.google.protobuf + protobuf-java-util + + diff --git a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java index d13978a5ac..682cf3119b 100644 --- a/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java +++ b/boms/integration-tests/src/test/java/com/google/cloud/BomContentTest.java @@ -76,8 +76,8 @@ private void checkBom(Path bomPath) throws Exception { assertReachable(buildMavenCentralUrl(artifact)); } } - - assertNoDowngradeRule(bom); + // Temporarily ignore due to inability to process exclusion statements + //assertNoDowngradeRule(bom); assertUniqueClasses(artifacts); assertBomIsImported(bom); } From b4b98d9b59b6abe1919a4b86d3ce9619ff6bdce8 Mon Sep 17 00:00:00 2001 From: ldetmer <1771267+ldetmer@users.noreply.github.com> Date: Mon, 12 May 2025 10:59:03 -0400 Subject: [PATCH 099/113] chore: update LTS release version to 9.0.0-snapshot (#2404) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 36317ed119..d470d680c6 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 8.0.0-SNAPSHOT + 9.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM From 8eb8233f0f402a52f9452ccc633fbce63904163d Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 6 Jun 2025 13:21:54 -0400 Subject: [PATCH 100/113] deps: maven-shared-utils 3.3.3 (#2407) b/416442478 --- dependencies/pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 1ed34a35ea..d8044394e6 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -51,6 +51,19 @@ org.apache.maven maven-core + + + org.apache.maven.shared + maven-shared-utils + + + + + org.apache.maven.shared + maven-shared-utils + + 3.3.3 From 6cac87c609e962057c002cd2bd916f77c800beb7 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Fri, 6 Jun 2025 20:27:55 -0400 Subject: [PATCH 101/113] Release 1.5.15-dependencies: Bumping to next version post release (#2408) --- boms/integration-tests/pom.xml | 2 +- dashboard/pom.xml | 2 +- dependencies/pom.xml | 2 +- enforcer-rules/pom.xml | 2 +- gradle-plugin/gradle.properties | 2 +- linkage-monitor/action.yml | 2 +- linkage-monitor/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/boms/integration-tests/pom.xml b/boms/integration-tests/pom.xml index d5a7cf22b1..62fdd4792d 100644 --- a/boms/integration-tests/pom.xml +++ b/boms/integration-tests/pom.xml @@ -18,7 +18,7 @@ com.google.cloud.tools dependencies - 1.5.14-SNAPSHOT + 1.5.16-SNAPSHOT junit diff --git a/dashboard/pom.xml b/dashboard/pom.xml index 7b774ef0c2..932ec0e4f3 100644 --- a/dashboard/pom.xml +++ b/dashboard/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.14-SNAPSHOT + 1.5.16-SNAPSHOT dashboard diff --git a/dependencies/pom.xml b/dependencies/pom.xml index d8044394e6..095ad93f34 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -8,7 +8,7 @@ com.google.cloud.tools dependencies-parent - 1.5.14-SNAPSHOT + 1.5.16-SNAPSHOT dependencies diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index 627b1e82ce..6039aeb656 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.14-SNAPSHOT + 1.5.16-SNAPSHOT linkage-checker-enforcer-rules diff --git a/gradle-plugin/gradle.properties b/gradle-plugin/gradle.properties index 8f47c24584..9425228d4a 100644 --- a/gradle-plugin/gradle.properties +++ b/gradle-plugin/gradle.properties @@ -1,2 +1,2 @@ # scripts/prepare_release.sh maintains this value. -version = 1.5.14-SNAPSHOT +version = 1.5.16-SNAPSHOT diff --git a/linkage-monitor/action.yml b/linkage-monitor/action.yml index 76bddd68e9..de4b76d898 100644 --- a/linkage-monitor/action.yml +++ b/linkage-monitor/action.yml @@ -7,7 +7,7 @@ runs: # scripts/release.sh updates the version part in the URL run: | curl --output /tmp/linkage-monitor.jar \ - "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-1.5.14-SNAPSHOT-all-deps.jar" + "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-1.5.16-SNAPSHOT-all-deps.jar" shell: bash - run: java -jar /tmp/linkage-monitor.jar com.google.cloud:libraries-bom shell: bash diff --git a/linkage-monitor/pom.xml b/linkage-monitor/pom.xml index 984f5e3e44..2dacf8e2e1 100644 --- a/linkage-monitor/pom.xml +++ b/linkage-monitor/pom.xml @@ -22,7 +22,7 @@ com.google.cloud.tools dependencies-parent - 1.5.14-SNAPSHOT + 1.5.16-SNAPSHOT linkage-monitor diff --git a/pom.xml b/pom.xml index 4ef99134bb..7612f7f8f2 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.google.cloud.tools dependencies-parent pom - 1.5.14-SNAPSHOT + 1.5.16-SNAPSHOT Cloud Tools Open Source Code Hygiene Tooling https://github.com/GoogleCloudPlatform/cloud-opensource-java/ From 536aad1459233175c8bb79bf29233e807f879df3 Mon Sep 17 00:00:00 2001 From: Jin Seop Kim Date: Wed, 27 Aug 2025 14:41:08 -0400 Subject: [PATCH 102/113] feat: LTS 9 (#2410) * feat: LTS 9 * fix: gcs-connector versions do not have prefixes from 3.0.0 * chore: update versions based on libraries-bom 26.62.0 * feat: update beam to 2.67.0 * feat: update bigtable-hbase-beam to v2.15.3 --- boms/cloud-lts-bom/pom.xml | 78 +++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index d470d680c6..8d6d8c606e 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -51,53 +51,53 @@ 33.4.0-jre 1.11.0 - 3.25.7 - 1.70.0 - 1.46.3 - 1.38.0 - 1.33.1 + 3.25.8 + 1.71.0 + 1.47.0 + 1.39.0 + 1.36.0 2.7.2 - 2.62.0 - 2.45.0 - 2.52.0 - 2.53.0 + 2.67.0 + 2.50.0 + 2.57.0 + 2.58.0 - 2.62.0 - 2.62.0 - 3.60.0 - 1.59.0 - 2.62.0 - 1.61.0 - 2.59.0 - 2.59.0 - 2.59.0 - 2.59.0 - 3.57.0 - 3.54.0 - 2.59.0 - 2.59.0 - v3-rev20250102-2.0.0 - 2.0.31 - 2.2.26 - 2.48.1 + 2.67.0 + 2.67.0 + 3.65.0 + 1.64.0 + 2.67.0 + 1.66.0 + 2.64.0 + 2.64.0 + 2.64.0 + 2.64.0 + 3.62.0 + 3.59.0 + 2.64.0 + 2.64.0 + v3-rev20250602-2.0.0 + 2.0.34 + 3.0.9 + 2.51.0 - v2-rev20250216-2.0.0 - 3.11.4 - 2.54.0 - 3.21.4 - 2.26.4 - 1.137.1 + v2-rev20250511-2.0.0 + 3.15.0 + 2.60.0 + 2.29.1 + 3.22.5 + 1.140.1 - 1.119.1 - 6.88.0 - 2.49.0 + 1.122.1 + 6.95.1 + 2.53.0 - 2.64.0 + 2.67.0 - 2.14.9 + 2.15.3 @@ -462,7 +462,7 @@ com.google.cloud.bigdataoss gcs-connector - hadoop3-${gcs-connector.version} + ${gcs-connector.version} com.google.cloud.bigdataoss From a4649811a02dc6eb2f6b67626004b8424c1ae58b Mon Sep 17 00:00:00 2001 From: Jin Seop Kim Date: Thu, 28 Aug 2025 15:53:50 -0400 Subject: [PATCH 103/113] chore: update LTS release version to 10.0.0-snapshot (#2416) --- boms/cloud-lts-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 8d6d8c606e..b9fad04238 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 9.0.0-SNAPSHOT + 10.0.0-SNAPSHOT pom Google Cloud Long Term Support BOM From a157aaabfebb88285a714f8a23509586d0bb7a5a Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 27 Oct 2025 11:40:37 -0400 Subject: [PATCH 104/113] ci: Release Please file for gcp-lts-bom and dependencies modules (#2420) * Release Please file for gcp-lts-bom The bootstrap-sha points to https://github.com/GoogleCloudPlatform/cloud-opensource-java/commit/8eb8233f0f402a52f9452ccc633fbce63904163d. This is the parent commit of "Release 1.5.15-dependencies: Bumping to next version post release (#2408)". LTS BOM 9.0.1 release happened after that. New tag format is "-v". For example "gcp-lts-bom-v9.0.1" and "dependencies-v1.5.15". * Maven profiles for release script Becasue there was an independent step to sign artifaccts in the previous releases using Rapid, the pom.xml files didn't need to have GPG signing configurations. With new release setup, there's no independent step to sign artifacts. We need to use maven-gpg-plugin to sign artifacts. --- .github/release-please.yml | 13 +++++++++ .release-please-manifest.json | 5 ++++ boms/cloud-lts-bom/pom.xml | 49 ++++++++++++++++++++++++++++++++- boms/cloud-lts-bom/versions.txt | 4 +++ dependencies/pom.xml | 2 +- enforcer-rules/pom.xml | 2 +- linkage-monitor/pom.xml | 2 +- pom.xml | 27 +++++++++++++++++- release-please-config.json | 16 +++++++++++ versions.txt | 4 +++ 10 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 .github/release-please.yml create mode 100644 .release-please-manifest.json create mode 100644 boms/cloud-lts-bom/versions.txt create mode 100644 release-please-config.json create mode 100644 versions.txt diff --git a/.github/release-please.yml b/.github/release-please.yml new file mode 100644 index 0000000000..ca062a2ec5 --- /dev/null +++ b/.github/release-please.yml @@ -0,0 +1,13 @@ +handleGHRelease: true +manifest: true +releaseType: java-yoshi +branches: + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-lts + branch: 9.0.x-lts + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-lts + branch: 8.0.x-lts + \ No newline at end of file diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000000..d60fcfad0d --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,5 @@ + + { + ".": "1.5.15", + "boms/cloud-lts-bom": "9.0.1" + } \ No newline at end of file diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index b9fad04238..005364f536 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -7,7 +7,7 @@ com.google.cloud gcp-lts-bom - 10.0.0-SNAPSHOT + 9.0.2-SNAPSHOT pom Google Cloud Long Term Support BOM @@ -546,4 +546,51 @@ + + + release + + + performRelease + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.7 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.1 + + + attach-sources + + jar-no-fork + + + + + + + + diff --git a/boms/cloud-lts-bom/versions.txt b/boms/cloud-lts-bom/versions.txt new file mode 100644 index 0000000000..530d658838 --- /dev/null +++ b/boms/cloud-lts-bom/versions.txt @@ -0,0 +1,4 @@ +# Format: +# module:released-version:current-version + +gcp-lts-bom:9.0.1:9.0.2-SNAPSHOT diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 095ad93f34..2296ec7d84 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -8,7 +8,7 @@ com.google.cloud.tools dependencies-parent - 1.5.16-SNAPSHOT + 1.5.16-SNAPSHOT dependencies diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index 6039aeb656..af2abf7020 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -6,7 +6,7 @@ com.google.cloud.tools dependencies-parent - 1.5.16-SNAPSHOT + 1.5.16-SNAPSHOT linkage-checker-enforcer-rules diff --git a/linkage-monitor/pom.xml b/linkage-monitor/pom.xml index 2dacf8e2e1..229975e4a5 100644 --- a/linkage-monitor/pom.xml +++ b/linkage-monitor/pom.xml @@ -22,7 +22,7 @@ com.google.cloud.tools dependencies-parent - 1.5.16-SNAPSHOT + 1.5.16-SNAPSHOT linkage-monitor diff --git a/pom.xml b/pom.xml index 7612f7f8f2..25a32f6222 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.google.cloud.tools dependencies-parent pom - 1.5.16-SNAPSHOT + 1.5.16-SNAPSHOT Cloud Tools Open Source Code Hygiene Tooling https://github.com/GoogleCloudPlatform/cloud-opensource-java/ @@ -249,6 +249,11 @@ release + + + performRelease + + @@ -277,6 +282,26 @@ + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.7 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000000..35c20e5c86 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "separate-pull-requests": true, + "include-component-in-tag": true, + "packages": { + ".": { + "component": "dependencies", + "release-type": "java-yoshi" + }, + "boms/cloud-lts-bom": { + "component": "gcp-lts-bom", + "release-type": "java-yoshi" + } + }, + "bootstrap-sha": "8eb8233f0f402a52f9452ccc633fbce63904163d" +} \ No newline at end of file diff --git a/versions.txt b/versions.txt new file mode 100644 index 0000000000..18c2d98c61 --- /dev/null +++ b/versions.txt @@ -0,0 +1,4 @@ +# Format: +# module:released-version:current-version + +dependencies:1.5.15:1.5.16-SNAPSHOT From 20607f1ac1f9372ef8f02e07c305db652e4fe188 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Mon, 27 Oct 2025 14:25:18 -0400 Subject: [PATCH 105/113] ci: include 7.0.x-lts branch as release-please config (#2422) * ci: 6.0.x-lts branch as test in the branches 7.0.x-lts and 6.0.x-lts are added. * ci: Bootstrap sha that includes LTS 7 and 6 7.0.x-lts branch is still live. The 6.0.x-lts branch is for testing of the new release script. --- .github/release-please.yml | 11 ++++++++++- release-please-config.json | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/release-please.yml b/.github/release-please.yml index ca062a2ec5..4f09084da3 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -10,4 +10,13 @@ branches: handleGHRelease: true releaseType: java-lts branch: 8.0.x-lts - \ No newline at end of file + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-lts + branch: 7.0.x-lts + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-lts + branch: 6.0.x-lts + + diff --git a/release-please-config.json b/release-please-config.json index 35c20e5c86..963c9230c9 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -12,5 +12,5 @@ "release-type": "java-yoshi" } }, - "bootstrap-sha": "8eb8233f0f402a52f9452ccc633fbce63904163d" -} \ No newline at end of file + "bootstrap-sha": "6b9240114536a03b72929d5fade85599fbdbbdd0" +} From 09cdb490b0934032a72c4d139b534414016520d5 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 28 Oct 2025 13:15:09 -0400 Subject: [PATCH 106/113] ci: release-type should be read by release-please-config (#2432) * ci: use java-backport in Release Please branches java-lts release type was outdated (go/backport-releases#2-run-the-release-brancher-cli-tool). It created a strange pull request with "-sp.1" suffix version. * ci: release-type should be read by release-please-config --- .github/release-please.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/release-please.yml b/.github/release-please.yml index 4f09084da3..7f689ee807 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,22 +1,15 @@ handleGHRelease: true manifest: true -releaseType: java-yoshi branches: - bumpMinorPreMajor: true handleGHRelease: true - releaseType: java-lts branch: 9.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true - releaseType: java-lts branch: 8.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true - releaseType: java-lts branch: 7.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true - releaseType: java-lts branch: 6.0.x-lts - - From d670b4cffca5165f761136e340b45272d9fa75d6 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 28 Oct 2025 14:02:00 -0400 Subject: [PATCH 107/113] ci: spcify packageName in .github/release-please.yml (#2440) --- .github/release-please.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index 7f689ee807..88918113d8 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -3,13 +3,17 @@ manifest: true branches: - bumpMinorPreMajor: true handleGHRelease: true + packageName: gcp-lts-bom branch: 9.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true + packageName: gcp-lts-bom branch: 8.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true + packageName: gcp-lts-bom branch: 7.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true + packageName: gcp-lts-bom branch: 6.0.x-lts From 5b59b1974e1ee3b30ddb49603b0b9ca32c93bd9f Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Tue, 28 Oct 2025 15:47:07 -0400 Subject: [PATCH 108/113] ci: use manifest: true in each branch (#2443) --- .github/release-please.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index 88918113d8..db54e9dfb7 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -4,16 +4,20 @@ branches: - bumpMinorPreMajor: true handleGHRelease: true packageName: gcp-lts-bom + manifest: true branch: 9.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true packageName: gcp-lts-bom + manifest: true branch: 8.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true packageName: gcp-lts-bom + manifest: true branch: 7.0.x-lts - bumpMinorPreMajor: true handleGHRelease: true packageName: gcp-lts-bom + manifest: true branch: 6.0.x-lts From e214588c5344a268f7f7254fc7ddee38a602cd57 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 29 Oct 2025 14:56:58 -0400 Subject: [PATCH 109/113] ci: dependencies as a module in Release Please in master branch (#2448) --- .release-please-manifest.json | 4 ++-- versions.txt => dependencies/versions.txt | 0 gradle-plugin/build.gradle | 2 ++ gradle-plugin/gradle.properties | 2 -- release-please-config.json | 5 +++-- 5 files changed, 7 insertions(+), 6 deletions(-) rename versions.txt => dependencies/versions.txt (100%) delete mode 100644 gradle-plugin/gradle.properties diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d60fcfad0d..bfc6a2aeb1 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - ".": "1.5.15", + "dependencies": "1.5.15", "boms/cloud-lts-bom": "9.0.1" - } \ No newline at end of file + } diff --git a/versions.txt b/dependencies/versions.txt similarity index 100% rename from versions.txt rename to dependencies/versions.txt diff --git a/gradle-plugin/build.gradle b/gradle-plugin/build.gradle index cac6808473..2e53631137 100644 --- a/gradle-plugin/build.gradle +++ b/gradle-plugin/build.gradle @@ -27,6 +27,8 @@ group = 'com.google.cloud.tools' sourceCompatibility = 1.8 +version = '1.5.15' // {x-version-update:dependencies:current} + dependencies { implementation "com.google.cloud.tools:dependencies:$version" implementation 'com.google.guava:guava:30.1-jre' diff --git a/gradle-plugin/gradle.properties b/gradle-plugin/gradle.properties deleted file mode 100644 index 9425228d4a..0000000000 --- a/gradle-plugin/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -# scripts/prepare_release.sh maintains this value. -version = 1.5.16-SNAPSHOT diff --git a/release-please-config.json b/release-please-config.json index 963c9230c9..340b223ff8 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -3,9 +3,10 @@ "separate-pull-requests": true, "include-component-in-tag": true, "packages": { - ".": { + "dependencies": { "component": "dependencies", - "release-type": "java-yoshi" + "release-type": "java-yoshi", + "extra-files": ["pom.xml", "enforcer-rules/pom.xml", "gradle-plugin/build.gradle", "linkage-monitor/pom.xml"] }, "boms/cloud-lts-bom": { "component": "gcp-lts-bom", From 7050ebd73d173a4229aabc61f0f315f5de5af9b2 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Wed, 29 Oct 2025 16:37:05 -0400 Subject: [PATCH 110/113] chore: remove unused modules (#2449) The Libraries BOM has moved to the java-cloud-bom repository. We have cloud-lts-bom still in this repository but it's not released as part of the root project. Removing it from the root pom.xml. The dashboard from the dashboard module is no longer used. Let's stop the periodic build job. The linkage-monitor directory is not released as part of the root module. This change also fixes the CI of the Gradle plugin. The Gradle plugin is published to Gradle plugin portal, not Maven Central. https://plugins.gradle.org/plugin/com.google.cloud.tools.linkagechecker --- README.md | 12 +- boms/cloud-oss-bom/pom.xml | 288 -------- boms/pom.xml | 1 - dashboard/README.md | 7 - dashboard/pom.xml | 80 --- .../opensource/dashboard/ArtifactCache.java | 50 -- .../opensource/dashboard/ArtifactInfo.java | 54 -- .../opensource/dashboard/ArtifactResults.java | 85 --- .../dashboard/DashboardArguments.java | 179 ----- .../opensource/dashboard/DashboardMain.java | 623 ------------------ .../tools/opensource/dashboard/PieChart.java | 55 -- .../src/main/resources/css/dashboard.css | 147 ----- dashboard/src/main/resources/js/dashboard.js | 27 - dashboard/src/main/resources/poms/demo.xml | 49 -- .../resources/templates/artifact_details.ftl | 55 -- .../main/resources/templates/component.ftl | 156 ----- .../resources/templates/dependency_trees.ftl | 22 - .../src/main/resources/templates/index.ftl | 142 ---- .../src/main/resources/templates/macros.ftl | 142 ---- .../templates/unstable_artifacts.ftl | 40 -- .../resources/templates/version_index.ftl | 20 - .../dashboard/ArtifactResultsTest.java | 51 -- .../dashboard/DashboardArgumentsTest.java | 116 ---- .../opensource/dashboard/DashboardTest.java | 491 -------------- .../DashboardUnavailableArtifactTest.java | 169 ----- .../opensource/dashboard/FreemarkerTest.java | 146 ---- .../opensource/dashboard/PieChartTest.java | 88 --- dependencies/pom.xml | 18 - enforcer-rules/pom.xml | 50 +- gradle-plugin/build.gradle | 2 +- .../java8-incompatible-reference-check.sh | 11 - kokoro/ubuntu/periodic.cfg | 13 - kokoro/ubuntu/periodic.sh | 22 - pom.xml | 3 - 34 files changed, 35 insertions(+), 3379 deletions(-) delete mode 100644 boms/cloud-oss-bom/pom.xml delete mode 100644 dashboard/README.md delete mode 100644 dashboard/pom.xml delete mode 100644 dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java delete mode 100644 dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java delete mode 100644 dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java delete mode 100644 dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java delete mode 100644 dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java delete mode 100644 dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java delete mode 100644 dashboard/src/main/resources/css/dashboard.css delete mode 100644 dashboard/src/main/resources/js/dashboard.js delete mode 100644 dashboard/src/main/resources/poms/demo.xml delete mode 100644 dashboard/src/main/resources/templates/artifact_details.ftl delete mode 100644 dashboard/src/main/resources/templates/component.ftl delete mode 100644 dashboard/src/main/resources/templates/dependency_trees.ftl delete mode 100644 dashboard/src/main/resources/templates/index.ftl delete mode 100644 dashboard/src/main/resources/templates/macros.ftl delete mode 100644 dashboard/src/main/resources/templates/unstable_artifacts.ftl delete mode 100644 dashboard/src/main/resources/templates/version_index.ftl delete mode 100644 dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/ArtifactResultsTest.java delete mode 100644 dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardArgumentsTest.java delete mode 100644 dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java delete mode 100644 dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardUnavailableArtifactTest.java delete mode 100644 dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/FreemarkerTest.java delete mode 100644 dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/PieChartTest.java delete mode 100644 kokoro/ubuntu/java8-incompatible-reference-check.sh delete mode 100644 kokoro/ubuntu/periodic.cfg delete mode 100755 kokoro/ubuntu/periodic.sh diff --git a/README.md b/README.md index 4e18b55387..a4c78f000d 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,6 @@ This project explores common infrastructure and best practices for open source Java projects for the Google Cloud Platform (GCP). -# Google Cloud Platform Java Dependency Dashboard - -[Google Cloud Platform Java Dependency Dashboard]( -https://storage.googleapis.com/cloud-opensource-java-dashboard/com.google.cloud/libraries-bom/snapshot/index.html) -(runs daily; work in progress) shows multiple checks on the consistency among -Google Cloud Java libraries. For manually generating the dashboard, see -[its README](./dashboard/README.md). - # Google Best Practices for Java Libraries [Google Best Practices for Java Libraries](https://googlecloudplatform.github.io/cloud-opensource-java/) @@ -43,6 +35,8 @@ The [GCP Libraries BOM](https://cloud.google.com/java/docs/bom) is a Bill-of-Mat provides consistent versions of Google Cloud Java libraries that work together without linkage errors. +This has moved to https://github.com/googleapis/java-cloud-bom/tree/main/libraries-bom. + # Development This project is built using _Maven_. @@ -62,5 +56,3 @@ This project is built using _Maven_. This is not an officially supported Google product. - - diff --git a/boms/cloud-oss-bom/pom.xml b/boms/cloud-oss-bom/pom.xml deleted file mode 100644 index 0fbd96533f..0000000000 --- a/boms/cloud-oss-bom/pom.xml +++ /dev/null @@ -1,288 +0,0 @@ - - - 4.0.0 - - com.google.cloud - libraries-bom - 25.3.1-SNAPSHOT - pom - - Google Cloud Platform Supported Libraries - - A compatible set of Google Cloud open source libraries. - Document: https://cloud.google.com/java/docs/bom - - https://cloud.google.com/java/docs/bom - - Google LLC - https://cloud.google.com - - 2019 - - - Elliotte Rusty Harold - - - - - https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues - - - scm:git:git@github.com:GoogleCloudPlatform/cloud-opensource-java.git - scm:git:git@github.com:GoogleCloudPlatform/cloud-opensource-java.git - - https://github.com/GoogleCloudPlatform/cloud-opensource-java/boms/cloud-oss-bom - HEAD - - - - - The Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - - UTF-8 - 31.1-jre - 2.9.0 - 0.174.0 - 2.6.0 - 1.45.1 - 1.41.7 - 3.19.4 - - 2.16.0 - 0.101.0 - 1.6.0 - 2.1.5 - 2.8.3 - 1.3.1 - - - - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - - - - - - - com.google.guava - guava - ${guava.version} - - - com.google.guava - guava-testlib - ${guava.version} - - - com.google.code.gson - gson - ${gson.version} - - - - com.google.protobuf - protobuf-bom - ${protobuf.version} - pom - import - - - - - com.google.http-client - google-http-client - ${http.version} - - - com.google.http-client - google-http-client-android - ${http.version} - - - com.google.http-client - google-http-client-apache-v2 - ${http.version} - - - com.google.http-client - google-http-client-appengine - ${http.version} - - - com.google.http-client - google-http-client-gson - ${http.version} - - - com.google.http-client - google-http-client-jackson2 - ${http.version} - - - com.google.http-client - google-http-client-protobuf - ${http.version} - - - com.google.http-client - google-http-client-test - ${http.version} - - - com.google.http-client - google-http-client-xml - ${http.version} - - - - - io.grpc - grpc-alts - ${io.grpc.version} - - - io.grpc - grpc-api - ${io.grpc.version} - - - io.grpc - grpc-auth - ${io.grpc.version} - - - io.grpc - grpc-context - ${io.grpc.version} - - - io.grpc - grpc-core - ${io.grpc.version} - - - io.grpc - grpc-grpclb - ${io.grpc.version} - - - io.grpc - grpc-netty - ${io.grpc.version} - - - io.grpc - grpc-netty-shaded - ${io.grpc.version} - - - io.grpc - grpc-okhttp - ${io.grpc.version} - - - io.grpc - grpc-protobuf - ${io.grpc.version} - - - io.grpc - grpc-protobuf-lite - ${io.grpc.version} - - - io.grpc - grpc-services - ${io.grpc.version} - - - io.grpc - grpc-stub - ${io.grpc.version} - - - io.grpc - grpc-testing - ${io.grpc.version} - - - - - com.google.cloud - google-cloud-bom - ${google.cloud.bom.version} - pom - import - - - - com.google.api - api-common - ${api-common.version} - - - com.google.api - gax - ${gax.version} - - - com.google.api - gax-grpc - ${gax.version} - - - com.google.api - gax-httpjson - ${gax.httpjson.version} - - - com.google.auth - google-auth-library-bom - ${auth.version} - pom - import - - - com.google.cloud - google-cloud-core-bom - ${google.cloud.core.version} - pom - import - - - com.google.api.grpc - proto-google-common-protos - ${common.protos.version} - - - com.google.api.grpc - grpc-google-common-protos - ${common.protos.version} - - - com.google.api.grpc - proto-google-iam-v1 - ${iam.protos.version} - - - com.google.api.grpc - grpc-google-iam-v1 - ${iam.protos.version} - - - - - - diff --git a/boms/pom.xml b/boms/pom.xml index 507915a380..5aa20037ba 100644 --- a/boms/pom.xml +++ b/boms/pom.xml @@ -29,7 +29,6 @@ - cloud-oss-bom cloud-lts-bom upper-bounds-check integration-tests diff --git a/dashboard/README.md b/dashboard/README.md deleted file mode 100644 index 9e83166283..0000000000 --- a/dashboard/README.md +++ /dev/null @@ -1,7 +0,0 @@ -To generate the dashboard from the root directory run: - -``` -$ mvn clean install -$ cd dashboard -$ mvn exec:java -Dexec.arguments="-f ../boms/cloud-oss-bom/pom.xml" -``` diff --git a/dashboard/pom.xml b/dashboard/pom.xml deleted file mode 100644 index 932ec0e4f3..0000000000 --- a/dashboard/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - - com.google.cloud.tools - dependencies-parent - 1.5.16-SNAPSHOT - - dashboard - - Cloud Tools Open Source Code Hygiene Dashboard - https://github.com/GoogleCloudPlatform/cloud-opensource-java/dashboard - - Google LLC. - https://www.google.com - - - - - The Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - - UTF-8 - 1.8 - 1.8 - - - - - org.freemarker - freemarker - 2.3.31 - - - com.google.guava - guava - - - ${project.groupId} - dependencies - ${project.version} - - - - xom - xom - 1.3.7 - test - - - junit - junit - test - - - com.google.truth - truth - test - - - - - - - org.codehaus.mojo - exec-maven-plugin - - false - com.google.cloud.tools.opensource.dashboard.DashboardMain - - - - - - diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java deleted file mode 100644 index ec12246c52..0000000000 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactCache.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import java.util.List; -import java.util.Map; - -import org.eclipse.aether.artifact.Artifact; - -import com.google.cloud.tools.opensource.dependencies.DependencyGraph; - -/** - * Unified return type to bundle a lot of information about multiple artifacts together. - */ -class ArtifactCache { - - private Map infoMap; - private List globalDependencies; - - void setInfoMap(Map infoMap) { - this.infoMap = infoMap; - } - - void setGlobalDependencies(List globalDependencies) { - this.globalDependencies = globalDependencies; - } - - Map getInfoMap() { - return infoMap; - } - - List getGlobalDependencies() { - return globalDependencies; - } - -} diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java deleted file mode 100644 index 1bf711c88e..0000000000 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import org.eclipse.aether.RepositoryException; - -import com.google.cloud.tools.opensource.dependencies.DependencyGraph; - -/** - * Cache of info looked up for an artifact. - */ -class ArtifactInfo { - - private DependencyGraph completeDependencies; - private DependencyGraph transitiveDependencies; - private RepositoryException exception; - - ArtifactInfo(DependencyGraph completeDependencies, - DependencyGraph transitiveDependencies) { - this.completeDependencies = completeDependencies; - this.transitiveDependencies = transitiveDependencies; - } - - ArtifactInfo(RepositoryException ex) { - this.exception = ex; - } - - DependencyGraph getCompleteDependencies() { - return completeDependencies; - } - - DependencyGraph getTransitiveDependencies() { - return transitiveDependencies; - } - - RepositoryException getException() { - return exception; - } - -} diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java deleted file mode 100644 index da528a2f84..0000000000 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/ArtifactResults.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Nullable; - -import org.eclipse.aether.artifact.Artifact; - -import com.google.cloud.tools.opensource.dependencies.Artifacts; - -/** - * Collection of test results for a single artifact. - */ -public final class ArtifactResults { - - private final Map results = new HashMap<>(); - private final Artifact artifact; - private String exceptionMessage; - - public ArtifactResults(Artifact artifact) { - this.artifact = artifact; - } - - public void setExceptionMessage(String exceptionMessage) { - this.exceptionMessage = exceptionMessage; - } - - void addResult(String testName, int failures) { - results.put(testName, failures); - } - - /** - * @return true for pass, false for fail, null for unknown test - */ - @Nullable - public Boolean getResult(String testName) { - Integer failures = results.get(testName); - if (failures != null) { - return failures == 0; - } - return null; - } - - public String getCoordinates() { - return Artifacts.toCoordinates(artifact); - } - - /** - * @return message of exception occurred when running test, null for no exception - */ - @Nullable - public String getExceptionMessage() { - return exceptionMessage; - } - - /** - * - * @return number of times the specified test failed. Returns 0 - * if the test was not run. - */ - public int getFailureCount(String testName) { - Integer failures = results.get(testName); - if (failures == null) { - return 0; - } - return failures; - } -} diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java deleted file mode 100644 index 6dda1bb91a..0000000000 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardArguments.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import com.google.common.collect.ImmutableList; -import java.nio.file.Path; -import java.nio.file.Paths; -import javax.annotation.Nullable; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - -/** - * Command-line option for {@link DashboardMain}. The tool takes either a pom.xml file path or Maven - * coordinates for a BOM. - */ -final class DashboardArguments { - private static final Options options = configureOptions(); - private static final HelpFormatter helpFormatter = new HelpFormatter(); - - private static final ImmutableList validDependencyMediationValues = - ImmutableList.of("maven", "gradle"); - - private final CommandLine commandLine; - - private DashboardArguments(CommandLine commandLine) { - this.commandLine = commandLine; - } - - /** - * Returns true if the argument for a file is specified. False if the argument for coordinates is - * specified. - * - *

It is guaranteed that either a file path or Maven coordinates for a BOM are available. - */ - boolean hasFile() { - return commandLine.hasOption('f'); - } - - /** - * Returns true if the argument for a versionless coordinates is specified; otherwise false. - * - *

It is guaranteed that either a file path or Maven coordinates for a BOM are available. - */ - boolean hasVersionlessCoordinates() { - return commandLine.hasOption('a'); - } - - /** Returns an absolute path to pom.xml file of a BOM. Null if file is not specified. */ - @Nullable - Path getBomFile() { - if (!commandLine.hasOption('f')) { - return null; - } - // Trim the value so that maven exec plugin can pass arguments with exec.arguments="-f pom.xml" - return Paths.get(commandLine.getOptionValue('f').trim()).toAbsolutePath(); - } - - /** Returns the Maven coordinates of a BOM. Null if coordinates are not specified. */ - @Nullable - String getBomCoordinates() { - if (!commandLine.hasOption('c')) { - return null; - } - return commandLine.getOptionValue('c').trim(); - } - - /** - * Returns the versionless Maven coordinates of a BOM. Null if versionless coordinates are not - * specified. - */ - @Nullable - String getVersionlessCoordinates() { - if (!commandLine.hasOption('a')) { - return null; - } - return commandLine.getOptionValue('a').trim(); - } - - static DashboardArguments readCommandLine(String... arguments) throws ParseException { - CommandLineParser parser = new DefaultParser(); - - try { - // Throws ParseException if required option group ('-f' or '-c') is not specified - CommandLine commandLine = parser.parse(options, arguments); - String dependencyMediationValue = commandLine.getOptionValue('m'); - if (dependencyMediationValue != null - && !validDependencyMediationValues.contains(dependencyMediationValue)) { - throw new ParseException("Valid values for '-m' are " + validDependencyMediationValues); - } - - return new DashboardArguments(commandLine); - } catch (ParseException ex) { - helpFormatter.printHelp("DashboardMain", options); - throw ex; - } - } - - enum DependencyMediationAlgorithm { - MAVEN, - GRADLE, - } - - /** - * Returns dependency mediation algorithm. By default it's {@link - * DependencyMediationAlgorithm#MAVEN}. - */ - DependencyMediationAlgorithm getDependencyMediation() { - if (!commandLine.hasOption('m')) { - return DependencyMediationAlgorithm.MAVEN; - } - String optionValue = commandLine.getOptionValue('m').trim(); - return "maven".equals(optionValue) - ? DependencyMediationAlgorithm.MAVEN - : DependencyMediationAlgorithm.GRADLE; - } - - private static Options configureOptions() { - Options options = new Options(); - OptionGroup inputGroup = new OptionGroup(); - inputGroup.setRequired(true); - - Option inputFileOption = - Option.builder("f").longOpt("bom-file").hasArg().desc("File to a BOM (pom.xml)").build(); - inputGroup.addOption(inputFileOption); - - Option inputCoordinatesOption = - Option.builder("c") - .longOpt("bom-coordinates") - .hasArg() - .desc( - "Maven coordinates of a BOM. For example, com.google.cloud:libraries-bom:1.0.0") - .build(); - inputGroup.addOption(inputCoordinatesOption); - - Option versionlessCoordinatesOption = - Option.builder("a") - .longOpt("all-versions") - .hasArg() - .desc( - "Maven coordinates of a BOM without version. " - + "For example, com.google.cloud:libraries-bom") - .build(); - inputGroup.addOption(versionlessCoordinatesOption); - - Option dependencyMediationOption = - Option.builder("m") - .longOpt("dependency-mediation") - .hasArg() - .desc( - "The dependency mediation algorithm to choose versions. The valid values are:\n" - + "- 'maven' for nearest-win strategy (default)\n" - + "- 'gradle' for highest-win strategy.") - .build(); - options.addOption(dependencyMediationOption); - - options.addOptionGroup(inputGroup); - return options; - } -} diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java deleted file mode 100644 index 94427516e2..0000000000 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import static com.google.common.base.Preconditions.checkArgument; - -import com.google.cloud.tools.opensource.classpath.ClassFile; -import com.google.cloud.tools.opensource.classpath.ClassPathBuilder; -import com.google.cloud.tools.opensource.classpath.ClassPathEntry; -import com.google.cloud.tools.opensource.classpath.ClassPathResult; -import com.google.cloud.tools.opensource.classpath.DependencyMediation; -import com.google.cloud.tools.opensource.classpath.GradleDependencyMediation; -import com.google.cloud.tools.opensource.classpath.LinkageChecker; -import com.google.cloud.tools.opensource.classpath.LinkageProblem; -import com.google.cloud.tools.opensource.dashboard.DashboardArguments.DependencyMediationAlgorithm; -import com.google.cloud.tools.opensource.dependencies.Artifacts; -import com.google.cloud.tools.opensource.dependencies.Bom; -import com.google.cloud.tools.opensource.dependencies.DependencyGraph; -import com.google.cloud.tools.opensource.dependencies.DependencyGraphBuilder; -import com.google.cloud.tools.opensource.dependencies.DependencyPath; -import com.google.cloud.tools.opensource.dependencies.MavenRepositoryException; -import com.google.cloud.tools.opensource.dependencies.RepositoryUtility; -import com.google.cloud.tools.opensource.dependencies.Update; -import com.google.cloud.tools.opensource.dependencies.VersionComparator; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimaps; -import com.google.common.collect.Sets; -import freemarker.template.Configuration; -import freemarker.template.DefaultObjectWrapper; -import freemarker.template.DefaultObjectWrapperBuilder; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.TemplateHashModel; -import freemarker.template.Version; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; -import org.apache.commons.cli.ParseException; -import org.eclipse.aether.RepositoryException; -import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.version.InvalidVersionSpecificationException; - -public class DashboardMain { - - public static final String TEST_NAME_LINKAGE_CHECK = "Linkage Errors"; - public static final String TEST_NAME_UPPER_BOUND = "Upper Bounds"; - public static final String TEST_NAME_GLOBAL_UPPER_BOUND = "Global Upper Bounds"; - public static final String TEST_NAME_DEPENDENCY_CONVERGENCE = "Dependency Convergence"; - public static final int LATEST_VERSIONS_COUNT = 10; - - private static final Configuration freemarkerConfiguration = configureFreemarker(); - - private static final DependencyGraphBuilder dependencyGraphBuilder = new DependencyGraphBuilder(); - private static final ClassPathBuilder classPathBuilder = - new ClassPathBuilder(dependencyGraphBuilder); - - /** - * Generates a code hygiene dashboard for a BOM. This tool takes a path to pom.xml of the BOM as - * an argument or Maven coordinates to a BOM. - * - *

Generated dashboard is at {@code target/$groupId/$artifactId/$version/index.html}, where - * each value is from BOM coordinates except {@code $version} is "snapshot" if the BOM has - * snapshot version. - */ - public static void main(String[] arguments) - throws IOException, TemplateException, RepositoryException, URISyntaxException, - ParseException, MavenRepositoryException { - DashboardArguments dashboardArguments = DashboardArguments.readCommandLine(arguments); - - if (dashboardArguments.hasVersionlessCoordinates()) { - generateLatestVersions( - dashboardArguments.getVersionlessCoordinates(), - dashboardArguments.getDependencyMediation()); - } else if (dashboardArguments.hasFile()) { - generate(dashboardArguments.getBomFile(), dashboardArguments.getDependencyMediation()); - } else { - generate(dashboardArguments.getBomCoordinates(), dashboardArguments.getDependencyMediation()); - } - } - - private static void generateLatestVersions( - String versionlessCoordinates, DependencyMediationAlgorithm dependencyMediationAlgorithm) - throws IOException, TemplateException, RepositoryException, URISyntaxException, - MavenRepositoryException { - List elements = Splitter.on(':').splitToList(versionlessCoordinates); - if (elements.size() != 2) { - System.err.println( - "Versionless coordinates should have one colon: " + versionlessCoordinates); - return; - } - String groupId = elements.get(0); - String artifactId = elements.get(1); - - RepositorySystem repositorySystem = RepositoryUtility.newRepositorySystem(); - // The highest version comes last. - ImmutableList versions = - RepositoryUtility.findVersions(repositorySystem, groupId, artifactId); - ImmutableList latestVersions = - versions.size() > LATEST_VERSIONS_COUNT ? versions.subList( - versions.size() - LATEST_VERSIONS_COUNT, - versions.size()) : versions; - for (String version : latestVersions) { - generate( - String.format("%s:%s:%s", groupId, artifactId, version), dependencyMediationAlgorithm); - } - generateVersionIndex(groupId, artifactId, versions); - } - - @VisibleForTesting - static Path generateVersionIndex(String groupId, String artifactId, List versions) - throws IOException, TemplateException, URISyntaxException { - Path directory = outputDirectory(groupId, artifactId, "snapshot").getParent(); - directory.toFile().mkdirs(); - Path page = directory.resolve("index.html"); - - Map templateData = new HashMap<>(); - templateData.put("versions", versions); - templateData.put("groupId", groupId); - templateData.put("artifactId", artifactId); - - File dashboardFile = page.toFile(); - try (Writer out = - new OutputStreamWriter(new FileOutputStream(dashboardFile), StandardCharsets.UTF_8)) { - Template dashboard = freemarkerConfiguration.getTemplate("/templates/version_index.ftl"); - dashboard.process(templateData, out); - } - - copyResource(directory, "css/dashboard.css"); - - return page; - } - - @VisibleForTesting - static Path generate( - String bomCoordinates, DependencyMediationAlgorithm dependencyMediationAlgorithm) - throws IOException, TemplateException, RepositoryException, URISyntaxException { - Path output = generate(Bom.readBom(bomCoordinates), dependencyMediationAlgorithm); - System.out.println("Wrote dashboard for " + bomCoordinates + " to " + output); - return output; - } - - @VisibleForTesting - static Path generate(Path bomFile, DependencyMediationAlgorithm dependencyMediationAlgorithm) - throws IOException, TemplateException, URISyntaxException, MavenRepositoryException, - InvalidVersionSpecificationException { - checkArgument(Files.isRegularFile(bomFile), "The input BOM %s is not a regular file", bomFile); - checkArgument(Files.isReadable(bomFile), "The input BOM %s is not readable", bomFile); - Path output = generate(Bom.readBom(bomFile), dependencyMediationAlgorithm); - System.out.println("Wrote dashboard for " + bomFile + " to " + output); - return output; - } - - private static Path generate(Bom bom, DependencyMediationAlgorithm dependencyMediationAlgorithm) - throws IOException, TemplateException, URISyntaxException, - InvalidVersionSpecificationException { - - ImmutableList managedDependencies = bom.getManagedDependencies(); - - DependencyMediation dependencyMediation = - dependencyMediationAlgorithm == DependencyMediationAlgorithm.MAVEN - ? DependencyMediation.MAVEN - : GradleDependencyMediation.withEnforcedPlatform(bom); - - ClassPathResult classPathResult = - classPathBuilder.resolve(managedDependencies, false, dependencyMediation); - ImmutableList classpath = classPathResult.getClassPath(); - - LinkageChecker linkageChecker = LinkageChecker.create(classpath); - - ImmutableSet linkageProblems = linkageChecker.findLinkageProblems(); - - ArtifactCache cache = loadArtifactInfo(managedDependencies); - Path output = generateHtml(bom, cache, classPathResult, linkageProblems); - - return output; - } - - private static Path outputDirectory(String groupId, String artifactId, String version) { - String versionPathElement = version.contains("-SNAPSHOT") ? "snapshot" : version; - return Paths.get("target", groupId, artifactId, versionPathElement); - } - - private static Path generateHtml( - Bom bom, - ArtifactCache cache, - ClassPathResult classPathResult, - ImmutableSet linkageProblems) - throws IOException, TemplateException, URISyntaxException { - - Artifact bomArtifact = new DefaultArtifact(bom.getCoordinates()); - - Path relativePath = - outputDirectory( - bomArtifact.getGroupId(), bomArtifact.getArtifactId(), bomArtifact.getVersion()); - Path output = Files.createDirectories(relativePath); - - copyResource(output, "css/dashboard.css"); - copyResource(output, "js/dashboard.js"); - - ImmutableMap> linkageProblemTable = - indexByJar(linkageProblems); - - List table = - generateReports( - freemarkerConfiguration, output, cache, linkageProblemTable, classPathResult, bom); - - generateDashboard( - freemarkerConfiguration, - output, - table, - cache.getGlobalDependencies(), - linkageProblemTable, - classPathResult, - bom); - - return output; - } - - private static void copyResource(Path output, String resourceName) - throws IOException, URISyntaxException { - ClassLoader classLoader = DashboardMain.class.getClassLoader(); - Path input = Paths.get(classLoader.getResource(resourceName).toURI()).toAbsolutePath(); - Path copy = output.resolve(input.getFileName()); - if (!Files.exists(copy)) { - Files.copy(input, copy); - } - } - - @VisibleForTesting - static Configuration configureFreemarker() { - Configuration configuration = new Configuration(new Version("2.3.28")); - configuration.setDefaultEncoding("UTF-8"); - configuration.setClassForTemplateLoading(DashboardMain.class, "/"); - return configuration; - } - - @VisibleForTesting - static List generateReports( - Configuration configuration, - Path output, - ArtifactCache cache, - ImmutableMap> linkageProblemTable, - ClassPathResult classPathResult, - Bom bom) - throws TemplateException { - - Map artifacts = cache.getInfoMap(); - List table = new ArrayList<>(); - for (Entry entry : artifacts.entrySet()) { - ArtifactInfo info = entry.getValue(); - try { - if (info.getException() != null) { - ArtifactResults unavailable = new ArtifactResults(entry.getKey()); - unavailable.setExceptionMessage(info.getException().getMessage()); - table.add(unavailable); - } else { - Artifact artifact = entry.getKey(); - ImmutableSet jarsInDependencyTree = - classPathResult.getClassPathEntries(Artifacts.toCoordinates(artifact)); - Map> relevantLinkageProblemTable = - Maps.filterKeys(linkageProblemTable, jarsInDependencyTree::contains); - - ArtifactResults results = - generateArtifactReport( - configuration, - output, - artifact, - entry.getValue(), - cache.getGlobalDependencies(), - ImmutableMap.copyOf(relevantLinkageProblemTable), - classPathResult, - bom); - table.add(results); - } - } catch (IOException ex) { - ArtifactResults unavailableTestResult = new ArtifactResults(entry.getKey()); - unavailableTestResult.setExceptionMessage(ex.getMessage()); - // Even when there's a problem generating test result, show the error in the dashboard - table.add(unavailableTestResult); - } - } - - return table; - } - - /** - * This is the only method that queries the Maven repository. - */ - private static ArtifactCache loadArtifactInfo(List artifacts) { - Map infoMap = new LinkedHashMap<>(); - List globalDependencies = new ArrayList<>(); - - for (Artifact artifact : artifacts) { - DependencyGraph completeDependencies = - dependencyGraphBuilder.buildVerboseDependencyGraph(artifact); - globalDependencies.add(completeDependencies); - - // picks versions according to Maven rules - DependencyGraph transitiveDependencies = - dependencyGraphBuilder.buildMavenDependencyGraph(new Dependency(artifact, "compile")); - - ArtifactInfo info = new ArtifactInfo(completeDependencies, transitiveDependencies); - infoMap.put(artifact, info); - } - - ArtifactCache cache = new ArtifactCache(); - cache.setInfoMap(infoMap); - cache.setGlobalDependencies(globalDependencies); - - return cache; - } - - private static ArtifactResults generateArtifactReport( - Configuration configuration, - Path output, - Artifact artifact, - ArtifactInfo artifactInfo, - List globalDependencies, - ImmutableMap> linkageProblemTable, - ClassPathResult classPathResult, - Bom bom) - throws IOException, TemplateException { - - String coordinates = Artifacts.toCoordinates(artifact); - File outputFile = output.resolve(coordinates.replace(':', '_') + ".html").toFile(); - - try (Writer out = new OutputStreamWriter( - new FileOutputStream(outputFile), StandardCharsets.UTF_8)) { - - // includes all versions - DependencyGraph graph = artifactInfo.getCompleteDependencies(); - List convergenceIssues = graph.findUpdates(); - - // picks versions according to Maven rules - DependencyGraph transitiveDependencies = artifactInfo.getTransitiveDependencies(); - - Map upperBoundFailures = - findUpperBoundsFailures(graph.getHighestVersionMap(), transitiveDependencies); - - Map globalUpperBoundFailures = findUpperBoundsFailures( - collectLatestVersions(globalDependencies), transitiveDependencies); - - long totalLinkageErrorCount = - linkageProblemTable.values().stream() - .flatMap(problemToClasses -> problemToClasses.stream().map(LinkageProblem::getSymbol)) - .distinct() // The dashboard counts linkage errors by the symbols - .count(); - - Template report = configuration.getTemplate("/templates/component.ftl"); - - Map templateData = new HashMap<>(); - - DefaultObjectWrapper wrapper = - new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_28).build(); - TemplateHashModel staticModels = wrapper.getStaticModels(); - templateData.put("linkageProblem", staticModels.get(LinkageProblem.class.getName())); - - templateData.put("artifact", artifact); - templateData.put("updates", convergenceIssues); - templateData.put("upperBoundFailures", upperBoundFailures); - templateData.put("globalUpperBoundFailures", globalUpperBoundFailures); - templateData.put("lastUpdated", LocalDateTime.now()); - templateData.put("dependencyGraph", graph); - templateData.put("linkageProblems", linkageProblemTable); - templateData.put("classPathResult", classPathResult); - templateData.put("totalLinkageErrorCount", totalLinkageErrorCount); - templateData.put("coordinates", bom.getCoordinates()); - - report.process(templateData, out); - - ArtifactResults results = new ArtifactResults(artifact); - results.addResult(TEST_NAME_UPPER_BOUND, upperBoundFailures.size()); - results.addResult(TEST_NAME_GLOBAL_UPPER_BOUND, globalUpperBoundFailures.size()); - results.addResult(TEST_NAME_DEPENDENCY_CONVERGENCE, convergenceIssues.size()); - results.addResult(TEST_NAME_LINKAGE_CHECK, (int) totalLinkageErrorCount); - - return results; - } - } - - private static Map findUpperBoundsFailures( - Map expectedVersionMap, - DependencyGraph transitiveDependencies) { - - Map actualVersionMap = transitiveDependencies.getHighestVersionMap(); - - VersionComparator comparator = new VersionComparator(); - - Map upperBoundFailures = new LinkedHashMap<>(); - - for (String id : expectedVersionMap.keySet()) { - String expectedVersion = expectedVersionMap.get(id); - String actualVersion = actualVersionMap.get(id); - // Check that the actual version is not null because it is - // possible for dependencies to appear or disappear from the tree - // depending on which version of another dependency is loaded. - // In both cases, no action is needed. - if (actualVersion != null && comparator.compare(actualVersion, expectedVersion) < 0) { - // Maven did not choose highest version - DefaultArtifact lower = new DefaultArtifact(id + ":" + actualVersion); - DefaultArtifact upper = new DefaultArtifact(id + ":" + expectedVersion); - upperBoundFailures.put(lower, upper); - } - } - return upperBoundFailures; - } - - /** - * Partitions {@code linkageProblems} by the JAR file that contains the {@link ClassFile}. - * - *

For example, {@code classes = result.get(JarX).get(linkageProblemY)} where {@code classes} - * are not null means that {@code JarX} has {@code linkageProblemY} and that {@code JarX} contains - * {@code classes} which reference {@code linkageProblemY.getSymbol()}. - */ - private static ImmutableMap> indexByJar( - ImmutableSet linkageProblems) { - - ImmutableMap> jarMap = - Multimaps.index(linkageProblems, problem -> problem.getSourceClass().getClassPathEntry()) - .asMap(); - - return ImmutableMap.copyOf(Maps.transformValues(jarMap, ImmutableSet::copyOf)); - } - - @VisibleForTesting - static void generateDashboard( - Configuration configuration, - Path output, - List table, - List globalDependencies, - ImmutableMap> linkageProblemTable, - ClassPathResult classPathResult, - Bom bom) - throws IOException, TemplateException { - - Map latestArtifacts = collectLatestVersions(globalDependencies); - - Map templateData = new HashMap<>(); - templateData.put("table", table); - templateData.put("lastUpdated", LocalDateTime.now()); - templateData.put("latestArtifacts", latestArtifacts); - templateData.put("linkageProblems", linkageProblemTable); - templateData.put("classPathResult", classPathResult); - templateData.put("dependencyPathRootCauses", findRootCauses(classPathResult)); - templateData.put("coordinates", bom.getCoordinates()); - templateData.put("dependencyGraphs", globalDependencies); - - // Accessing static methods from Freemarker template - // https://freemarker.apache.org/docs/pgui_misc_beanwrapper.html#autoid_60 - DefaultObjectWrapper wrapper = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_28) - .build(); - TemplateHashModel staticModels = wrapper.getStaticModels(); - templateData.put("dashboardMain", staticModels.get(DashboardMain.class.getName())); - templateData.put("pieChart", staticModels.get(PieChart.class.getName())); - templateData.put("linkageProblem", staticModels.get(LinkageProblem.class.getName())); - - File dashboardFile = output.resolve("index.html").toFile(); - try (Writer out = new OutputStreamWriter( - new FileOutputStream(dashboardFile), StandardCharsets.UTF_8)) { - Template dashboard = configuration.getTemplate("/templates/index.ftl"); - dashboard.process(templateData, out); - } - - File detailsFile = output.resolve("artifact_details.html").toFile(); - try (Writer out = new OutputStreamWriter( - new FileOutputStream(detailsFile), StandardCharsets.UTF_8)) { - Template details = configuration.getTemplate("/templates/artifact_details.ftl"); - details.process(templateData, out); - } - - File unstable = output.resolve("unstable_artifacts.html").toFile(); - try (Writer out = new OutputStreamWriter( - new FileOutputStream(unstable), StandardCharsets.UTF_8)) { - Template details = configuration.getTemplate("/templates/unstable_artifacts.ftl"); - details.process(templateData, out); - } - - File dependencyTrees = output.resolve("dependency_trees.html").toFile(); - try (Writer out = - new OutputStreamWriter(new FileOutputStream(dependencyTrees), StandardCharsets.UTF_8)) { - Template details = configuration.getTemplate("/templates/dependency_trees.ftl"); - details.process(templateData, out); - } - } - - private static Map collectLatestVersions( - List globalDependencies) { - Map latestArtifacts = new TreeMap<>(); - VersionComparator comparator = new VersionComparator(); - - if (globalDependencies != null) { - for (DependencyGraph graph : globalDependencies) { - Map map = graph.getHighestVersionMap(); - for (String key : map.keySet()) { - String newVersion = map.get(key); - String oldVersion = latestArtifacts.get(key); - if (oldVersion == null || comparator.compare(newVersion, oldVersion) > 0) { - latestArtifacts.put(key, map.get(key)); - } - } - } - } - return latestArtifacts; - } - - /** - * Returns the number of rows in {@code table} that show unavailable ({@code null} result) or some - * failures for {@code columnName}. - */ - public static long countFailures(List table, String columnName) { - return table.stream() - .filter(row -> row.getResult(columnName) == null || row.getFailureCount(columnName) > 0) - .count(); - } - - private static final int MINIMUM_NUMBER_DEPENDENCY_PATHS = 5; - - /** - * Returns mapping from jar files to summaries of the root problem in their {@link - * DependencyPath}s. The summary explains common patterns ({@code groupId:artifactId}) in the path - * elements. The returned map does not have a key for a jar file when it has fewer than {@link - * #MINIMUM_NUMBER_DEPENDENCY_PATHS} dependency paths or a common pattern is not found among the - * elements in the paths. - * - *

Example summary: "Artifacts 'com.google.http-client:google-http-client > - * commons-logging:commons-logging > log4j:log4j' exist in all 994 dependency paths. Example - * path: com.google.cloud:google-cloud-core:1.59.0 ..." - * - *

Using this summary in the BOM dashboard avoids repetitive items in the {@link - * DependencyPath} list that share the same root problem caused by widely-used libraries, for - * example, {@code commons-logging:commons-logging}, {@code com.google.http-client:google-http-client} - * and {@code log4j:log4j}. - */ - private static ImmutableMap findRootCauses(ClassPathResult classPathResult) { - // Freemarker is not good at handling non-string keys. Path object in .ftl is automatically - // converted to String. https://freemarker.apache.org/docs/app_faq.html#faq_nonstring_keys - ImmutableMap.Builder builder = ImmutableMap.builder(); - - for (ClassPathEntry entry : classPathResult.getClassPath()) { - List dependencyPaths = classPathResult.getDependencyPaths(entry); - - ImmutableList commonVersionlessArtifacts = - commonVersionlessArtifacts(dependencyPaths); - - if (dependencyPaths.size() > MINIMUM_NUMBER_DEPENDENCY_PATHS - && commonVersionlessArtifacts.size() > 1) { // The last paths elements are always same - builder.put( - entry.toString(), - summaryMessage( - dependencyPaths.size(), commonVersionlessArtifacts, dependencyPaths.get(0))); - } - } - return builder.build(); - } - - private static ImmutableList commonVersionlessArtifacts( - List dependencyPaths) { - ImmutableList initialVersionlessCoordinates = - dependencyPaths.get(0).getArtifactKeys(); - // LinkedHashSet remembers insertion order - LinkedHashSet versionlessCoordinatesIntersection = - Sets.newLinkedHashSet(initialVersionlessCoordinates); - for (DependencyPath dependencyPath : dependencyPaths) { - // List of versionless coordinates ("groupId:artifactId") - ImmutableList versionlessCoordinatesInPath = dependencyPath.getArtifactKeys(); - // intersection of elements in DependencyPaths - versionlessCoordinatesIntersection.retainAll(versionlessCoordinatesInPath); - } - - return ImmutableList.copyOf(versionlessCoordinatesIntersection); - } - - private static String summaryMessage( - int dependencyPathCount, List coordinates, DependencyPath examplePath) { - StringBuilder messageBuilder = new StringBuilder(); - messageBuilder.append("Dependency path '"); - messageBuilder.append(Joiner.on(" > ").join(coordinates)); - messageBuilder.append("' exists in all " + dependencyPathCount + " dependency paths. "); - messageBuilder.append("Example path: "); - messageBuilder.append(examplePath); - return messageBuilder.toString(); - } -} diff --git a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java b/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java deleted file mode 100644 index 8b4ecd75f7..0000000000 --- a/dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/PieChart.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import java.awt.geom.Point2D; - -public class PieChart { - - /** - * Calculate SVG arc end for a pie piece. Assumes the piece starts at the top of the circle. - * - * Do not forget: - * - * 1. SVG origin starts at top left. - * 2. x increases to the right and y increases **down**. - */ - static Point2D calculateEndPoint(double radius, double centerX, double centerY, double ratio) { - if (ratio > 1) { - ratio = 1.0; - } - - double radians = ratio * 2 * Math.PI; - - // Since we're starting at the top of the circle this is rotated 90 degrees - // from the normal coordinates. This is why we use sine for x and cosine for y. - double x = radius * (1 + Math.sin(radians)); - double y = radius * (1 - Math.cos(radians)); - return new Point2D.Double(x + centerX - radius, y + centerY - radius); - } - - // so I can avoid teaching FreeMarker how to wrap a java.awt.Point - public static double calculateEndPointX( - double radius, double centerX, double centerY, double ratio) { - return calculateEndPoint(radius, centerX, centerY, ratio).getX(); - } - - public static double calculateEndPointY( - double radius, double centerX, double centerY, double ratio) { - return calculateEndPoint(radius, centerX, centerY, ratio).getY(); - } -} diff --git a/dashboard/src/main/resources/css/dashboard.css b/dashboard/src/main/resources/css/dashboard.css deleted file mode 100644 index 9997f125cc..0000000000 --- a/dashboard/src/main/resources/css/dashboard.css +++ /dev/null @@ -1,147 +0,0 @@ -body { - font-family: "Poppins", sans-serif; - font-weight: 400; - line-height: 1.625; - margin-left: 2em; -} - -h1, -h2, -h3 { - color: #333333; - font-weight: 700; - margin: 0; - line-height: 1.2; - margin-top: 1ex; - margin-bottom: 1ex; -} - -h1 { - font-size: 3em; -} - -h2 { - font-size: 2.5em; -} - -h3 { - font-size: 2em; -} - -th, td { - padding: 5pt; -} - -pre { - line-height: normal; -} - -.pass { - background-color: lightgreen; - font-weight: bold; -} - -.fail { - background-color: pink; - font-weight: bold; -} - -.unavailable { - background-color: gray; - font-weight: bold; -} - -p.dependency-tree-node { - margin-top: 0; - margin-bottom: 0; -} - -.linkage-check-dependency-paths, .jar-linkage-report { - margin-left: 1em; -} - -p.jar-linkage-report-cause { - margin-bottom: 0; - margin-left: 2em; -} - -ul.jar-linkage-report-cause { - margin-top: 0; - margin-left: 3em; -} - -ul.jar-linkage-report-cause > li { - font: 1em 'Droid Sans Mono', monospace; -} - - /* ----- Statistic ----- */ -.statistics { - padding-top: 50px; -} - -.container { - min-height: 20ex; - display: flex; - flex-wrap: wrap; - align-items: flex-start; -} - -.statistic-item { - flex: 0 0 16em; - padding: 1.6em 2.5em; - position: relative; - min-height: 180px; - overflow: hidden; - margin-bottom: 40px; - border: none; - border-radius: 3px; - box-shadow: 0px 10px 20px 0px rgba(0, 0, 0, 0.03); - margin: 1em; - margin-left: unset; - margin-right: 2em; -} - -.statistic-item .desc { - font-size: 1.15em; - text-transform: uppercase; - font-weight: 300; - color: rgba(255, 255, 255, 0.6); -} - -.statistic-item h2 { - font-size: 2.3em; - font-weight: 300; - color: #fff; -} - -.statistic-item-green { - background: #00b26f; -} - -.statistic-item-orange { - background: #ff8300; -} - -.statistic-item-blue { - background: #00b5e9; -} - -.statistic-item-red { - background: #fa4251; -} - -.statistic-item-yellow { - background: #f1c40f; -} - -#piecharts th { - vertical-align: top; -} - -#piecharts td { - vertical-align: top; -} - -.pie { - "text-align: center" -} diff --git a/dashboard/src/main/resources/js/dashboard.js b/dashboard/src/main/resources/js/dashboard.js deleted file mode 100644 index 2a2128c45a..0000000000 --- a/dashboard/src/main/resources/js/dashboard.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Toggles the visibility of an HTML element below the button. - * @param button clicked button element - */ -function toggleNextSiblingVisibility(button) { - const nextSibling = button.parentElement.nextElementSibling; - const currentVisibility = nextSibling.style.display !== "none"; - const nextVisibility = !currentVisibility; - nextSibling.style.display = nextVisibility ? "" : "none"; - button.innerText = nextVisibility ? "▼" : "▶"; -} diff --git a/dashboard/src/main/resources/poms/demo.xml b/dashboard/src/main/resources/poms/demo.xml deleted file mode 100644 index 7167c0415a..0000000000 --- a/dashboard/src/main/resources/poms/demo.xml +++ /dev/null @@ -1,49 +0,0 @@ - - 4.0.0 - - com.google.cloud - demo - 1.0-SNAPSHOT - jar - - demo-pom - - - UTF-8 - 1.8 - - - - - ${dependencyGroupId} - ${dependencyArtifactId} - ${dependencyVersion} - test - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.0.0-M1 - - - enforce - - enforce - - - - - - - - - - - - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/artifact_details.ftl b/dashboard/src/main/resources/templates/artifact_details.ftl deleted file mode 100644 index 75acdcd51b..0000000000 --- a/dashboard/src/main/resources/templates/artifact_details.ftl +++ /dev/null @@ -1,55 +0,0 @@ - - - <#include "macros.ftl"> - - - Google Cloud Platform Java Open Source Dependency Dashboard Artifact Details Table - - - - -

Google Cloud Platform Java Dependency Dashboard Artifact Details

-

BOM: ${coordinates?html}

-

Dependency Details

- - - - - - - - - - <#list table as row> - <#assign report_url = row.getCoordinates()?replace(":", "_") + '.html' /> - - - <#-- The name key should match TEST_NAME_XXXX variables --> - <@testResult row=row name="Linkage Errors"/> - <@testResult row=row name="Upper Bounds"/> - <@testResult row=row name="Global Upper Bounds"/> - <@testResult row=row name="Dependency Convergence"/> - - -
Artifact - Linkage Check - Upper Bounds - Global Upper Bounds - Dependency Convergence
${row.getCoordinates()}
- -
- -

Linkage Errors

- - <#list linkageProblems as jar, problems> - <@formatJarLinkageReport jar problems classPathResult dependencyPathRootCauses/> - - -
-

Last generated at ${lastUpdated}

- - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/component.ftl b/dashboard/src/main/resources/templates/component.ftl deleted file mode 100644 index afdc26cc09..0000000000 --- a/dashboard/src/main/resources/templates/component.ftl +++ /dev/null @@ -1,156 +0,0 @@ - - - <#include "macros.ftl"> - <#assign groupId = artifact.getGroupId()> - <#assign artifactId = artifact.getArtifactId()> - <#assign version = artifact.getVersion()> - - - Google Cloud Platform Dependency Analysis Report for ${groupId}:${artifactId}:${version} - - - - - -

Dependency Analysis of ${groupId}:${artifactId}:${version}

-

BOM: ${coordinates?html}

-

Global Upper Bounds Check

- -

For each transitive dependency the library pulls in, the highest version - found anywhere in the union of the BOM's dependency trees is picked.

- - <#if globalUpperBoundFailures?size gt 0> -

Global Upper Bounds Fixes

- -

Suggested updates to bring this artifact into sync with the highest versions - of its dependencies used by any artifact in the BOM:

- -
    - <#list globalUpperBoundFailures as lower, upper> - <#if lower.getGroupId() == groupId && lower.getArtifactId() == artifactId - && lower.getVersion() == version ><#-- Not checking 'file' attribute of Artifact --> - <#-- When this is upgrading a BOM member --> -
  • - Upgrade ${lower} in the BOM to version "${upper.getVersion()}": - -

    Update the version of managed dependency element - ${groupId}:${artifactId} in the BOM:

    - -
    <dependencyManagement>
    -  <dependencies>
    -    ...
    -    <dependency>
    -      <groupId>${upper.getGroupId()}</groupId>
    -      <artifactId>${upper.getArtifactId()}</artifactId>
    -      <version>${upper.getVersion()}</version>
    -    </dependency>
    - -
  • - <#else > -
  • - Upgrade ${lower} to version "${upper.getVersion()}": - -

    Add this dependency element to the pom.xml for ${groupId}:${artifactId}:${version}: -

    - -
    <dependency>
    -<groupId>${upper.getGroupId()}</groupId>
    -<artifactId>${upper.getArtifactId()}</artifactId>
    -<version>${upper.getVersion()}</version>
    -</dependency>
    - -

    If the pom.xml for ${groupId}:${artifactId}:${version} already includes this - dependency, update the version of the existing dependency element. - Otherwise add a new dependency element to the - dependencyManagement section.

    -
  • - - -
- - <#else> -

- ${groupId}:${artifactId}:${version} selects the highest version of all dependencies. -

- - - -

Local Upper Bounds Check

- - -

For each transitive dependency the library pulls in, the highest version - found anywhere in the dependency tree is picked.

- - <#if upperBoundFailures?size gt 0> -

Upper Bounds Fixes

- -

Suggested updates to bring this artifact into sync with the highest versions - of each dependency found in its own dependency tree:

- -
    - <#list upperBoundFailures as lower, upper> -
  • Upgrade ${lower} to ${upper}: - -

    Add this dependency element to the pom.xml for ${groupId}:${artifactId}:${version}:

    - -
    <dependency>
    -  <groupId>${upper.getGroupId()}</groupId>
    -  <artifactId>${upper.getArtifactId()}</artifactId>
    -  <version>${upper.getVersion()}</version>
    -</dependency>
    - -
  • - -
- - <#else> -

- ${groupId}:${artifactId}:${version} selects the highest version of all dependencies. -

- - -

Dependency Convergence

- -

There is exactly one version of each dependency in the library's transitive dependency tree. - That is, two artifacts with the same group ID and artifact ID but different versions - do not appear in the tree. No dependency mediation is necessary.

- - <#if updates?size gt 0> -

Suggested Dependency Updates

- -

Caution: The algorithm for suggesting updates is imperfect. - They are not ordered by importance, and one change - may render another moot.

- -

Suggested updates to bring this artifact and its dependencies - into sync with the highest versions - of each dependency found in its own dependency tree:

- -
    - <#list updates as update> -
  • ${update}
  • - -
- <#else> -

${groupId}:${artifactId}:${version} Converges

- - - -

Linkage Check

- -

${totalLinkageErrorCount} linkage error(s)

- <#list linkageProblems as jar, problems> - <@formatJarLinkageReport jar problems classPathResult {} /> - - -

Dependencies

- - <#if dependencyGraph?? > - <@formatDependencyGraph dependencyGraph dependencyGraph.getRootPath() "" /> - <#else> -

Dependency information is unavailable

- -
-

Last generated at ${lastUpdated}

- - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/dependency_trees.ftl b/dashboard/src/main/resources/templates/dependency_trees.ftl deleted file mode 100644 index 6641141c2c..0000000000 --- a/dashboard/src/main/resources/templates/dependency_trees.ftl +++ /dev/null @@ -1,22 +0,0 @@ - - - <#include "macros.ftl"> - - - Google Cloud Platform Java Open Source Dependency Dashboard: Dependency Trees - - - - -

Dependency Tree of the Artifacts in ${coordinates}

-

BOM: ${coordinates?html}

- <#list dependencyGraphs as graph> - <#assign rootPath = graph.getRootPath() /> -

Dependency Tree of ${rootPath.getLeaf()?html}

- <@formatDependencyGraph graph rootPath "" /> - - -
-

Last generated at ${lastUpdated}

- - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/index.ftl b/dashboard/src/main/resources/templates/index.ftl deleted file mode 100644 index 36d5d1dade..0000000000 --- a/dashboard/src/main/resources/templates/index.ftl +++ /dev/null @@ -1,142 +0,0 @@ - - - <#include "macros.ftl"> - - - Google Cloud Platform Java Open Source Dependency Dashboard - - - - -

${coordinates} Dependency Status

-
- <#assign totalArtifacts = table?size> - -
-
-
-

${table?size}

- Total Artifacts Checked -
-
- <#assign linkageErrorCount = dashboardMain.countFailures(table, "Linkage Errors")> -

${linkageErrorCount}

- ${(linkageErrorCount == 1)?then("Has", "Have")} Linkage Errors -
-
- <#assign localUpperBoundsErrorCount = dashboardMain.countFailures(table, "Upper Bounds")> -

${dashboardMain.countFailures(table, "Upper Bounds")}

- ${(localUpperBoundsErrorCount == 1)?then("Has", "Have")} Upper Bounds Errors -
-
- <#assign globalUpperBoundsErrorCount = dashboardMain.countFailures(table, "Global Upper Bounds")> -

${dashboardMain.countFailures(table, "Global Upper Bounds")}

- ${(globalUpperBoundsErrorCount == 1)?then("Has", "Have")} Global Upper Bounds Errors -
-
- <#assign convergenceErrorCount = dashboardMain.countFailures(table, "Dependency Convergence")> -

${dashboardMain.countFailures(table, "Dependency Convergence")}

- ${(convergenceErrorCount == 1)?then("Fails", "Fail")} to Converge -
-
-
- - <#assign pieSize = 300 > -
- - - - - - - - - - - - - - - - - - - - - - - -
- Linkage Errors - Local Upper Bounds - Global Upper Bounds - Dependency Convergence
${linkageErrorCount} out of ${totalArtifacts} artifacts - ${plural(linkageErrorCount, "has", "have")} linkage errors. - ${localUpperBoundsErrorCount} out of ${totalArtifacts} artifacts - ${plural(localUpperBoundsErrorCount, "does not", "do not")} pick the - latest versions of all artifacts in their own dependency tree. - ${globalUpperBoundsErrorCount} out of ${totalArtifacts} artifacts - ${plural(globalUpperBoundsErrorCount, "does not", "do not")} select the - most recent version of all artifacts in the BOM.${convergenceErrorCount} out of ${totalArtifacts} artifacts - ${plural(convergenceErrorCount, "fails", "fail")} to converge. -
- <@pieChartSvg - description="${linkageErrorCount} out of ${totalArtifacts} artifacts have linkage - errors." - ratio=linkageErrorCount / totalArtifacts /> - - <#assign doesNot=plural(localUpperBoundsErrorCount, "does not", "do not")> - <@pieChartSvg - description="${localUpperBoundsErrorCount} out of ${totalArtifacts} artifacts - $doesNot pick the - latest versions of all artifacts in their own dependency tree." - ratio=localUpperBoundsErrorCount / totalArtifacts /> - - <@pieChartSvg - description="${globalUpperBoundsErrorCount} out of ${totalArtifacts} artifacts have - global upper bounds errors." - ratio=globalUpperBoundsErrorCount / totalArtifacts /> - - <#assign fails=plural(convergenceErrorCount, "fails", "fail")/> - <@pieChartSvg - description="${convergenceErrorCount} out of ${totalArtifacts} artifacts - ${fails} to converge." - ratio=convergenceErrorCount / totalArtifacts /> -
-
- -

- BOM source code -

- -

- Detailed Artifact Reports -

- -

- Pre 1.0 Artifacts -

- -

Recommended Versions

- -

These are the most recent versions of dependencies used by any of the covered artifacts.

- - - -

- Dependency Trees -

- -
- -

Last generated at ${lastUpdated}

- - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/macros.ftl b/dashboard/src/main/resources/templates/macros.ftl deleted file mode 100644 index 3d160cdcee..0000000000 --- a/dashboard/src/main/resources/templates/macros.ftl +++ /dev/null @@ -1,142 +0,0 @@ -<#function pluralize number singularNoun pluralNoun> - <#local plural = number gt 1 /> - <#return number + " " + plural?string(pluralNoun, singularNoun)> - -<#-- same as above but without the number --> -<#function plural number singularNoun pluralNoun> - <#local plural = number gt 1 /> - <#return plural?string(pluralNoun, singularNoun)> - - -<#macro formatJarLinkageReport classPathEntry linkageProblems classPathResult - dependencyPathRootCauses> - <#-- problemsToClasses: ImmutableMap> to get key and set of - values in Freemarker --> - <#assign problemsToClasses = linkageProblem.groupBySymbolProblem(linkageProblems) /> - <#assign symbolProblemCount = problemsToClasses?size /> - <#assign referenceCount = 0 /> - <#list problemsToClasses?values as classes> - <#assign referenceCount += classes?size /> - - -

${classPathEntry?html}

-

- ${pluralize(symbolProblemCount, "target class", "target classes")} - causing linkage errors referenced from - ${pluralize(referenceCount, "source class", "source classes")}. -

- <#list problemsToClasses as problem, sourceClasses> - <#if sourceClasses?size == 1> - <#assign sourceClass = sourceClasses[0] /> -

${problem?html}, referenced from ${sourceClass?html}

- <#else> -

${problem?html}, referenced from ${ - pluralize(sourceClasses?size, "class", "classes")?html} - -

- - - - - <#assign jarsInProblem = {} > - <#list linkageProblems as problem> - <#if (problem.getTargetClass())?? > - <#assign targetClassPathEntry = problem.getTargetClass().getClassPathEntry() /> - <#-- Freemarker's hash requires its keys to be strings. - https://freemarker.apache.org/docs/app_faq.html#faq_nonstring_keys --> - <#assign jarsInProblem = jarsInProblem + { targetClassPathEntry.toString() : targetClassPathEntry } > - - - <#list jarsInProblem?values as jarInProblem> - <@showDependencyPath dependencyPathRootCauses classPathResult jarInProblem /> - - <#if !jarsInProblem?values?seq_contains(classPathEntry) > - <@showDependencyPath dependencyPathRootCauses classPathResult classPathEntry /> - - - - -<#macro showDependencyPath dependencyPathRootCauses classPathResult classPathEntry> - <#assign dependencyPaths = classPathResult.getDependencyPaths(classPathEntry) /> - <#assign hasRootCause = dependencyPathRootCauses[classPathEntry]?? /> - <#assign hideDependencyPathsByDefault = (!hasRootCause) && (dependencyPaths?size > 5) /> -

- The following ${plural(dependencyPaths?size, "path contains", "paths contain")} ${classPathEntry?html}: - <#if hideDependencyPathsByDefault> - <#-- The dependency paths are not summarized --> - - -

- - <#if hasRootCause> -

${dependencyPathRootCauses[classPathEntry]?html} -

- <#else> - -
    - <#list dependencyPaths as dependencyPath > -
  • ${dependencyPath}
  • - -
- - - -<#macro formatDependencyGraph graph node parent> - <#if node == graph.getRootPath() > - <#assign label = 'root' /> - <#else> - <#assign label = 'parent: ' + parent.getLeaf() /> - -

${node.getLeaf()}

-
    - <#list graph.getChildren(node) as childNode> - <#if node != childNode> -
  • - <@formatDependencyGraph graph childNode node /> -
  • - - -
- - -<#macro testResult row name> - <#if row.getResult(name)?? ><#-- checking isNotNull() --> - <#-- When it's not null, the test ran. It's either PASS or FAIL --> - <#assign test_label = row.getResult(name)?then('PASS', 'FAIL')> - <#assign failure_count = row.getFailureCount(name)> - <#else> - <#-- Null means there's an exception and test couldn't run --> - <#assign test_label = "UNAVAILABLE"> - - - <#if row.getResult(name)?? > - <#assign page_anchor = name?replace(" ", "-")?lower_case /> - - <#if failure_count gt 0>${pluralize(failure_count, "FAILURE", "FAILURES")} - <#else>PASS - - - <#else>UNAVAILABLE - - - - -<#macro pieChartSvg description ratio> - <#assign largeArcFlag = (ratio gt 0.5)?string("1", "0")> - <#assign endPointX = pieChart.calculateEndPointX(100, 100, 100, ratio)> - <#assign endPointY = pieChart.calculateEndPointY(100, 100, 100, ratio)> - - ${description} - - - - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/unstable_artifacts.ftl b/dashboard/src/main/resources/templates/unstable_artifacts.ftl deleted file mode 100644 index e02e56204b..0000000000 --- a/dashboard/src/main/resources/templates/unstable_artifacts.ftl +++ /dev/null @@ -1,40 +0,0 @@ - - - <#include "macros.ftl"> - - - Google Cloud Platform Java Open Source Dependency Dashboard: Unstable Artifacts - - - - -

Dependency Status of ${coordinates}

-

BOM: ${coordinates?html}

-

Pre 1.0 Versions

- -

- These are dependencies found in the GCP orbit that have not yet reached 1.0. - No 1.0 or later library should depend on them. - If the libraries are stable, advance them to 1.0. - Otherwise replace the dependency with something else. -

- - <#assign unstableCount = 0> -
    - <#list latestArtifacts as artifact, version> - <#if version[0] == '0'> - <#assign unstableCount++> -
  • ${artifact}:${version}
  • - - -
- - <#if unstableCount == 0> -

All versions are 1.0 or later.

- - - -
-

Last generated at ${lastUpdated}

- - \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/version_index.ftl b/dashboard/src/main/resources/templates/version_index.ftl deleted file mode 100644 index 602bdf633a..0000000000 --- a/dashboard/src/main/resources/templates/version_index.ftl +++ /dev/null @@ -1,20 +0,0 @@ - - - - - ${groupId}:${artifactId} - - - -

${groupId}:${artifactId}

- -
    - <#list versions as version> -
  • - ${version} -
  • - -
- - - diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/ArtifactResultsTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/ArtifactResultsTest.java deleted file mode 100644 index bcfab9e49c..0000000000 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/ArtifactResultsTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import org.eclipse.aether.artifact.DefaultArtifact; -import org.junit.Assert; -import org.junit.Test; - -public class ArtifactResultsTest { - - private ArtifactResults results = - new ArtifactResults(new DefaultArtifact("com.google.guava:guava:23.0")); - - @Test - public void testAddResult() { - results.addResult("foo", 0); - results.addResult("bar", 10); - Assert.assertTrue(results.getResult("foo")); - Assert.assertFalse(results.getResult("bar")); - Assert.assertNull(results.getResult("baz")); - } - - @Test - public void testGetFailureCount() { - results.addResult("foo", 0); - results.addResult("bar", 10); - Assert.assertEquals(0, results.getFailureCount("foo")); - Assert.assertEquals(10, results.getFailureCount("bar")); - Assert.assertEquals(0, results.getFailureCount("baz")); - } - - @Test - public void testGetCoordinates() { - Assert.assertEquals("com.google.guava:guava:23.0", results.getCoordinates()); - } - -} diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardArgumentsTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardArgumentsTest.java deleted file mode 100644 index 62204552b6..0000000000 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardArgumentsTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import com.google.cloud.tools.opensource.dashboard.DashboardArguments.DependencyMediationAlgorithm; -import com.google.common.truth.Truth; -import java.nio.file.Paths; -import org.apache.commons.cli.AlreadySelectedException; -import org.apache.commons.cli.MissingOptionException; -import org.apache.commons.cli.ParseException; -import org.junit.Assert; -import org.junit.Test; - -public class DashboardArgumentsTest { - - @Test - public void testParseArgument_file() throws ParseException { - DashboardArguments dashboardArguments = DashboardArguments.readCommandLine("-f", "../pom.xml"); - - assertTrue(dashboardArguments.hasFile()); - assertEquals(dashboardArguments.getDependencyMediation(), DependencyMediationAlgorithm.MAVEN); - assertEquals(Paths.get("../pom.xml").toAbsolutePath(), dashboardArguments.getBomFile()); - assertNull(dashboardArguments.getBomCoordinates()); - } - - @Test - public void testParseArgument_coordinates() throws ParseException { - DashboardArguments dashboardArguments = - DashboardArguments.readCommandLine("-c", "com.google.cloud:libraries-bom:1.0.0"); - assertFalse(dashboardArguments.hasFile()); - assertEquals( - "com.google.cloud:libraries-bom:1.0.0", dashboardArguments.getBomCoordinates()); - } - - @Test - public void testParseArgument_coordinatesWithLeadingSpace() throws ParseException { - // Maven exec plugin adds a leading space when arguments are passed as - // -Dexec.arguments="-c com.google.cloud:libraries-bom:$VERSION" - DashboardArguments dashboardArguments = - DashboardArguments.readCommandLine("-c", " com.google.cloud:libraries-bom:1.0.0"); - assertEquals( - "com.google.cloud:libraries-bom:1.0.0", dashboardArguments.getBomCoordinates()); - assertNull(dashboardArguments.getBomFile()); - } - - @Test - public void testParseArgument_missingInput() throws ParseException { - try { - DashboardArguments.readCommandLine(); - Assert.fail("The argument should validate missing input"); - } catch (MissingOptionException ex) { - // pass - } - } - - @Test - public void testParseArgument_duplicateOptions_coordinates_file() throws ParseException { - try { - DashboardArguments.readCommandLine( - "-c", "com.google.cloud:libraries-bom:1.0.0", "-f", "../pom.xml"); - Assert.fail("The argument should validate duplicate input"); - } catch (AlreadySelectedException ex) { - // pass - } - } - - @Test - public void testParseArgument_duplicateOptions_coordinates_allVersions() throws ParseException { - try { - DashboardArguments.readCommandLine( - "-c", "com.google.cloud:libraries-bom:1.0.0", "-a", "com.google.cloud:libraries-bom"); - Assert.fail("The argument should validate duplicate input"); - } catch (AlreadySelectedException ex) { - // pass - } - } - - @Test - public void testParseArgument_dependencyMediation_valid() throws ParseException { - DashboardArguments dashboardArguments = - DashboardArguments.readCommandLine("-f", "../pom.xml", "-m", "gradle"); - - assertEquals(dashboardArguments.getDependencyMediation(), DependencyMediationAlgorithm.GRADLE); - } - - @Test - public void testParseArgument_dependencyMediation_invalid() { - try { - DashboardArguments dashboardArguments = - DashboardArguments.readCommandLine("-f", "../pom.xml", "-m", "ant"); - Assert.fail("The argument should validate invalid dependency mediation value"); - } catch (ParseException ex) { - // pass - Truth.assertThat(ex.getMessage()).isEqualTo("Valid values for '-m' are [maven, gradle]"); - } - } -} diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java deleted file mode 100644 index ffeba49324..0000000000 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardTest.java +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; - -import com.google.cloud.tools.opensource.dashboard.DashboardArguments.DependencyMediationAlgorithm; -import com.google.cloud.tools.opensource.dependencies.Artifacts; -import com.google.cloud.tools.opensource.dependencies.Bom; -import com.google.common.base.CharMatcher; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Streams; -import com.google.common.io.MoreFiles; -import com.google.common.io.RecursiveDeleteOption; -import com.google.common.truth.Correspondence; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import nu.xom.Builder; -import nu.xom.Document; -import nu.xom.Element; -import nu.xom.Node; -import nu.xom.Nodes; -import nu.xom.ParsingException; -import nu.xom.XPathContext; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.resolution.ArtifactDescriptorException; -import org.hamcrest.core.StringStartsWith; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Assume; -import org.junit.BeforeClass; -import org.junit.Test; - -public class DashboardTest { - - private static final Correspondence NODE_VALUES = - Correspondence.transforming(node -> trimAndCollapseWhiteSpace(node.getValue()), "has value"); - - private static String trimAndCollapseWhiteSpace(String value) { - return CharMatcher.whitespace().trimAndCollapseFrom(value, ' '); - } - - private static Path outputDirectory; - private static Builder builder = new Builder(); - private static Document dashboard; - private static Document details; - private static Document unstable; - - @BeforeClass - public static void setUp() throws IOException, ParsingException { - // Creates "index.html" and artifact reports in outputDirectory - try { - outputDirectory = - DashboardMain.generate( - "com.google.cloud:libraries-bom:1.0.0", DependencyMediationAlgorithm.MAVEN); - } catch (Throwable t) { - t.printStackTrace(); - Assert.fail("Could not generate dashboard"); - } - - dashboard = parseOutputFile("index.html"); - details = parseOutputFile("artifact_details.html"); - unstable = parseOutputFile("unstable_artifacts.html"); - } - - @AfterClass - public static void cleanUp() { - try { - // Mac's APFS fails with InsecureRecursiveDeleteException without ALLOW_INSECURE. - // Still safe as this test does not use symbolic links - if (outputDirectory != null) { - MoreFiles.deleteRecursively(outputDirectory, RecursiveDeleteOption.ALLOW_INSECURE); - } - } catch (IOException ex) { - // no big deal - } - } - - @Test // https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/617 - public void testPlural() { - Nodes statisticItems = dashboard.query("//section[@class='statistics']/div/div"); - for (Node node : statisticItems) { - Node h2 = node.query("h2").get(0); - Node span = node.query("span").get(0); - int errorCount = Integer.parseInt(h2.getValue()); - if (errorCount == 1) { - String message = span.getValue(); - Assert.assertEquals("Has Linkage Errors", message); - } - } - - Assert.assertFalse(dashboard.toXML().contains("1 HAVE")); - } - - @Test - public void testHeader() { - Nodes h1 = dashboard.query("//h1"); - assertThat(h1).hasSize(1); - Assert.assertEquals("com.google.cloud:libraries-bom:1.0.0 Dependency Status", - h1.get(0).getValue()); - } - - @Test - public void testSvg() { - XPathContext context = new XPathContext("svg", "http://www.w3.org/2000/svg"); - Nodes svg = dashboard.query("//svg:svg", context); - assertThat(svg).hasSize(4); - } - - @Test - public void testCss() { - Path dashboardCss = outputDirectory.resolve("dashboard.css"); - Assert.assertTrue(Files.exists(dashboardCss)); - Assert.assertTrue(Files.isRegularFile(dashboardCss)); - } - - private static Document parseOutputFile(String fileName) - throws IOException, ParsingException { - Path html = outputDirectory.resolve(fileName); - Assert.assertTrue("Could not find a regular file for " + fileName, - Files.isRegularFile(html)); - Assert.assertTrue("The file is not readable: " + fileName, Files.isReadable(html)); - - try (InputStream source = Files.newInputStream(html)) { - return builder.build(source); - } - } - - @Test - public void testArtifactDetails() throws IOException, ArtifactDescriptorException { - List artifacts = Bom.readBom("com.google.cloud:libraries-bom:1.0.0") - .getManagedDependencies(); - Assert.assertTrue("Not enough artifacts found", artifacts.size() > 1); - - Assert.assertEquals("en-US", dashboard.getRootElement().getAttribute("lang").getValue()); - - Nodes tr = details.query("//tr"); - Assert.assertEquals(artifacts.size() + 1, tr.size()); // header row adds 1 - for (int i = 1; i < tr.size(); i++) { // start at 1 to skip header row - Nodes td = tr.get(i).query("td"); - Assert.assertEquals(Artifacts.toCoordinates(artifacts.get(i - 1)), td.get(0).getValue()); - for (int j = 1; j < 5; ++j) { // start at 1 to skip the leftmost artifact coordinates column - assertValidCellValue((Element) td.get(j)); - } - } - Nodes href = details.query("//tr/td[@class='artifact-name']/a/@href"); - for (int i = 0; i < href.size(); i++) { - String fileName = href.get(i).getValue(); - Artifact artifact = artifacts.get(i); - Assert.assertEquals( - Artifacts.toCoordinates(artifact).replace(':', '_') + ".html", - URLDecoder.decode(fileName, "UTF-8")); - Path componentReport = outputDirectory.resolve(fileName); - Assert.assertTrue(fileName + " is missing", Files.isRegularFile(componentReport)); - try { - Document report = builder.build(componentReport.toFile()); - Assert.assertEquals("en-US", report.getRootElement().getAttribute("lang").getValue()); - } catch (ParsingException ex) { - byte[] data = Files.readAllBytes(componentReport); - String message = "Could not parse " + componentReport + " at line " + - ex.getLineNumber() + ", column " + ex.getColumnNumber() + "\r\n"; - message += ex.getMessage() + "\r\n"; - message += new String(data, StandardCharsets.UTF_8); - Assert.fail(message); - } - } - } - - private static void assertValidCellValue(Element cellElement) { - String cellValue = cellElement.getValue().replaceAll("\\s", ""); - assertThat(cellValue).containsMatch("PASS|\\d+FAILURES?"); - assertWithMessage("It should not use plural for 1 item") - .that(cellValue) - .doesNotContainMatch("1 FAILURES"); - assertThat(cellElement.getAttributeValue("class")).isAnyOf("pass", "fail"); - } - - @Test - public void testDashboard_statisticBox() { - Nodes artifactCount = - dashboard.query("//div[@class='statistic-item statistic-item-green']/h2"); - Assert.assertTrue(artifactCount.size() > 0); - for (Node artifactCountElement : artifactCount) { - String value = artifactCountElement.getValue().trim(); - Assert.assertTrue(value, Integer.parseInt(value) > 0); - } - } - - @Test - public void testLinkageReports() { - Nodes dependencyPaths = details.query("//p[@class='linkage-check-dependency-paths']"); - Node dependencyPathMessageOnProblem = dependencyPaths.get(dependencyPaths.size() - 1); - Assert.assertEquals( - "The following paths contain com.google.guava:guava-jdk5:13.0: ▶", - trimAndCollapseWhiteSpace(dependencyPathMessageOnProblem.getValue())); - - Node dependencyPathMessageOnSource = dependencyPaths.get(dependencyPaths.size() - 2); - Assert.assertEquals( - "The following paths contain com.google.guava:guava:27.1-android:", - trimAndCollapseWhiteSpace(dependencyPathMessageOnSource.getValue())); - } - - @Test - public void testDashboard_recommendedCoordinates() { - Nodes recommendedListItem = dashboard.query("//ul[@id='recommended']/li"); - Assert.assertTrue(recommendedListItem.size() > 100); - - // fails if these are not valid Maven coordinates - for (Node node : recommendedListItem) { - new DefaultArtifact(node.getValue()); - } - - ImmutableList coordinateList = - Streams.stream(recommendedListItem).map(Node::getValue).collect(toImmutableList()); - - ArrayList sorted = new ArrayList<>(coordinateList); - Comparator comparator = new SortWithoutVersion(); - Collections.sort(sorted, comparator); - - for (int i = 0; i < sorted.size(); i++) { - Assert.assertEquals( - "Coordinates are not sorted: ", sorted.get(i), coordinateList.get(i)); - } - } - - private static class SortWithoutVersion implements Comparator { - @Override - public int compare(String s1, String s2) { - s1 = s1.substring(0, s1.lastIndexOf(':')); - s2 = s2.substring(0, s2.lastIndexOf(':')); - return s1.compareTo(s2); - } - } - - @Test - public void testDashboard_unstableDependencies() { - // Pre 1.0 version section - Nodes li = unstable.query("//ul[@id='unstable']/li"); - Assert.assertTrue(li.size() > 1); - for (int i = 0; i < li.size(); i++) { - String value = li.get(i).getValue(); - Assert.assertTrue(value, value.contains(":0")); - } - - // This element appears only when every dependency becomes stable - Nodes stable = dashboard.query("//p[@id='stable-notice']"); - assertThat(stable).isEmpty(); - } - - @Test - public void testDashboard_lastUpdatedField() { - Nodes updated = dashboard.query("//p[@id='updated']"); - Assert.assertEquals( - "Could not find updated field: " + dashboard.toXML(), 1, updated.size()); - } - - @Test - public void testComponent_linkageCheckResult_java8() throws IOException, ParsingException { - Assume.assumeThat(System.getProperty("java.version"), StringStartsWith.startsWith("1.8.")); - // The version used in libraries-bom 1.0.0 - Document document = parseOutputFile( - "com.google.http-client_google-http-client-appengine_1.29.1.html"); - Nodes reports = document.query("//p[@class='jar-linkage-report']"); - assertThat(reports).hasSize(1); - assertThat(trimAndCollapseWhiteSpace(reports.get(0).getValue())) - .isEqualTo("100 target classes causing linkage errors referenced from 540 source classes."); - - - Nodes artifactDetailsReports = details.query("//p[@class='jar-linkage-report']"); - // appengine-api-sdk, shown as first item in linkage errors, has these errors - assertThat(trimAndCollapseWhiteSpace(artifactDetailsReports.get(0).getValue())) - .isEqualTo("4 target classes causing linkage errors referenced from 4 source classes."); - - Nodes causes = document.query("//p[@class='jar-linkage-report-cause']"); - assertWithMessage( - "google-http-client-appengine should show linkage errors for RpcStubDescriptor") - .that(causes) - .comparingElementsUsing(NODE_VALUES) - .contains( - "Class com.google.net.rpc3.client.RpcStubDescriptor is not found," - + " referenced from 21 classes ▶"); // '▶' is the toggle button - } - - @Test - public void testComponent_linkageCheckResult_java11() throws IOException, ParsingException { - String javaVersion = System.getProperty("java.version"); - // javaMajorVersion is 1 when we use Java 8. Still good indicator to ensure Java 11 or higher. - int javaMajorVersion = Integer.parseInt(javaVersion.split("\\.")[0]); - Assume.assumeTrue(javaMajorVersion >= 11); - - Nodes artifactDetailsReports = details.query("//p[@class='jar-linkage-report']"); - // appengine-api-sdk, shown as first item in linkage errors, has these errors - assertThat(trimAndCollapseWhiteSpace(artifactDetailsReports.get(0).getValue())) - .isEqualTo("5 target classes causing linkage errors referenced from 5 source classes."); - - // The version used in libraries-bom 1.0.0. The google-http-client-appengine has been known to - // have linkage errors in its dependency appengine-api-1.0-sdk:1.9.71. - Document document = - parseOutputFile("com.google.http-client_google-http-client-appengine_1.29.1.html"); - Nodes reports = document.query("//p[@class='jar-linkage-report']"); - assertThat(reports).hasSize(1); - - // This number of linkage errors differs between Java 8 and Java 11 for the javax.activation - // package removal (JEP 320: Remove the Java EE and CORBA Modules). For the detail, see - // https://github.com/GoogleCloudPlatform/cloud-opensource-java/issues/1849. - assertThat(trimAndCollapseWhiteSpace(reports.get(0).getValue())) - .isEqualTo("105 target classes causing linkage errors referenced from 562 source classes."); - - Nodes causes = document.query("//p[@class='jar-linkage-report-cause']"); - assertWithMessage( - "google-http-client-appengine should show linkage errors for RpcStubDescriptor") - .that(causes) - .comparingElementsUsing(NODE_VALUES) - .contains( - "Class com.google.net.rpc3.client.RpcStubDescriptor is not found," - + " referenced from 21 classes ▶"); // '▶' is the toggle button - } - - @Test - public void testComponent_success() throws IOException, ParsingException { - Document document = parseOutputFile( - "com.google.api.grpc_proto-google-common-protos_1.14.0.html"); - Nodes greens = document.query("//h3[@style='color: green']"); - Assert.assertTrue(greens.size() >= 2); - Nodes presDependencyMediation = - document.query("//pre[@class='suggested-dependency-mediation']"); - // There's a pre tag for dependency - assertThat(presDependencyMediation).hasSize(1); - - Nodes presDependencyTree = document.query("//p[@class='dependency-tree-node']"); - Assert.assertTrue( - "Dependency Tree should be shown in dashboard", presDependencyTree.size() > 0); - } - - @Test - public void testComponent_failure() throws IOException, ParsingException { - Document document = parseOutputFile( - "com.google.api.grpc_grpc-google-common-protos_1.14.0.html"); - - // com.google.api.grpc:grpc-google-common-protos:1.14.0 has no green section - Nodes greens = document.query("//h3[@style='color: green']"); - assertThat(greens).isEmpty(); - - // "Global Upper Bounds Fixes", "Upper Bounds Fixes", and "Suggested Dependency Updates" are red - Nodes reds = document.query("//h3[@style='color: red']"); - assertThat(reds).hasSize(3); - Nodes presDependencyMediation = - document.query("//pre[@class='suggested-dependency-mediation']"); - Assert.assertTrue( - "For failed component, suggested dependency should be shown", - presDependencyMediation.size() >= 1); - Nodes dependencyTree = document.query("//p[@class='dependency-tree-node']"); - Assert.assertTrue( - "Dependency Tree should be shown in dashboard even when FAILED", - dependencyTree.size() > 0); - } - - @Test - public void testLinkageErrorsInProvidedDependency() throws IOException, ParsingException { - // google-http-client-appengine has provided dependency to (problematic) appengine-api-1.0-sdk - Document document = parseOutputFile( - "com.google.http-client_google-http-client-appengine_1.29.1.html"); - Nodes linkageCheckMessages = document.query("//ul[@class='jar-linkage-report-cause']/li"); - assertThat(linkageCheckMessages.size()).isGreaterThan(0); - assertThat(linkageCheckMessages.get(0).getValue()) - .contains("com.google.appengine.api.appidentity.AppIdentityServicePb"); - } - - @Test - public void testLinkageErrors_ensureNoDuplicateSymbols() throws IOException, ParsingException { - Document document = - parseOutputFile("com.google.http-client_google-http-client-appengine_1.29.1.html"); - Nodes linkageCheckMessages = document.query("//p[@class='jar-linkage-report-cause']"); - assertThat(linkageCheckMessages.size()).isGreaterThan(0); - - List messages = new ArrayList<>(); - for (int i = 0; i < linkageCheckMessages.size(); ++i) { - messages.add(linkageCheckMessages.get(i).getValue()); - } - - // When uniqueness of SymbolProblem and Symbol classes are incorrect, dashboard has duplicates. - assertThat(messages).containsNoDuplicates(); - } - - @Test - public void testZeroLinkageErrorShowsZero() throws IOException, ParsingException { - // grpc-auth does not have a linkage error, and it should show zero in the section - Document document = parseOutputFile("io.grpc_grpc-auth_1.20.0.html"); - Nodes linkageErrorsTotal = document.query("//p[@id='linkage-errors-total']"); - assertThat(linkageErrorsTotal).hasSize(1); - assertThat(linkageErrorsTotal.get(0).getValue()).contains("0 linkage error(s)"); - } - - @Test - public void testGlobalUpperBoundUpgradeMessage() throws IOException, ParsingException { - // Case 1: BOM needs to be updated - Document document = parseOutputFile("com.google.protobuf_protobuf-java-util_3.6.1.html"); - Nodes globalUpperBoundBomUpgradeNodes = - document.query("//li[@class='global-upper-bound-bom-upgrade']"); - assertThat(globalUpperBoundBomUpgradeNodes).hasSize(1); - String bomUpgradeMessage = globalUpperBoundBomUpgradeNodes.get(0).getValue(); - assertThat(bomUpgradeMessage) - .contains( - "Upgrade com.google.protobuf:protobuf-java-util:jar:3.6.1 in the BOM to version" - + " \"3.7.1\""); - - // Case 2: Dependency needs to be updated - Nodes globalUpperBoundDependencyUpgradeNodes = - document.query("//li[@class='global-upper-bound-dependency-upgrade']"); - - // The artifact report should contain the following 6 global upper bound dependency upgrades: - // Upgrade com.google.guava:guava:jar:19.0 to version "27.1-android" - // Upgrade com.google.protobuf:protobuf-java:jar:3.6.1 to version "3.7.1" - assertThat(globalUpperBoundDependencyUpgradeNodes.size()).isEqualTo(2); - String dependencyUpgradeMessage = globalUpperBoundDependencyUpgradeNodes.get(0).getValue(); - assertThat(dependencyUpgradeMessage) - .contains("Upgrade com.google.guava:guava:jar:19.0 to version \"27.1-android\""); - } - - @Test - public void testBomCoordinatesInComponent() throws IOException, ParsingException { - Document document = parseOutputFile("com.google.protobuf_protobuf-java-util_3.6.1.html"); - Nodes bomCoordinatesNodes = document.query("//p[@class='bom-coordinates']"); - assertThat(bomCoordinatesNodes).hasSize(1); - Assert.assertEquals( - "BOM: com.google.cloud:libraries-bom:1.0.0", bomCoordinatesNodes.get(0).getValue()); - } - - @Test - public void testBomCoordinatesInArtifactDetails() throws IOException, ParsingException { - Document document = parseOutputFile("artifact_details.html"); - Nodes bomCoordinatesNodes = document.query("//p[@class='bom-coordinates']"); - assertThat(bomCoordinatesNodes).hasSize(1); - Assert.assertEquals( - "BOM: com.google.cloud:libraries-bom:1.0.0", bomCoordinatesNodes.get(0).getValue()); - } - - @Test - public void testBomCoordinatesInUnstableArtifacts() throws IOException, ParsingException { - Document document = parseOutputFile("unstable_artifacts.html"); - Nodes bomCoordinatesNodes = document.query("//p[@class='bom-coordinates']"); - assertThat(bomCoordinatesNodes).hasSize(1); - Assert.assertEquals( - "BOM: com.google.cloud:libraries-bom:1.0.0", bomCoordinatesNodes.get(0).getValue()); - } - - @Test - public void testDependencyTrees() throws IOException, ParsingException { - Document document = parseOutputFile("dependency_trees.html"); - Nodes dependencyTreeParagraph = document.query("//p[@class='dependency-tree-node']"); - - // characterization test - assertThat(dependencyTreeParagraph).hasSize(39649); - Assert.assertEquals( - "com.google.protobuf:protobuf-java:jar:3.6.1", dependencyTreeParagraph.get(0).getValue()); - } - - @Test - public void testOutputDirectory() { - Assert.assertTrue( - "The dashboard should be created at target/com.google.cloud/libraries-bom/1.0.0", - outputDirectory.endsWith( - Paths.get("target", "com.google.cloud", "libraries-bom", "1.0.0"))); - } -} diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardUnavailableArtifactTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardUnavailableArtifactTest.java deleted file mode 100644 index 1d8f8998bf..0000000000 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/DashboardUnavailableArtifactTest.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2018 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import com.google.cloud.tools.opensource.classpath.AnnotatedClassPath; -import com.google.cloud.tools.opensource.classpath.ClassPathResult; -import com.google.cloud.tools.opensource.dependencies.Artifacts; -import com.google.cloud.tools.opensource.dependencies.Bom; -import com.google.cloud.tools.opensource.dependencies.DependencyGraph; -import com.google.cloud.tools.opensource.dependencies.DependencyGraphBuilder; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.io.MoreFiles; -import com.google.common.io.RecursiveDeleteOption; -import com.google.common.truth.Truth; -import freemarker.template.Configuration; -import freemarker.template.TemplateException; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import nu.xom.Builder; -import nu.xom.Document; -import nu.xom.Element; -import nu.xom.Nodes; -import nu.xom.ParsingException; -import org.eclipse.aether.RepositoryException; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.graph.Dependency; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -public class DashboardUnavailableArtifactTest { - - private static Path outputDirectory; - private Bom bom = new Bom("test:test:1.2.4", null); - private Builder builder = new Builder(); - - @BeforeClass - public static void setUp() throws IOException { - outputDirectory = Files.createDirectories(Paths.get("target", "dashboard")); - } - - @AfterClass - public static void cleanUp() throws IOException { - // Mac's APFS fails with InsecureRecursiveDeleteException without ALLOW_INSECURE. - // Still safe as this test does not use symbolic links - MoreFiles.deleteRecursively(outputDirectory, RecursiveDeleteOption.ALLOW_INSECURE); - } - - @Test - public void testDashboardForRepositoryException() throws TemplateException { - Configuration configuration = DashboardMain.configureFreemarker(); - Artifact validArtifact = new DefaultArtifact("io.grpc:grpc-context:1.15.0"); - Artifact nonExistentArtifact = new DefaultArtifact("io.grpc:nonexistent:jar:1.15.0"); - DependencyGraphBuilder graphBuilder = new DependencyGraphBuilder(); - Map map = new LinkedHashMap<>(); - DependencyGraph graph1 = - graphBuilder.buildMavenDependencyGraph(new Dependency(validArtifact, "compile")); - DependencyGraph graph2 = - graphBuilder.buildMavenDependencyGraph(new Dependency(nonExistentArtifact, "compile")); - map.put(validArtifact, new ArtifactInfo(graph1, graph2)); - map.put(nonExistentArtifact, new ArtifactInfo(new RepositoryException("foo"))); - - ArtifactCache cache = new ArtifactCache(); - cache.setInfoMap(map); - List artifactResults = - DashboardMain.generateReports( - configuration, - outputDirectory, - cache, - ImmutableMap.of(), - new ClassPathResult(new AnnotatedClassPath(), ImmutableList.of()), - bom); - - Assert.assertEquals( - "The length of the ArtifactResults should match the length of artifacts", - 2, - artifactResults.size()); - Assert.assertEquals( - "The first artifact result should be valid", - true, - artifactResults.get(0).getResult(DashboardMain.TEST_NAME_UPPER_BOUND)); - ArtifactResults errorArtifactResult = artifactResults.get(1); - Assert.assertNull( - "The second artifact result should be null", - errorArtifactResult.getResult(DashboardMain.TEST_NAME_UPPER_BOUND)); - Assert.assertEquals( - "The error artifact result should contain error message", - "foo", - errorArtifactResult.getExceptionMessage()); - } - - @Test - public void testDashboardWithRepositoryException() - throws IOException, TemplateException, ParsingException { - Configuration configuration = DashboardMain.configureFreemarker(); - - Artifact validArtifact = new DefaultArtifact("io.grpc:grpc-context:1.15.0"); - ArtifactResults validArtifactResult = new ArtifactResults(validArtifact); - validArtifactResult.addResult(DashboardMain.TEST_NAME_UPPER_BOUND, 0); - validArtifactResult.addResult(DashboardMain.TEST_NAME_DEPENDENCY_CONVERGENCE, 0); - validArtifactResult.addResult(DashboardMain.TEST_NAME_GLOBAL_UPPER_BOUND, 0); - - Artifact invalidArtifact = new DefaultArtifact("io.grpc:nonexistent:jar:1.15.0"); - ArtifactResults errorArtifactResult = new ArtifactResults(invalidArtifact); - errorArtifactResult.setExceptionMessage( - "Could not find artifact io.grpc:nonexistent:jar:1.15.0 in central" - + " (https://repo1.maven.org/maven2/)"); - - List table = new ArrayList<>(); - table.add(validArtifactResult); - table.add(errorArtifactResult); - - DashboardMain.generateDashboard( - configuration, - outputDirectory, - table, - ImmutableList.of(), - ImmutableMap.of(), - new ClassPathResult(new AnnotatedClassPath(), ImmutableList.of()), - bom); - - Path generatedHtml = outputDirectory.resolve("artifact_details.html"); - Assert.assertTrue(Files.isRegularFile(generatedHtml)); - Document document = builder.build(generatedHtml.toFile()); - Assert.assertEquals("en-US", document.getRootElement().getAttribute("lang").getValue()); - Nodes tr = document.query("//tr"); - - Assert.assertEquals( - "The size of rows in table should match the number of artifacts + 1 (header)", - tr.size(),table.size() + 1); - - Nodes tdForValidArtifact = tr.get(1).query("td"); - Assert.assertEquals( - Artifacts.toCoordinates(validArtifact), tdForValidArtifact.get(0).getValue()); - Element firstResult = (Element) (tdForValidArtifact.get(2)); - Truth.assertThat(firstResult.getValue().trim()).isEqualTo("PASS"); - Truth.assertThat(firstResult.getAttributeValue("class")).isEqualTo("pass"); - - Nodes tdForErrorArtifact = tr.get(2).query("td"); - Assert.assertEquals( - Artifacts.toCoordinates(invalidArtifact), tdForErrorArtifact.get(0).getValue()); - Element secondResult = (Element) (tdForErrorArtifact.get(2)); - Truth.assertThat(secondResult.getValue().trim()).isEqualTo("UNAVAILABLE"); - Truth.assertThat(secondResult.getAttributeValue("class")).isEqualTo("unavailable"); - } -} diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/FreemarkerTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/FreemarkerTest.java deleted file mode 100644 index a499fa0552..0000000000 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/FreemarkerTest.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import com.google.cloud.tools.opensource.classpath.AnnotatedClassPath; -import com.google.cloud.tools.opensource.classpath.ClassFile; -import com.google.cloud.tools.opensource.classpath.ClassNotFoundProblem; -import com.google.cloud.tools.opensource.classpath.ClassPathEntry; -import com.google.cloud.tools.opensource.classpath.ClassPathResult; -import com.google.cloud.tools.opensource.classpath.ClassSymbol; -import com.google.cloud.tools.opensource.classpath.LinkageProblem; -import com.google.cloud.tools.opensource.dependencies.Bom; -import com.google.cloud.tools.opensource.dependencies.DependencyGraph; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.io.MoreFiles; -import com.google.common.io.RecursiveDeleteOption; -import com.google.common.truth.Truth; -import freemarker.template.Configuration; -import freemarker.template.TemplateException; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import nu.xom.Builder; -import nu.xom.Document; -import nu.xom.Node; -import nu.xom.Nodes; -import nu.xom.ParsingException; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -/** - * Unit tests for FreeMarker logic without reading any JAR files. - */ -public class FreemarkerTest { - - private static Path outputDirectory; - private static ImmutableMap> symbolProblemTable; - - private Builder builder = new Builder(); - - @BeforeClass - public static void setUpDirectory() throws IOException { - outputDirectory = Files.createDirectories(Paths.get("target", "dashboard")); - } - - @Before - public void setUp() { - Artifact artifact = new DefaultArtifact("com.google:foo:1.0.0") - .setFile(new File("foo/bar-1.2.3.jar")); - ClassPathEntry entry = new ClassPathEntry(artifact); - ImmutableSet dummyProblems = - ImmutableSet.of( - new ClassNotFoundProblem( - new ClassFile(entry, "abc.def.G"), new ClassSymbol("com.foo.Bar"))); - symbolProblemTable = ImmutableMap.of(entry, dummyProblems); - } - - @AfterClass - public static void cleanUp() throws IOException { - // Mac's APFS fails with InsecureRecursiveDeleteException without ALLOW_INSECURE. - // Still safe as this test does not use symbolic links - MoreFiles.deleteRecursively(outputDirectory, RecursiveDeleteOption.ALLOW_INSECURE); - } - - @Test - public void testCountFailures() throws IOException, TemplateException, ParsingException { - Configuration configuration = DashboardMain.configureFreemarker(); - - Artifact artifact1 = new DefaultArtifact("io.grpc:grpc-context:1.15.0"); - ArtifactResults results1 = new ArtifactResults(artifact1); - results1.addResult("Linkage Errors", 56); - - Artifact artifact2 = new DefaultArtifact("grpc:grpc:1.15.0"); - ArtifactResults results2 = new ArtifactResults(artifact2); - results2.addResult("Linkage Errors", 0); - - List table = ImmutableList.of(results1, results2); - List globalDependencies = ImmutableList.of(); - DashboardMain.generateDashboard( - configuration, - outputDirectory, - table, - globalDependencies, - symbolProblemTable, - new ClassPathResult(new AnnotatedClassPath(), ImmutableList.of()), - new Bom("mock:artifact:1.6.7", null)); - - Path dashboardHtml = outputDirectory.resolve("index.html"); - Assert.assertTrue(Files.isRegularFile(dashboardHtml)); - Document document = builder.build(dashboardHtml.toFile()); - - // xom's query cannot specify partial class field, e.g., 'statistic-item' - Nodes counts = document.query("//div[@class='container']/div/h2"); - Assert.assertTrue(counts.size() > 0); - for (int i = 0; i < counts.size(); i++) { - Integer.parseInt(counts.get(i).getValue().trim()); - } - // Linkage Errors - Truth.assertThat(counts.get(1).getValue().trim()).isEqualTo("1"); - } - - @Test - public void testVersionIndex() - throws IOException, TemplateException, URISyntaxException, ParsingException { - Path output = - DashboardMain.generateVersionIndex( - "com.google.cloud", - "libraries-bom", - ImmutableList.of("1.0.0", "2.0.0", "2.1.0-SNAPSHOT")); - Assert.assertTrue( - output.endsWith(Paths.get("target", "com.google.cloud", "libraries-bom", "index.html"))); - Assert.assertTrue(Files.isRegularFile(output)); - - Document document = builder.build(output.toFile()); - Nodes links = document.query("//a/@href"); - Assert.assertEquals(3, links.size()); - Node snapshotLink = links.get(2); - // 2.1.0-SNAPSHOT has directory 'snapshot' - Assert.assertEquals("snapshot/index.html", snapshotLink.getValue()); - } -} diff --git a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/PieChartTest.java b/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/PieChartTest.java deleted file mode 100644 index 177f4243c9..0000000000 --- a/dashboard/src/test/java/com/google/cloud/tools/opensource/dashboard/PieChartTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2019 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.cloud.tools.opensource.dashboard; - -import java.awt.geom.Point2D; -import org.junit.Assert; -import org.junit.Test; - -public class PieChartTest { - - private static final double TOLERANCE = 0.0001; - - @Test - public void testRightAngle() { - Point2D actual = PieChart.calculateEndPoint(100, 100, 100, .25); - Point2D expected = new Point2D.Double(200, 100); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - - @Test - public void testZero() { - Point2D actual = PieChart.calculateEndPoint(100, 100, 100, 0); - Point2D expected = new Point2D.Double(100, 0); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - - @Test - public void testOneEighth() { - int radius = 100; - double ratio = 1.0/8.0; - Point2D actual = PieChart.calculateEndPoint(radius, 100, 100, ratio); - Point2D expected = new Point2D.Double(100 + 100 / Math.sqrt(2), 100 - 100 / Math.sqrt(2)); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - - @Test - public void testHalf() { - Point2D actual = PieChart.calculateEndPoint(100, 100, 100, 0.5); - Point2D expected = new Point2D.Double(100, 200); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - - @Test - public void testOffCenter() { - Point2D actual = PieChart.calculateEndPoint(150, 150, 100, 0.5); - Point2D expected = new Point2D.Double(150, 250); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - - @Test - public void testFull() { - Point2D actual = PieChart.calculateEndPoint(100, 100, 100, 1.0); - Point2D expected = new Point2D.Double(100, 0); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - - @Test - public void testMoreThanFull() { - Point2D actual = PieChart.calculateEndPoint(100, 100, 100, 5.5); - Point2D expected = new Point2D.Double(100, 0); - Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE); - Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE); - } - -} - - - diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 2296ec7d84..69bd85b9af 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -150,23 +150,5 @@ - - java8-incompatible-reference-check - - - - org.codehaus.mojo - exec-maven-plugin - - false - com.google.cloud.tools.opensource.dependencies.Java8IncompatibleReferenceCheck - - ../boms/cloud-oss-bom/pom.xml - - - - - - diff --git a/enforcer-rules/pom.xml b/enforcer-rules/pom.xml index af2abf7020..6f4147ac24 100644 --- a/enforcer-rules/pom.xml +++ b/enforcer-rules/pom.xml @@ -145,24 +145,38 @@ - - maven-invoker-plugin - 3.2.2 - - ${project.build.directory}/it - ${project.build.directory}/local-repo - verify - - - - integration-test - - install - run - - - - + + + invoker-integration-test + + + !performRelease + + + + + + maven-invoker-plugin + 3.2.2 + + ${project.build.directory}/it + ${project.build.directory}/local-repo + verify + + + + integration-test + + install + run + + + + + + + + diff --git a/gradle-plugin/build.gradle b/gradle-plugin/build.gradle index 2e53631137..d921ff18da 100644 --- a/gradle-plugin/build.gradle +++ b/gradle-plugin/build.gradle @@ -27,7 +27,7 @@ group = 'com.google.cloud.tools' sourceCompatibility = 1.8 -version = '1.5.15' // {x-version-update:dependencies:current} +version = '1.5.16-SNAPSHOT' // {x-version-update:dependencies:current} dependencies { implementation "com.google.cloud.tools:dependencies:$version" diff --git a/kokoro/ubuntu/java8-incompatible-reference-check.sh b/kokoro/ubuntu/java8-incompatible-reference-check.sh deleted file mode 100644 index f2bd70480c..0000000000 --- a/kokoro/ubuntu/java8-incompatible-reference-check.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -# Fail on any error. -set -e -# Display commands being run. -set -x - -cd github/cloud-opensource-java/dependencies -mvn -V -B clean install - -mvn exec:java -e -Pjava8-incompatible-reference-check \ No newline at end of file diff --git a/kokoro/ubuntu/periodic.cfg b/kokoro/ubuntu/periodic.cfg deleted file mode 100644 index cf6d39fd94..0000000000 --- a/kokoro/ubuntu/periodic.cfg +++ /dev/null @@ -1,13 +0,0 @@ -# Format: //devtools/kokoro/config/proto/build.proto - -# Location of the periodic build bash script in git. -build_file: "cloud-opensource-java/kokoro/ubuntu/periodic.sh" - -timeout_mins: 240 - -action { - define_artifacts { - regex: "**/target/com.google.cloud/**" - strip_prefix: "github/cloud-opensource-java/dashboard/target" - } -} diff --git a/kokoro/ubuntu/periodic.sh b/kokoro/ubuntu/periodic.sh deleted file mode 100755 index c7f5d71901..0000000000 --- a/kokoro/ubuntu/periodic.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# Fail on any error. -set -e -# Display commands being run. -set -x - -cd github/cloud-opensource-java -# No need to run tests -./mvnw -V -B -ntp clean install -DskipTests -Denforcer.skip -Dinvoker.skip - -# Running target of dashboard submodule -# https://stackoverflow.com/questions/3459928/running-a-specific-maven-plugin-goal-from-the-command-line-in-a-sub-module-of-a/26448447#26448447 -# https://stackoverflow.com/questions/11091311/maven-execjava-goal-on-a-multi-module-project -cd dashboard - -# For all versions available in Maven Central and local repository -../mvnw -V -B -ntp exec:java -Dexec.mainClass="com.google.cloud.tools.opensource.dashboard.DashboardMain" \ - -Dexec.arguments="-a com.google.cloud:libraries-bom" - -../mvnw -V -B -ntp exec:java -Dexec.mainClass="com.google.cloud.tools.opensource.dashboard.DashboardMain" \ - -Dexec.arguments="-a com.google.cloud:gcp-lts-bom" diff --git a/pom.xml b/pom.xml index 25a32f6222..215bbe8486 100644 --- a/pom.xml +++ b/pom.xml @@ -54,11 +54,8 @@ - boms dependencies - dashboard enforcer-rules - linkage-monitor From 74115d452c07252aca2f6d3178814cfaeae6f4f7 Mon Sep 17 00:00:00 2001 From: Tomo Suzuki Date: Thu, 30 Oct 2025 11:35:35 -0400 Subject: [PATCH 111/113] feat!: preparing for next release of gcp-lts-bom (#2450) --- boms/cloud-lts-bom/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/boms/cloud-lts-bom/pom.xml b/boms/cloud-lts-bom/pom.xml index 005364f536..a803970ccb 100644 --- a/boms/cloud-lts-bom/pom.xml +++ b/boms/cloud-lts-bom/pom.xml @@ -9,7 +9,6 @@ gcp-lts-bom 9.0.2-SNAPSHOT pom - Google Cloud Long Term Support BOM Google Cloud Long Term Support BOM https://github.com/GoogleCloudPlatform/cloud-opensource-java From 96128ea55802ff167e6b4073c9c20fe5ec345acb Mon Sep 17 00:00:00 2001 From: Diego Marquez Date: Thu, 4 Dec 2025 15:58:20 -0500 Subject: [PATCH 112/113] chore: add release-please config for protobuf-4.x (#2458) --- .github/release-please.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/release-please.yml b/.github/release-please.yml index db54e9dfb7..2c470465a5 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -21,3 +21,9 @@ branches: packageName: gcp-lts-bom manifest: true branch: 6.0.x-lts + - bumpMinorPreMajor: true + handleGHRelease: true + packageName: gcp-lts-bom + manifest: true + branch: protobuf-4.x-rc + releaseType: java-yoshi From 5fb52f0fd731029fa1adeb7aeeb5238ce4866a7f Mon Sep 17 00:00:00 2001 From: Diego Marquez Date: Tue, 13 Jan 2026 15:56:26 -0500 Subject: [PATCH 113/113] chore: cleanup release-please config (#2461) * chore: add release-please config for protobuf-4.x * feat: configure rc releases to be on prerelease mode * fix: next release candidate * chore: cleanup release-please config - Remove redundant options already declared at the top level.\n- Remove bumpMinorPreMajor for repositories after the first major release. * refactor: move common release-please options to top level * revert: revert changes to release-please-config.json --- .github/release-please.yml | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/.github/release-please.yml b/.github/release-please.yml index 2c470465a5..fa603d47eb 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,29 +1,11 @@ handleGHRelease: true manifest: true +bumpMinorPreMajor: true +packageName: gcp-lts-bom branches: - - bumpMinorPreMajor: true - handleGHRelease: true - packageName: gcp-lts-bom - manifest: true - branch: 9.0.x-lts - - bumpMinorPreMajor: true - handleGHRelease: true - packageName: gcp-lts-bom - manifest: true - branch: 8.0.x-lts - - bumpMinorPreMajor: true - handleGHRelease: true - packageName: gcp-lts-bom - manifest: true - branch: 7.0.x-lts - - bumpMinorPreMajor: true - handleGHRelease: true - packageName: gcp-lts-bom - manifest: true - branch: 6.0.x-lts - - bumpMinorPreMajor: true - handleGHRelease: true - packageName: gcp-lts-bom - manifest: true - branch: protobuf-4.x-rc - releaseType: java-yoshi + - branch: 9.0.x-lts + - branch: 8.0.x-lts + - branch: 7.0.x-lts + - branch: 6.0.x-lts + - branch: protobuf-4.x-rc + releaseType: java-yoshi