| <!-- | |
| 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. | |
| --> | |
| # Upgrading a Java Dependency | |
| To perform a dependency upgrade we want to ensure that the PR is not | |
| introducing any new [linkage errors](https://jlbp.dev/glossary). 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. | |
| ## How to find all Gradle subprojects that are impacted by the dependency change | |
| 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` | |
| ## Linkage checker analysis | |
| > :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.v1_9_3.net.bytebuddy.jar.asm.commons.ModuleHashesAttribute is not found; | |
| referenced by 1 class file | |
| org.apache.beam.vendor.bytebuddy.v1_9_3.net.bytebuddy.jar.asm.commons.ClassRemapper (beam-vendor-bytebuddy-1_9_3-0.1.jar) | |
| ``` | |
| Delete any installed Apache Beam SNAPSHOT artifacts: | |
| rm -rf ~/.m2/repository/org/apache/beam | |
| ## Run relevant Jenkins test suites and GitHub Actions | |
| 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 [example](https://lists.apache.org/thread/jgjdt52jm6rk0ndrjjnvk1nn65dl9358). | |
| # Google Cloud-related dependency upgrades | |
| Beam uses [GCP-BOM](https://cloud.google.com/java/docs/bom) to manage Google Cloud-related dependencies. A [script](../scripts/tools/bomupgrader.py) 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 <latest_bom_version> | |
| ``` | |
| then the changes will made in place. | |
| This script does the following steps: | |
| 1. preprocessing BeamModulePlugin.groovy to decide the dependencies need to sync | |
| 2. generate an empty Maven project to fetch the exact target versions to change | |
| 3. Write back to BeamModulePlugin.groovy | |
| 4. Update libraries-bom version on sdks/java/container/license_scripts/dep_urls_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/$BOM_VERSION/libraries-bom-$BOM_VERSION.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 | |
| # Protobuf Upgrades | |
| There are 2 versions of Protobuf used in Beam: | |
| 1) The version driven by the GCP BOM version (see previous section). This version is defined as `protobuf_version` in `BeamModulePlugin.groovy` (example [update PR](protobuf_version)). | |
| 2) The version driven by the vendored grpc version. This version is defined as `protobuf_version` in `buildSrc/src/main/groovy/org/apache/beam/gradle/GrpcVendoring_<version>.groovy` (example [PR #1](https://github.com/apache/beam/pull/33553) and [PR #2](https://github.com/apache/beam/pull/33555) to update). | |
| These versions should be compatible. This usually means they must be on the same major version, unless cross-version compatibility is explicitly guaranteed. | |
| Other dependencies are similarly defined with imported GRPC and may have similar requirements. For more info on vendoring dependencies see https://github.com/apache/beam/blob/master/vendor/README.md |