Project: Beam (App Definition and Development / Streaming & Messaging)
File: java-dependency-upgrades.md

<!-- 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. --> To perform a dependency upgrade we want to ensure that the PR is not introducing any new . We do this by combining successful Jenkins test runs with analysis performed using a linkage checker. This allows us to gain confidence that we are minimizing the number of linkage issues that will arise for users. To perform a dependency upgrade: Find all Gradle subprojects that are impacted by the dependency change. For each Gradle subproject impacted by a dependency change: Perform the before and after linkage checker analysis. Provide the results as part of your PR. For each Gradle subproject: Find and run relevant Jenkins test suites. See the following sections for how step-by-step instructions. Execute the command below will print out a dependency report in a text file for each project: ./gradlew dependencyReport Grep for a specific maven artifact identifier such as guava in all the dependency reports with: grep -l "guava" `find ./ -name dependencies.txt` :warning: This step relies on modifying your local maven repository, typically found in ~/.m2/. Use the shell script to do this on your behalf (note that it will run the manual command below on your current workspace and also on HEAD): /bin/bash sdks/java/build-tools/beam-linkage-check.sh origin/master <your branch name> "artifactId1,artifactId2,..." :warning: If you omit the artifactIds, it uses beam-sdks-java-core beam-sdks-java-io-google-cloud-platform beam-runners-google-cloud-dataflow-java beam-sdks-java-io-hadoop-format; these artifacts often suffer dependency conflicts. Copy and paste the output to the PR. If it is large, you may want to use a GitHub gist. For example PRs (1, 2, 3, 4, and 5). Note that you can manually run the linkage checker on your current workspace by invoking: ./gradlew -Ppublishing -PjavaLinkageArtifactIds=artifactId1,artifactId2,... :checkJavaLinkage Check the example output is: ``` Class org.brotli.dec.BrotliInputStream is not found; referenced by 1 class file org.apache.beam.repackaged.core.org.apache.commons.compress.compressors.brotli.BrotliCompressorInputStream (beam-sdks-java-core-2.20.0-SNAPSHOT.jar) Class com.github.luben.zstd.ZstdInputStream is not found; referenced by 1 class file org.apache.beam.repackaged.core.org.apache.commons.compress.compressors.zstandard.ZstdCompressorInputStream (beam-sdks-java-core-2.20.0-SNAPSHOT.jar) Class com.github.luben.zstd.ZstdOutputStream is not found; referenced by 1 class file org.apache.beam.repackaged.core.org.apache.commons.compress.compressors.zstandard.ZstdCompressorOutputStream (beam-sdks-java-core-2.20.0-SNAPSHOT.jar) Class org.apache.beam.vendor.bytebuddy.v193.net.bytebuddy.jar.asm.commons.ModuleHashesAttribute is not found; referenced by 1 class file org.apache.beam.vendor.bytebuddy.v193.net.bytebuddy.jar.asm.commons.ClassRemapper (beam-vendor-bytebuddy-193-0.1.jar) ``` Delete any installed Apache Beam SNAPSHOT artifacts: rm -rf ~/.m2/repository/org/apache/beam You can find all Jenkins job configurations within https://github.com/apache/beam/tree/master/.test-infra/jenkins and request that the reviewer run the relevant test suites by providing them with a list of all the relevant trigger phrases. You can perform this request directly on your PR or on the dev mailing list, for . Beam uses to manage Google Cloud-related dependencies. A is used to upgrade GCP-BOM dependencies. To upgrade, find the latest BOM version in https://mvnrepository.com/artifact/com.google.cloud/libraries-bom and run ``` python scripts/tools/bomupgrader.py <latestbomversion> ``` then the changes will made in place. This script does the following steps: preprocessing BeamModulePlugin.groovy to decide the dependencies need to sync generate an empty Maven project to fetch the exact target versions to change Write back to BeamModulePlugin.groovy Update libraries-bom version on sdks/java/container/licensescripts/depurls_java.yaml In the case of modifying the script or diagnose, the following commands may be useful to identify matching/consistent dependency overrides. export BOM_VERSION=26.22.0 ; \ cd /tmp; \ wget https://repo1.maven.org/maven2/com/google/cloud/libraries-bom/$BOMVERSION/libraries-bom-$BOMVERSION.pom -O base.pom && \ mvn help:effective-pom -f base.pom -Doutput=effective.pom && cat effective.pom | \ grep -v 'dependencyManagement' > cleanup.pom && \ mvn dependency:tree -f cleanup.pom