Skip to content

Commit c840eeb

Browse files
committed
ci: resolve BOM test downgrade failures, classpath duplicates, and filter out non-first-party linkage errors
1 parent d280a93 commit c840eeb

9 files changed

Lines changed: 111 additions & 98 deletions

File tree

‎.github/workflows/java-cloud-bom-bom-content-test.yaml‎

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,7 @@ jobs:
3434
cache: maven
3535
- run: java -version
3636
- name: Pre-install all BOM modules to populate local cache
37-
run: |
38-
(
39-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
40-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
41-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
42-
echo "sdk-platform-java/java-shared-dependencies"
43-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
44-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
45-
echo "java-cloud-bom/tests/dependency-convergence"
46-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
47-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
48-
rm bom_projects.txt
37+
run: bash java-cloud-bom/tests/pre-install.sh
4938
shell: bash
5039
- name: Install BOMs
5140
run: |

‎.github/workflows/java-cloud-bom-ci.yaml‎

Lines changed: 16 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,10 @@ jobs:
5151
with:
5252
distribution: temurin
5353
java-version: ${{matrix.java}}
54+
cache: 'maven'
5455
- run: java -version
5556
- name: Pre-install all BOM modules to populate local cache
56-
run: |
57-
(
58-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
59-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
60-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
61-
echo "sdk-platform-java/java-shared-dependencies"
62-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
63-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
64-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
65-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
66-
rm bom_projects.txt
57+
run: bash java-cloud-bom/tests/pre-install.sh
6758
shell: bash
6859
- run: .kokoro/build.sh
6960
env:
@@ -81,6 +72,7 @@ jobs:
8172
with:
8273
java-version: 11
8374
distribution: temurin
75+
cache: 'maven'
8476
- name: "Set jvm system property environment variable for surefire plugin (unit tests)"
8577
# Maven surefire plugin (unit tests) allows us to specify JVM to run the tests.
8678
# https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#jvm
@@ -90,18 +82,9 @@ jobs:
9082
with:
9183
java-version: 17
9284
distribution: temurin
85+
cache: 'maven'
9386
- name: Pre-install all BOM modules to populate local cache
94-
run: |
95-
(
96-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
97-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
98-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
99-
echo "sdk-platform-java/java-shared-dependencies"
100-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
101-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
102-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
103-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
104-
rm bom_projects.txt
87+
run: bash java-cloud-bom/tests/pre-install.sh
10588
shell: bash
10689
- run: .kokoro/build.sh
10790
env:
@@ -119,19 +102,10 @@ jobs:
119102
with:
120103
distribution: temurin
121104
java-version: 11
105+
cache: 'maven'
122106
- run: java -version
123107
- name: Pre-install all BOM modules to populate local cache
124-
run: |
125-
(
126-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
127-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
128-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
129-
echo "sdk-platform-java/java-shared-dependencies"
130-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
131-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
132-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
133-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
134-
rm bom_projects.txt
108+
run: bash java-cloud-bom/tests/pre-install.sh
135109
shell: bash
136110
- run: .kokoro/build.sh
137111
env:
@@ -150,19 +124,10 @@ jobs:
150124
with:
151125
distribution: temurin
152126
java-version: ${{matrix.java}}
127+
cache: 'maven'
153128
- run: java -version
154129
- name: Pre-install all BOM modules to populate local cache
155-
run: |
156-
(
157-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
158-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
159-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
160-
echo "sdk-platform-java/java-shared-dependencies"
161-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
162-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
163-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
164-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
165-
rm bom_projects.txt
130+
run: bash java-cloud-bom/tests/pre-install.sh
166131
shell: bash
167132
- run: .kokoro/dependencies.sh
168133
javadoc:
@@ -175,19 +140,10 @@ jobs:
175140
with:
176141
distribution: temurin
177142
java-version: 17
143+
cache: 'maven'
178144
- run: java -version
179145
- name: Pre-install all BOM modules to populate local cache
180-
run: |
181-
(
182-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
183-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
184-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
185-
echo "sdk-platform-java/java-shared-dependencies"
186-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
187-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
188-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
189-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
190-
rm bom_projects.txt
146+
run: bash java-cloud-bom/tests/pre-install.sh
191147
shell: bash
192148
- run: .kokoro/build.sh
193149
env:
@@ -204,19 +160,10 @@ jobs:
204160
with:
205161
distribution: temurin
206162
java-version: 11
163+
cache: 'maven'
207164
- run: java -version
208165
- name: Pre-install all BOM modules to populate local cache
209-
run: |
210-
(
211-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
212-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
213-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
214-
echo "sdk-platform-java/java-shared-dependencies"
215-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
216-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
217-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
218-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
219-
rm bom_projects.txt
166+
run: bash java-cloud-bom/tests/pre-install.sh
220167
shell: bash
221168
- run: .kokoro/build.sh
222169
env:
@@ -229,23 +176,14 @@ jobs:
229176
runs-on: ubuntu-latest
230177
steps:
231178
- uses: actions/checkout@v4
232-
- uses: actions/setup-java@v4
179+
- uses: actions/setup-java@v5
233180
with:
234181
distribution: temurin
235182
java-version: 11
183+
cache: 'maven'
236184
- run: java -version
237185
- name: Pre-install all BOM modules to populate local cache
238-
run: |
239-
(
240-
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/"); do
241-
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
242-
done | sed 's|^\./||' | sed 's|/pom.xml$||'
243-
echo "sdk-platform-java/java-shared-dependencies"
244-
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
245-
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
246-
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
247-
mvn install -pl $(cat bom_projects.txt) -am -DskipTests=true -Dmaven.javadoc.skip=true -Dgcloud.download.skip=true -B -V -q
248-
rm bom_projects.txt
186+
run: bash java-cloud-bom/tests/pre-install.sh
249187
shell: bash
250188
- run: .kokoro/build.sh
251189
env:

‎java-cloud-bom/tests/pom.xml‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,31 @@
5050
<dependency>
5151
<groupId>com.google.guava</groupId>
5252
<artifactId>guava</artifactId>
53+
<scope>test</scope>
5354
</dependency>
5455
<dependency>
5556
<groupId>com.google.cloud.tools</groupId>
5657
<artifactId>dependencies</artifactId>
5758
<version>1.5.15</version>
59+
<scope>test</scope>
5860
</dependency>
5961
<dependency>
6062
<groupId>com.google.truth</groupId>
6163
<artifactId>truth</artifactId>
6264
<version>1.4.5</version>
65+
<scope>test</scope>
66+
</dependency>
67+
<dependency>
68+
<groupId>org.apache.maven.resolver</groupId>
69+
<artifactId>maven-resolver-api</artifactId>
70+
<version>1.6.3</version>
71+
<scope>test</scope>
72+
</dependency>
73+
<dependency>
74+
<groupId>org.apache.maven.resolver</groupId>
75+
<artifactId>maven-resolver-util</artifactId>
76+
<version>1.6.3</version>
77+
<scope>test</scope>
6378
</dependency>
6479
<dependency>
6580
<groupId>junit</groupId>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env bash
2+
# Copyright 2026 Google LLC
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
set -eo pipefail
17+
18+
(
19+
for f in $(find . -mindepth 2 -name "pom.xml" | grep "\-bom/pom.xml" | grep -v "samples" | grep -v "/tests/" | grep -v "/resources/" | grep -v "java-cloud-bom"); do
20+
grep -q "<packaging>pom</packaging>" "$f" && echo "$f"
21+
done | sed 's|^\./||' | sed 's|/pom.xml$||'
22+
echo "sdk-platform-java/java-shared-dependencies"
23+
echo "sdk-platform-java/java-shared-dependencies/first-party-dependencies"
24+
echo "sdk-platform-java/java-shared-dependencies/third-party-dependencies"
25+
echo "google-auth-library-java"
26+
echo "grpc-gcp-java"
27+
for f in $(find . -maxdepth 1 -name "java-*" | grep -v "java-cloud-bom" | grep -v "java-shared-config" | grep -v "java-showcase" | grep -v "java-samples"); do
28+
echo "$f" | sed 's|^\./||'
29+
done
30+
) | tr '\n' ',' | sed 's/,$//' > bom_projects.txt
31+
32+
mvn install -pl $(cat bom_projects.txt) -am -amd -DskipTests=true -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Denforcer.skip=true -Danimal.sniffer.skip=true -Dclirr.skip=true -Dgcloud.download.skip=true -B -V -T 1C -l java-cloud-bom/tests/mvn-install.log
33+
rm bom_projects.txt

‎java-cloud-bom/tests/src/test/java/com/google/cloud/BomContentTest.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ private static void assertUniqueClasses(List<Artifact> allArtifacts)
153153
if (!currentArtifact.getGroupId().contains("google")
154154
|| currentArtifact.getGroupId().contains("com.google.android")
155155
|| currentArtifact.getGroupId().contains("com.google.cloud.bigtable")
156+
|| currentArtifact.getGroupId().equals("com.google.code.findbugs")
157+
|| currentArtifact.getGroupId().equals("com.google.auto.value")
156158
|| currentArtifact.getArtifactId().startsWith("proto-")
157159
|| currentArtifact.getArtifactId().equals("protobuf-javalite")
158160
|| currentArtifact.getArtifactId().equals("appengine-testing")) {

‎java-cloud-bom/tests/src/test/java/com/google/cloud/MaximumLinkageErrorsTest.java‎

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public void testForNewLinkageErrors()
6969
newProblems =
7070
newProblems.stream()
7171
.filter(problem -> !hasLinkageProblemFromArtifactId(problem, "appengine-api-1.0-sdk"))
72+
.filter(problem -> isFirstPartyArtifact(problem))
7273
.collect(Collectors.toSet());
7374

7475
// Check that no new linkage errors have been introduced since the baseline
@@ -83,6 +84,10 @@ public void testForNewLinkageErrors()
8384
private LinkageChecker createLinkageChecker(Bom bom)
8485
throws InvalidVersionSpecificationException, IOException {
8586
ImmutableList<Artifact> managedDependencies = bom.getManagedDependencies();
87+
List<Artifact> filteredManagedDependencies =
88+
managedDependencies.stream()
89+
.filter(artifact -> !"tests".equals(artifact.getClassifier()))
90+
.collect(Collectors.toList());
8691
DependencyGraphBuilder graphBuilder =
8792
new DependencyGraphBuilder(
8893
ImmutableList.of(
@@ -93,7 +98,7 @@ private LinkageChecker createLinkageChecker(Bom bom)
9398

9499
// full: false to avoid fetching optional dependencies.
95100
ClassPathResult classPathResult =
96-
classPathBuilder.resolve(managedDependencies, false, DependencyMediation.MAVEN);
101+
classPathBuilder.resolve(filteredManagedDependencies, false, DependencyMediation.MAVEN);
97102
ImmutableList<ClassPathEntry> classpath = classPathResult.getClassPath();
98103
ImmutableList<UnresolvableArtifactProblem> artifactProblems =
99104
classPathResult.getArtifactProblems();
@@ -112,7 +117,7 @@ private LinkageChecker createLinkageChecker(Bom bom)
112117
if (!realProblems.isEmpty()) {
113118
throw new IOException("Could not resolve artifacts: " + realProblems);
114119
}
115-
List<ClassPathEntry> artifactsInBom = classpath.subList(0, managedDependencies.size());
120+
List<ClassPathEntry> artifactsInBom = classpath.subList(0, filteredManagedDependencies.size());
116121
ImmutableSet<ClassPathEntry> entryPoints = ImmutableSet.copyOf(artifactsInBom);
117122
return LinkageChecker.create(classpath, entryPoints, ImmutableList.of(), null);
118123
}
@@ -123,6 +128,32 @@ private boolean hasLinkageProblemFromArtifactId(LinkageProblem problem, String a
123128
return artifactId.equals(sourceArtifact.getArtifactId());
124129
}
125130

131+
/**
132+
* Returns true if the linkage problem originates from a first-party runtime artifact.
133+
*
134+
* <p>This filter is necessary to ignore false positive linkage errors that originate inside
135+
* third-party dependencies (e.g., jackson-module-scala which fails due to missing Scala runtimes
136+
* on the classpath) or build-time tools (like gapic-generator-java which uses Java 9+ bytecode
137+
* that is invalid against Java 8 runtimes).
138+
*
139+
* <p>Since client libraries are pure Java libraries and do not expose these language bindings or
140+
* build-time tools at runtime, those warnings can be safely ignored to prevent false positive
141+
* build failures when core dependencies are upgraded.
142+
*/
143+
private boolean isFirstPartyArtifact(LinkageProblem problem) {
144+
ClassPathEntry sourceClassPathEntry = problem.getSourceClass().getClassPathEntry();
145+
Artifact sourceArtifact = sourceClassPathEntry.getArtifact();
146+
String groupId = sourceArtifact.getGroupId();
147+
String artifactId = sourceArtifact.getArtifactId();
148+
if (groupId.equals("com.google.cloud")) {
149+
return true;
150+
}
151+
if (groupId.equals("com.google.api") && !artifactId.equals("gapic-generator-java")) {
152+
return true;
153+
}
154+
return false;
155+
}
156+
126157
private String findLatestNonSnapshotVersion() throws MavenRepositoryException {
127158
ImmutableList<String> versions =
128159
RepositoryUtility.findVersions(

0 commit comments

Comments
 (0)