blob: 69d25dad15e6314e8168d3b231480f513b60951c [file] [log] [blame]
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#
# This script compares linkage errors (checkJavaLinkage task in the root gradle project) between
# one branch and another.
# Usage:
# /bin/bash sdks/java/build-tools/beam-linkage-check.sh origin/master <your branch>
#
# By default, this checks the Maven artifacts listed in ARTIFACTS variable below.
#
# Optionally, you can pass artifact ID to overwrite the ARTIFACTS, such as:
# /bin/bash sdks/java/build-tools/beam-linkage-check.sh "beam-runners-google-cloud-dataflow-java"
#
# Multiple artifact IDs (separated by a comma) will check linkage errors that would appear when
# the two artifacts are used together. For example:
# /bin/bash sdks/java/build-tools/beam-linkage-check.sh "beam-runners-google-cloud-dataflow-java,beam-sdks-java-io-hadoop-format"
set -o pipefail
set -e
# These default artifacts are common causes of linkage errors.
DEFAULT_ARTIFACT_LISTS=" \
beam-sdks-java-core \
beam-sdks-java-io-google-cloud-platform \
beam-runners-google-cloud-dataflow-java \
beam-sdks-java-io-hadoop-format \
"
BASELINE_REF=$1
PROPOSED_REF=$2
ARTIFACT_LISTS=$3
if [ -z "$ARTIFACT_LISTS" ]; then
ARTIFACT_LISTS=$DEFAULT_ARTIFACT_LISTS
fi
if [ -z "$BASELINE_REF" ] || [ -z "$PROPOSED_REF" ] || [ -z "$ARTIFACT_LISTS" ] ; then
echo "Usage: $0 <baseline ref> <proposed ref> [artifact lists]"
exit 1
fi
if [ ! -d buildSrc ]; then
echo "Directory 'buildSrc' not found. Please run this script from the root directory of a clone of the Beam git repo."
fi
if [ "$BASELINE_REF" = "$PROPOSED_REF" ]; then
echo "Baseline and proposed refs are identical; cannot compare their linkage errors!"
exit 1
fi
if [ ! -z "$(git diff)" ]; then
echo "Uncommited change detected. Please commit changes and ensure 'git diff' is empty."
exit 1
fi
STARTING_REF=$(git rev-parse --abbrev-ref HEAD)
function cleanup() {
git checkout $STARTING_REF
}
trap cleanup EXIT
echo "Comparing linkage of artifact lists $ARTIFACT_LISTS using baseline $BASELINE_REF and proposal $PROPOSED_REF"
OUTPUT_DIR=build/linkagecheck
mkdir -p $OUTPUT_DIR
ACCUMULATED_RESULT=0
function runLinkageCheck () {
MODE=$1 # "baseline" or "validate"
for ARTIFACT_LIST in $ARTIFACT_LISTS; do
echo "`date`:" "Running linkage check (${MODE}) for ${ARTIFACT_LIST}"
BASELINE_FILE=${OUTPUT_DIR}/baseline-${ARTIFACT_LIST}.xml
if [ "$MODE" = "baseline" ]; then
BASELINE_OPTION="-PjavaLinkageWriteBaseline=${BASELINE_FILE}"
echo "`date`:" "to create a baseline (existing errors before change) $BASELINE_FILE"
elif [ "$MODE" = "validate" ]; then
BASELINE_OPTION="-PjavaLinkageReadBaseline=${BASELINE_FILE}"
echo "`date`:" "using baseline $BASELINE_FILE"
if [ ! -r "${BASELINE_FILE}" ]; then
# If baseline generation failed in previous baseline step, no need to build the project.
echo "`date`:" "Error: Baseline file not found"
ACCUMULATED_RESULT=1
continue
fi
else
BASELINE_OPTION=""
echo "`date`:" "Unexpected mode: ${MODE}. Not using baseline file."
fi
set +e
set -x
./gradlew -Ppublishing -PskipCheckerFramework -PjavaLinkageArtifactIds=$ARTIFACT_LIST ${BASELINE_OPTION} :checkJavaLinkage
RESULT=$?
set -e
set +x
if [ "$MODE" = "baseline" ] && [ ! -r "${BASELINE_FILE}" ]; then
echo "`date`:" "Failed to generate the baseline file. Check the build error above."
ACCUMULATED_RESULT=1
elif [ "$MODE" = "validate" ]; then
echo "`date`:" "Done: ${RESULT}"
ACCUMULATED_RESULT=$((ACCUMULATED_RESULT | RESULT))
fi
done
}
echo "Establishing baseline linkage for $(git rev-parse --abbrev-ref $BASELINE_REF)"
git -c advice.detachedHead=false checkout $BASELINE_REF
runLinkageCheck baseline
echo "Checking linkage for $(git rev-parse --abbrev-ref $PROPOSED_REF)"
git -c advice.detachedHEad=false checkout $PROPOSED_REF
runLinkageCheck validate
if [ "${ACCUMULATED_RESULT}" = "0" ]; then
echo "No new linkage errors"
else
echo "There's new linkage errors. See above for details."
fi
# CI-friendly way to tell the result
exit $ACCUMULATED_RESULT