diff --git a/.github/workflows/analyze_dependency.yaml b/.github/workflows/analyze_dependency.yaml index 22b350d53c..2b7d594b0f 100644 --- a/.github/workflows/analyze_dependency.yaml +++ b/.github/workflows/analyze_dependency.yaml @@ -27,10 +27,10 @@ jobs: distribution: temurin java-version: 17 cache: maven - - name: Set up Maven - uses: stCarolas/setup-maven@v4.5 - with: - maven-version: 3.8.2 + - name: Install modules + shell: bash + run: | + mvn clean install -V --batch-mode --no-transfer-progress -DskipTests - name: Install dependency analyzer shell: bash run: | @@ -39,5 +39,5 @@ jobs: - name: Check dependency information shell: bash run: | - mvn exec:java -Ddep.system=${{ github.event.inputs.system }} -Ddep.name=${{ github.event.inputs.name }} -Ddep.version=${{ github.event.inputs.version }} + mvn exec:java working-directory: java-shared-dependencies/dependency-analyzer \ No newline at end of file diff --git a/java-shared-dependencies/dependency-analyzer/pom.xml b/java-shared-dependencies/dependency-analyzer/pom.xml index fb2aa307ac..67cc0d8253 100644 --- a/java-shared-dependencies/dependency-analyzer/pom.xml +++ b/java-shared-dependencies/dependency-analyzer/pom.xml @@ -64,6 +64,11 @@ guava 33.3.1-jre + + com.google.cloud.tools + dependencies + 1.5.13 + org.mockito diff --git a/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/DependencyAnalyzer.java b/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/DependencyAnalyzer.java index 7423af8f11..369d224576 100644 --- a/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/DependencyAnalyzer.java +++ b/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/DependencyAnalyzer.java @@ -7,21 +7,28 @@ import com.google.cloud.model.AdvisoryKey; import com.google.cloud.model.AnalysisResult; import com.google.cloud.model.License; -import com.google.cloud.model.ReportResult; import com.google.cloud.model.PackageInfo; import com.google.cloud.model.QueryResult; +import com.google.cloud.model.ReportResult; import com.google.cloud.model.Result; import com.google.cloud.model.Version; import com.google.cloud.model.VersionKey; +import com.google.cloud.tools.opensource.classpath.ClassPathBuilder; +import com.google.cloud.tools.opensource.classpath.DependencyMediation; +import com.google.cloud.tools.opensource.dependencies.Bom; +import com.google.cloud.tools.opensource.dependencies.MavenRepositoryException; import java.io.IOException; import java.net.URISyntaxException; import java.net.http.HttpClient; +import java.nio.file.Paths; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Queue; import java.util.Set; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.version.InvalidVersionSpecificationException; public class DependencyAnalyzer { @@ -31,9 +38,45 @@ public DependencyAnalyzer(DepsDevClient depsDevClient) { this.depsDevClient = depsDevClient; } - public AnalysisResult analyze(String system, String packageName, String packageVersion) - throws URISyntaxException, IOException, InterruptedException, IllegalArgumentException { - VersionKey root = VersionKey.from(system, packageName, packageVersion); + public AnalysisResult analyze(String bomPath) + throws URISyntaxException, IOException, InterruptedException { + List packageInfos = new ArrayList<>(); + try { + Set roots = getManagedDependenciesFromBom(Bom.readBom(Paths.get(bomPath))); + for (VersionKey versionKey : roots) { + if (versionKey.isSnapshot()) { + continue; + } + packageInfos.addAll(getPackageInfoFrom(versionKey)); + } + + } catch (MavenRepositoryException | InvalidVersionSpecificationException ex) { + System.out.printf("Caught exception when resolving dependencies from %s.", bomPath); + ex.printStackTrace(); + System.exit(1); + } + + return AnalysisResult.of(packageInfos); + } + + private static Set getManagedDependenciesFromBom(Bom bom) + throws InvalidVersionSpecificationException { + Set res = new HashSet<>(); + new ClassPathBuilder() + .resolve(bom.getManagedDependencies(), false, DependencyMediation.MAVEN) + .getClassPath() + .forEach( + classPath -> { + Artifact artifact = classPath.getArtifact(); + String pkg = String.format("%s:%s", artifact.getGroupId(), artifact.getArtifactId()); + res.add(VersionKey.from("MAVEN", pkg, artifact.getVersion())); + }); + + return res; + } + + private List getPackageInfoFrom(VersionKey root) + throws URISyntaxException, IOException, InterruptedException { Set seenPackage = new HashSet<>(); seenPackage.add(root); Queue queue = new ArrayDeque<>(); @@ -42,6 +85,9 @@ public AnalysisResult analyze(String system, String packageName, String packageV while (!queue.isEmpty()) { VersionKey versionKey = queue.poll(); dependencies.add(versionKey); + if (versionKey.toString().equals("org.graalvm.sdk:nativeimage:24.1.1")) { + continue; + } List directDependencies = depsDevClient.getDirectDependencies(versionKey); // only add unseen dependencies to the queue. directDependencies @@ -49,7 +95,6 @@ public AnalysisResult analyze(String system, String packageName, String packageV .filter(seenPackage::add) .forEach(queue::offer); } - List result = new ArrayList<>(); for (VersionKey versionKey : dependencies) { QueryResult packageInfo = depsDevClient.getQueryResult(versionKey); @@ -64,11 +109,10 @@ public AnalysisResult analyze(String system, String packageName, String packageV advisories.add(depsDevClient.getAdvisory(advisoryKey.id())); } } - result.add(new PackageInfo(versionKey, licenses, advisories)); } - return AnalysisResult.of(result); + return result; } /** @@ -88,23 +132,11 @@ public AnalysisResult analyze(String system, String packageName, String packageV * package management system. */ public static void main(String[] args) throws IllegalArgumentException { - checkArgument(args.length == 3, - """ - The length of the inputs should be 3. - The 1st input should be the package management system. - The 2nd input should be the package name. - The 3rd input should be the package version. - """ - ); - - String system = args[0]; - String packageName = args[1]; - String packageVersion = args[2]; DependencyAnalyzer dependencyAnalyzer = new DependencyAnalyzer( new DepsDevClient(HttpClient.newHttpClient())); AnalysisResult analyzeReport = null; try { - analyzeReport = dependencyAnalyzer.analyze(system, packageName, packageVersion); + analyzeReport = dependencyAnalyzer.analyze("java-shared-dependencies/pom.xml"); } catch (URISyntaxException | IOException | InterruptedException ex) { System.out.println( "Caught exception when fetching package information from https://deps.dev/"); diff --git a/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/License.java b/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/License.java index dfa81db415..9fbe24c7c2 100644 --- a/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/License.java +++ b/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/License.java @@ -1,6 +1,7 @@ package com.google.cloud.model; import static com.google.cloud.model.LicenseCategory.NOTICE; +import static com.google.cloud.model.LicenseCategory.PERMISSIVE; import static com.google.cloud.model.LicenseCategory.RESTRICTED; import com.google.common.collect.ImmutableSet; @@ -16,10 +17,13 @@ public enum License { APACHE_2_0("Apache-2.0", Set.of(NOTICE)), BCL("BCL", Set.of(RESTRICTED, NOTICE)), + BSD_2_CLAUSE("BSD-2-Clause", Set.of(NOTICE)), BSD_3_CLAUSE("BSD-3-Clause", Set.of(NOTICE)), GL2PS("GL2PS", Set.of(RESTRICTED, NOTICE)), + GPL_2_0_WITH_CLASSPATH_EXCEPTION("GPL-2.0-with-classpath-exception", Set.of(PERMISSIVE)), MIT("MIT", Set.of(NOTICE)), - NOT_RECOGNIZED("Not-Recognized", Set.of()); + NOT_RECOGNIZED("Not-Recognized", Set.of()), + UPL_1_0("UPL-1.0", Set.of(NOTICE)); private final static Logger LOGGER = Logger.getLogger(License.class.getName()); diff --git a/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/VersionKey.java b/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/VersionKey.java index 589ae7190a..ea59fd8bbe 100644 --- a/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/VersionKey.java +++ b/java-shared-dependencies/dependency-analyzer/src/main/java/com/google/cloud/model/VersionKey.java @@ -20,6 +20,10 @@ public static VersionKey from(String system, String name, String version) return new VersionKey(pkg, name, version); } + public boolean isSnapshot() { + return version.endsWith("SNAPSHOT"); + } + @Override public String toString() { if (pkgManagement == PkgManagement.MAVEN) {