|
| 1 | +#!/bin/bash |
| 2 | +# Copyright 2025 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 | +scriptDir=$(realpath "$(dirname "${BASH_SOURCE[0]}")") |
| 19 | +source "${scriptDir}/common.sh" |
| 20 | + |
| 21 | +validate_protobuf_compatibility_script_inputs |
| 22 | + |
| 23 | +# Declare a map of downstream handwritten libraries and the relevant artifacts to test. The map stores a |
| 24 | +# K/V pairing of (Key: repo name, Value: comma separate list of Group ID:Artifact ID pairings). Note: The |
| 25 | +# value list doesn't hold the version and this needs to be parsed from the repo's versions.txt file |
| 26 | +declare -A repo_linkage_checker_arguments |
| 27 | +repo_linkage_checker_arguments["google-cloud-java"]="io.grafeas:grafeas,com.google.cloud:google-cloud-vertexai,com.google.cloud:google-cloud-resourcemanager,com.google.cloud:google-cloud-translate,com.google.api.grpc:grpc-google-cloud-vertexai-v1,com.google.api.grpc:grpc-google-cloud-vertexai-v1beta1,com.google.api.grpc:grpc-google-cloud-resourcemanager-v3,com.google.api.grpc:grpc-google-cloud-translate-v3,com.google.api.grpc:grpc-google-cloud-translate-v3beta1" |
| 28 | +repo_linkage_checker_arguments["java-bigtable"]="com.google.cloud:google-cloud-bigtable,com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2,com.google.api.grpc:grpc-google-cloud-bigtable-v2" |
| 29 | +repo_linkage_checker_arguments["java-bigquery"]="com.google.cloud:google-cloud-bigquery" |
| 30 | +repo_linkage_checker_arguments["java-bigquerystorage"]="com.google.cloud:google-cloud-bigquerystorage,com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1,com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2,com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1,com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1alpha" |
| 31 | +repo_linkage_checker_arguments["java-datastore"]="com.google.cloud:google-cloud-datastore,com.google.cloud.datastre:datastore-v1-proto-client,com.google.api.grpc:grpc-google-cloud-datastore-admin-v1" |
| 32 | +repo_linkage_checker_arguments["java-firestore"]="com.google.cloud:google-cloud-firestore,com.google.cloud:google-cloud-firestore-admin,com.google.api.grpc:grpc-google-cloud-firestore-admin-v1,com.google.api.grpc:grpc-google-cloud-firestore-v1" |
| 33 | +repo_linkage_checker_arguments["java-logging"]="com.google.cloud:google-cloud-logging,com.google.api.grpc:grpc-google-cloud-logging-v2" |
| 34 | +repo_linkage_checker_arguments["java-logging-logback"]="com.google.cloud:google-cloud-logging-logback" |
| 35 | +repo_linkage_checker_arguments["java-pubsub"]="com.google.cloud:google-cloud-pubsub,com.google.api.grpc:grpc-google-cloud-pubsub-v1" |
| 36 | +repo_linkage_checker_arguments["java-pubsublite"]="com.google.cloud:google-cloud-pubsublite,com.google.api.grpc:grpc-google-cloud-pubsublite-v1" |
| 37 | +repo_linkage_checker_arguments["java-spanner-jdbc"]="com.google.cloud:google-cloud-spanner-jdbc" |
| 38 | +repo_linkage_checker_arguments["java-spanner"]="com.google.cloud:google-cloud-spanner,com.google.cloud:google-cloud-spanner-executor,com.google.api.grpc:grpc-google-cloud-spanner-v1,com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1,com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1,com.google.api.grpc:grpc-google-cloud-spanner-executor-v1" |
| 39 | +repo_linkage_checker_arguments["java-storage"]="com.google.cloud:google-cloud-storage,com.google.api.grpc:gapic-google-cloud-storage-v2,com.google.api.grpc:grpc-google-cloud-storage-v2,com.google.cloud:google-cloud-storage-control,com.google.api.grpc:grpc-google-cloud-storage-control-v2" |
| 40 | +repo_linkage_checker_arguments["java-storage-nio"]="com.google.cloud:google-cloud-nio" |
| 41 | + |
| 42 | +# This function requires access to the versions.txt to retrieve the versions for the artifacts |
| 43 | +# It will try to match the artifact_id in the versions.txt file and attach it to form the GAV |
| 44 | +# The GAV list is required by Linkage Checker as program arguments |
| 45 | +function build_program_arguments() { |
| 46 | + artifact_list="${repo_linkage_checker_arguments[$1]}" |
| 47 | + |
| 48 | + for artifact in ${artifact_list//,/ }; do # Split on comma |
| 49 | + artifact_id=$(echo "${artifact}" | cut -d ':' -f2) |
| 50 | + |
| 51 | + # The grep query tries to match `{artifact_id}:{released_version}:{current_version}`. |
| 52 | + # The artifact_id must be exact otherwise multiple entries may match |
| 53 | + version=$(cat "versions.txt" | grep -E "^${artifact_id}:.*:.*$" | cut -d ':' -f3) |
| 54 | + repo_gav_coordinate="${artifact}:${version}" |
| 55 | + |
| 56 | + # The first entry added is not separated with a comma. Avoids generating `,{ARTIFACT_LIST}` |
| 57 | + if [ -z "${linkage_checker_arguments}" ]; then |
| 58 | + linkage_checker_arguments="${repo_gav_coordinate}" |
| 59 | + else |
| 60 | + linkage_checker_arguments="${linkage_checker_arguments},${repo_gav_coordinate}" |
| 61 | + fi |
| 62 | + done |
| 63 | +} |
| 64 | + |
| 65 | +# cloud-opensource-java contains the Linkage Checker tool |
| 66 | +git clone https://github.com/GoogleCloudPlatform/cloud-opensource-java.git |
| 67 | +pushd cloud-opensource-java |
| 68 | +mvn -B -ntp clean compile -T 1C |
| 69 | +# Linkage Checker tool resides in the /dependencies subfolder |
| 70 | +pushd dependencies |
| 71 | + |
| 72 | +# REPOS_UNDER_TEST Env Var accepts a comma separated list of googleapis repos to test. For Github CI, |
| 73 | +# this will be a single repo as Github will build a matrix of repos with each repo being tested in parallel. |
| 74 | +# For local invocation, you can pass a list of repos to test multiple repos together. |
| 75 | +for repo in ${REPOS_UNDER_TEST//,/ }; do # Split on comma |
| 76 | + # Perform testing on main (with latest changes). Shallow copy as history is not important |
| 77 | + git clone "https://github.com/googleapis/${repo}.git" --depth=1 |
| 78 | + pushd "${repo}" |
| 79 | + # Install all repo modules to ~/.m2 (there can be multiple relevant artifacts to test i.e. core, admin, control) |
| 80 | + mvn -B -ntp install -T 1C -DskipTests -Dclirr.skip -Denforcer.skip |
| 81 | + |
| 82 | + linkage_checker_arguments="" |
| 83 | + build_program_arguments "${repo}" |
| 84 | + |
| 85 | + # Linkage Checker /dependencies |
| 86 | + popd |
| 87 | + |
| 88 | + echo "Artifact List: ${linkage_checker_arguments}" |
| 89 | + # The `-s` argument filters the linkage check problems that stem from the artifact |
| 90 | + program_args="-r --artifacts ${linkage_checker_arguments},com.google.protobuf:protobuf-java:${PROTOBUF_RUNTIME_VERSION},com.google.protobuf:protobuf-java-util:${PROTOBUF_RUNTIME_VERSION} -s ${linkage_checker_arguments}" |
| 91 | + echo "Running Linkage Checker on the repo's handwritten modules" |
| 92 | + echo "Linkage Checker Program Arguments: ${program_args}" |
| 93 | + mvn -B -ntp exec:java -Dexec.args="${program_args}" -P exec-linkage-checker |
| 94 | +done |
| 95 | +popd |
| 96 | +popd |
0 commit comments