571 lines
16 KiB
Bash
Executable File
571 lines
16 KiB
Bash
Executable File
#!/usr/bin/env 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.
|
|
|
|
#
|
|
# SHELLDOC-IGNORE
|
|
#
|
|
# Override these to match Apache Hadoop's requirements
|
|
personality_plugins "all,-ant,-gradle,-scalac,-scaladoc"
|
|
|
|
## @description Globals specific to this personality
|
|
## @audience private
|
|
## @stability evolving
|
|
function personality_globals
|
|
{
|
|
# shellcheck disable=SC2034
|
|
BUILDTOOL=maven
|
|
#shellcheck disable=SC2034
|
|
PATCH_BRANCH_DEFAULT=trunk
|
|
#shellcheck disable=SC2034
|
|
PATCH_NAMING_RULE="https://cwiki.apache.org/confluence/display/HADOOP/How+To+Contribute"
|
|
#shellcheck disable=SC2034
|
|
JIRA_ISSUE_RE='^(HADOOP|YARN|MAPREDUCE|HDFS)-[0-9]+$'
|
|
#shellcheck disable=SC2034
|
|
GITHUB_REPO_DEFAULT="apache/hadoop"
|
|
|
|
HADOOP_HOMEBREW_DIR=${HADOOP_HOMEBREW_DIR:-$(brew --prefix 2>/dev/null)}
|
|
if [[ -z "${HADOOP_HOMEBREW_DIR}" ]]; then
|
|
HADOOP_HOMEBREW_DIR=/usr/local
|
|
fi
|
|
}
|
|
|
|
function personality_parse_args
|
|
{
|
|
declare i
|
|
|
|
for i in "$@"; do
|
|
case ${i} in
|
|
--hadoop-isal-prefix=*)
|
|
delete_parameter "${i}"
|
|
ISAL_HOME=${i#*=}
|
|
;;
|
|
--hadoop-openssl-prefix=*)
|
|
delete_parameter "${i}"
|
|
OPENSSL_HOME=${i#*=}
|
|
;;
|
|
--hadoop-snappy-prefix=*)
|
|
delete_parameter "${i}"
|
|
SNAPPY_HOME=${i#*=}
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
## @description Calculate the actual module ordering
|
|
## @audience private
|
|
## @stability evolving
|
|
## @param ordering
|
|
function hadoop_order
|
|
{
|
|
declare ordering=$1
|
|
declare hadoopm
|
|
|
|
if [[ ${ordering} = normal ]]; then
|
|
hadoopm="${CHANGED_MODULES[*]}"
|
|
elif [[ ${ordering} = union ]]; then
|
|
hadoopm="${CHANGED_UNION_MODULES}"
|
|
elif [[ ${ordering} = mvnsrc ]]; then
|
|
hadoopm="${MAVEN_SRC_MODULES[*]}"
|
|
elif [[ ${ordering} = mvnsrctest ]]; then
|
|
hadoopm="${MAVEN_SRCTEST_MODULES[*]}"
|
|
else
|
|
hadoopm="${ordering}"
|
|
fi
|
|
echo "${hadoopm}"
|
|
}
|
|
|
|
## @description Determine if it is safe to run parallel tests
|
|
## @audience private
|
|
## @stability evolving
|
|
## @param ordering
|
|
function hadoop_test_parallel
|
|
{
|
|
if [[ -f "${BASEDIR}/pom.xml" ]]; then
|
|
HADOOP_VERSION=$(grep '<version>' "${BASEDIR}/pom.xml" \
|
|
| head -1 \
|
|
| "${SED}" -e 's|^ *<version>||' -e 's|</version>.*$||' \
|
|
| cut -f1 -d- )
|
|
export HADOOP_VERSION
|
|
else
|
|
return 1
|
|
fi
|
|
|
|
hmajor=${HADOOP_VERSION%%\.*}
|
|
hmajorminor=${HADOOP_VERSION%\.*}
|
|
hminor=${hmajorminor##*\.}
|
|
# ... and just for reference
|
|
#hmicro=${HADOOP_VERSION##*\.}
|
|
|
|
# Apache Hadoop v2.8.0 was the first one to really
|
|
# get working parallel unit tests
|
|
if [[ ${hmajor} -lt 3 && ${hminor} -lt 8 ]]; then
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
## @description Install extra modules for unit tests
|
|
## @audience private
|
|
## @stability evolving
|
|
## @param ordering
|
|
function hadoop_unittest_prereqs
|
|
{
|
|
declare input=$1
|
|
declare mods
|
|
declare need_common=0
|
|
declare building_common=0
|
|
declare module
|
|
declare flags
|
|
declare fn
|
|
|
|
# prior to running unit tests, hdfs needs libhadoop.so built
|
|
# if we're building root, then this extra work is moot
|
|
|
|
#shellcheck disable=SC2086
|
|
mods=$(hadoop_order ${input})
|
|
|
|
for module in ${mods}; do
|
|
if [[ ${module} = hadoop-hdfs-project* ]]; then
|
|
need_common=1
|
|
elif [[ ${module} = hadoop-common-project/hadoop-common
|
|
|| ${module} = hadoop-common-project ]]; then
|
|
building_common=1
|
|
elif [[ ${module} = . ]]; then
|
|
return
|
|
fi
|
|
done
|
|
|
|
# Windows builds *ALWAYS* need hadoop-common compiled
|
|
case ${OSTYPE} in
|
|
Windows_NT|CYGWIN*|MINGW*|MSYS*)
|
|
need_common=1
|
|
;;
|
|
esac
|
|
|
|
if [[ ${need_common} -eq 1
|
|
&& ${building_common} -eq 0 ]]; then
|
|
echo "unit test pre-reqs:"
|
|
module="hadoop-common-project/hadoop-common"
|
|
fn=$(module_file_fragment "${module}")
|
|
flags="$(hadoop_native_flags) $(yarn_ui2_flag)"
|
|
pushd "${BASEDIR}/${module}" >/dev/null || return 1
|
|
# shellcheck disable=SC2086
|
|
echo_and_redirect "${PATCH_DIR}/maven-unit-prereq-${fn}-install.txt" \
|
|
"${MAVEN}" "${MAVEN_ARGS[@]}" install -DskipTests ${flags}
|
|
popd >/dev/null || return 1
|
|
fi
|
|
}
|
|
|
|
## @description Calculate the flags/settings for yarn-ui v2 build
|
|
## @description based upon the OS
|
|
## @audience private
|
|
## @stability evolving
|
|
function yarn_ui2_flag
|
|
{
|
|
|
|
if [[ ${BUILD_NATIVE} != true ]]; then
|
|
return
|
|
fi
|
|
|
|
# Now it only tested on Linux/OSX, don't enable the profile on
|
|
# windows until it get verified
|
|
case ${OSTYPE} in
|
|
Linux)
|
|
# shellcheck disable=SC2086
|
|
echo -Pyarn-ui
|
|
;;
|
|
Darwin)
|
|
echo -Pyarn-ui
|
|
;;
|
|
*)
|
|
# Do nothing
|
|
;;
|
|
esac
|
|
}
|
|
|
|
## @description Calculate the flags/settings for native code
|
|
## @description based upon the OS
|
|
## @audience private
|
|
## @stability evolving
|
|
function hadoop_native_flags
|
|
{
|
|
if [[ ${BUILD_NATIVE} != true ]]; then
|
|
return
|
|
fi
|
|
|
|
declare -a args
|
|
|
|
# Based upon HADOOP-11937
|
|
#
|
|
# Some notes:
|
|
#
|
|
# - getting fuse to compile on anything but Linux
|
|
# is always tricky.
|
|
# - Darwin assumes homebrew is in use.
|
|
# - HADOOP-12027 required for bzip2 on OS X.
|
|
# - bzip2 is broken in lots of places
|
|
# (the shared library is considered experimental)
|
|
# e.g, HADOOP-12027 for OS X. so no -Drequire.bzip2
|
|
#
|
|
|
|
args=("-Drequire.test.libhadoop")
|
|
|
|
if [[ -d "${ISAL_HOME}/include" ]]; then
|
|
args=("${args[@]}" "-Disal.prefix=${ISAL_HOME}")
|
|
fi
|
|
|
|
if [[ -d "${OPENSSL_HOME}/include" ]]; then
|
|
args=("${args[@]}" "-Dopenssl.prefix=${OPENSSL_HOME}")
|
|
elif [[ -d "${HADOOP_HOMEBREW_DIR}/opt/openssl/" ]]; then
|
|
args=("${args[@]}" "-Dopenssl.prefix=${HADOOP_HOMEBREW_DIR}/opt/openssl/")
|
|
fi
|
|
|
|
if [[ -d "${SNAPPY_HOME}/include" ]]; then
|
|
args=("${args[@]}" "-Dsnappy.prefix=${SNAPPY_HOME}")
|
|
elif [[ -d "${HADOOP_HOMEBREW_DIR}/include/snappy.h" ]]; then
|
|
args=("${args[@]}" "-Dsnappy.prefix=${HADOOP_HOMEBREW_DIR}/opt/snappy")
|
|
fi
|
|
|
|
case ${OSTYPE} in
|
|
Linux)
|
|
# shellcheck disable=SC2086
|
|
echo \
|
|
-Pnative \
|
|
-Drequire.fuse \
|
|
-Drequire.openssl \
|
|
-Drequire.snappy \
|
|
-Drequire.valgrind \
|
|
-Drequire.zstd \
|
|
"${args[@]}"
|
|
;;
|
|
Darwin)
|
|
echo \
|
|
"${args[@]}" \
|
|
-Pnative \
|
|
-Drequire.snappy \
|
|
-Drequire.openssl
|
|
;;
|
|
Windows_NT|CYGWIN*|MINGW*|MSYS*)
|
|
echo \
|
|
"${args[@]}" \
|
|
-Drequire.snappy -Drequire.openssl -Pnative-win
|
|
;;
|
|
*)
|
|
echo \
|
|
"${args[@]}"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
## @description Queue up modules for this personality
|
|
## @audience private
|
|
## @stability evolving
|
|
## @param repostatus
|
|
## @param testtype
|
|
function personality_modules
|
|
{
|
|
declare repostatus=$1
|
|
declare testtype=$2
|
|
declare extra=""
|
|
declare ordering="normal"
|
|
declare needflags=false
|
|
declare foundbats=false
|
|
declare flags
|
|
declare fn
|
|
declare i
|
|
declare hadoopm
|
|
|
|
yetus_debug "Personality: ${repostatus} ${testtype}"
|
|
|
|
clear_personality_queue
|
|
|
|
case ${testtype} in
|
|
asflicense)
|
|
# this is very fast and provides the full path if we do it from
|
|
# the root of the source
|
|
personality_enqueue_module .
|
|
return
|
|
;;
|
|
checkstyle)
|
|
ordering="union"
|
|
extra="-DskipTests"
|
|
;;
|
|
compile)
|
|
ordering="union"
|
|
extra="-DskipTests"
|
|
needflags=true
|
|
|
|
# if something in common changed, we build the whole world
|
|
if [[ "${CHANGED_MODULES[*]}" =~ hadoop-common ]]; then
|
|
yetus_debug "hadoop personality: javac + hadoop-common = ordering set to . "
|
|
ordering="."
|
|
fi
|
|
;;
|
|
distclean)
|
|
ordering="."
|
|
extra="-DskipTests"
|
|
;;
|
|
javadoc)
|
|
if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
|
|
ordering=.
|
|
fi
|
|
|
|
if [[ "${repostatus}" = patch && "${BUILDMODE}" = patch ]]; then
|
|
echo "javadoc pre-reqs:"
|
|
for i in hadoop-project \
|
|
hadoop-common-project/hadoop-annotations; do
|
|
fn=$(module_file_fragment "${i}")
|
|
pushd "${BASEDIR}/${i}" >/dev/null || return 1
|
|
echo "cd ${i}"
|
|
echo_and_redirect "${PATCH_DIR}/maven-${fn}-install.txt" \
|
|
"${MAVEN}" "${MAVEN_ARGS[@]}" install
|
|
popd >/dev/null || return 1
|
|
done
|
|
fi
|
|
extra="-Pdocs -DskipTests"
|
|
;;
|
|
mvneclipse)
|
|
if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
|
|
ordering=.
|
|
fi
|
|
;;
|
|
mvninstall)
|
|
extra="-DskipTests"
|
|
if [[ "${repostatus}" = branch || "${BUILDMODE}" = full ]]; then
|
|
ordering=.
|
|
fi
|
|
;;
|
|
mvnsite)
|
|
if [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
|
|
ordering=.
|
|
fi
|
|
;;
|
|
unit)
|
|
if [[ "${BUILDMODE}" = full ]]; then
|
|
ordering=mvnsrc
|
|
elif [[ "${CHANGED_MODULES[*]}" =~ \. ]]; then
|
|
ordering=.
|
|
fi
|
|
|
|
if [[ ${TEST_PARALLEL} = "true" ]] ; then
|
|
if hadoop_test_parallel; then
|
|
extra="-Pparallel-tests"
|
|
if [[ -n ${TEST_THREADS:-} ]]; then
|
|
extra="${extra} -DtestsThreadCount=${TEST_THREADS}"
|
|
fi
|
|
fi
|
|
fi
|
|
needflags=true
|
|
hadoop_unittest_prereqs "${ordering}"
|
|
|
|
if ! verify_needed_test javac; then
|
|
yetus_debug "hadoop: javac not requested"
|
|
if ! verify_needed_test native; then
|
|
yetus_debug "hadoop: native not requested"
|
|
yetus_debug "hadoop: adding -DskipTests to unit test"
|
|
extra="-DskipTests"
|
|
fi
|
|
fi
|
|
|
|
for i in "${CHANGED_FILES[@]}"; do
|
|
if [[ "${i}" =~ \.bats ]]; then
|
|
foundbats=true
|
|
fi
|
|
done
|
|
|
|
if ! verify_needed_test shellcheck && [[ ${foundbats} = false ]]; then
|
|
yetus_debug "hadoop: NO shell code change detected; disabling shelltest profile"
|
|
extra="${extra} -P!shelltest"
|
|
else
|
|
extra="${extra} -Pshelltest"
|
|
fi
|
|
;;
|
|
*)
|
|
extra="-DskipTests"
|
|
;;
|
|
esac
|
|
|
|
if [[ ${needflags} = true ]]; then
|
|
flags="$(hadoop_native_flags) $(yarn_ui2_flag)"
|
|
extra="${extra} ${flags}"
|
|
fi
|
|
|
|
extra="-Ptest-patch ${extra}"
|
|
for module in $(hadoop_order ${ordering}); do
|
|
# shellcheck disable=SC2086
|
|
personality_enqueue_module ${module} ${extra}
|
|
done
|
|
}
|
|
|
|
## @description Add tests based upon personality needs
|
|
## @audience private
|
|
## @stability evolving
|
|
## @param filename
|
|
function personality_file_tests
|
|
{
|
|
declare filename=$1
|
|
|
|
yetus_debug "Using Hadoop-specific personality_file_tests"
|
|
|
|
if [[ ${filename} =~ src/main/webapp ]]; then
|
|
yetus_debug "tests/webapp: ${filename}"
|
|
add_test shadedclient
|
|
elif [[ ${filename} =~ \.sh
|
|
|| ${filename} =~ \.cmd
|
|
|| ${filename} =~ src/scripts
|
|
|| ${filename} =~ src/test/scripts
|
|
|| ${filename} =~ src/main/bin
|
|
|| ${filename} =~ shellprofile\.d
|
|
|| ${filename} =~ src/main/conf
|
|
]]; then
|
|
yetus_debug "tests/shell: ${filename}"
|
|
add_test mvnsite
|
|
add_test unit
|
|
elif [[ ${filename} =~ \.md$
|
|
|| ${filename} =~ \.md\.vm$
|
|
|| ${filename} =~ src/site
|
|
]]; then
|
|
yetus_debug "tests/site: ${filename}"
|
|
add_test mvnsite
|
|
elif [[ ${filename} =~ \.c$
|
|
|| ${filename} =~ \.cc$
|
|
|| ${filename} =~ \.h$
|
|
|| ${filename} =~ \.hh$
|
|
|| ${filename} =~ \.proto$
|
|
|| ${filename} =~ \.cmake$
|
|
|| ${filename} =~ CMakeLists.txt
|
|
]]; then
|
|
yetus_debug "tests/units: ${filename}"
|
|
add_test compile
|
|
add_test cc
|
|
add_test mvnsite
|
|
add_test javac
|
|
add_test unit
|
|
elif [[ ${filename} =~ build.xml$
|
|
|| ${filename} =~ pom.xml$
|
|
|| ${filename} =~ \.java$
|
|
|| ${filename} =~ src/main
|
|
]]; then
|
|
yetus_debug "tests/javadoc+units: ${filename}"
|
|
add_test compile
|
|
add_test javac
|
|
add_test javadoc
|
|
add_test mvninstall
|
|
add_test mvnsite
|
|
add_test unit
|
|
add_test shadedclient
|
|
fi
|
|
|
|
# if we change anything in here, e.g. the test scripts
|
|
# then run the client artifact tests
|
|
if [[ ${filename} =~ hadoop-client-modules ]]; then
|
|
add_test shadedclient
|
|
fi
|
|
|
|
if [[ ${filename} =~ src/test ]]; then
|
|
yetus_debug "tests: src/test"
|
|
add_test unit
|
|
fi
|
|
|
|
if [[ ${filename} =~ \.java$ ]]; then
|
|
add_test spotbugs
|
|
fi
|
|
}
|
|
|
|
## @description Image to print on success
|
|
## @audience private
|
|
## @stability evolving
|
|
function hadoop_console_success
|
|
{
|
|
printf "IF9fX19fX19fX18gCjwgU3VjY2VzcyEgPgogLS0tLS0tLS0tLSAKIFwgICAg";
|
|
printf "IC9cICBfX18gIC9cCiAgXCAgIC8vIFwvICAgXC8gXFwKICAgICAoKCAgICBP";
|
|
printf "IE8gICAgKSkKICAgICAgXFwgLyAgICAgXCAvLwogICAgICAgXC8gIHwgfCAg";
|
|
printf "XC8gCiAgICAgICAgfCAgfCB8ICB8ICAKICAgICAgICB8ICB8IHwgIHwgIAog";
|
|
printf "ICAgICAgIHwgICBvICAgfCAgCiAgICAgICAgfCB8ICAgfCB8ICAKICAgICAg";
|
|
printf "ICB8bXwgICB8bXwgIAo"
|
|
}
|
|
|
|
###################################################
|
|
# Hadoop project specific check of IT for shaded artifacts
|
|
|
|
add_test_type shadedclient
|
|
|
|
## @description check for test modules and add test/plugins as needed
|
|
## @audience private
|
|
## @stability evolving
|
|
function shadedclient_initialize
|
|
{
|
|
maven_add_install shadedclient
|
|
}
|
|
|
|
## @description build client facing shaded and non-shaded artifacts and test them
|
|
## @audience private
|
|
## @stability evolving
|
|
## @param repostatus
|
|
function shadedclient_rebuild
|
|
{
|
|
declare repostatus=$1
|
|
declare logfile="${PATCH_DIR}/${repostatus}-shadedclient.txt"
|
|
declare module
|
|
declare -a modules=()
|
|
|
|
if [[ ${OSTYPE} = Windows_NT ||
|
|
${OSTYPE} =~ ^CYGWIN.* ||
|
|
${OSTYPE} =~ ^MINGW32.* ||
|
|
${OSTYPE} =~ ^MSYS.* ]]; then
|
|
echo "hadoop personality: building on windows, skipping check of client artifacts."
|
|
return 0
|
|
fi
|
|
|
|
yetus_debug "hadoop personality: seeing if we need the test of client artifacts."
|
|
for module in hadoop-client-modules/hadoop-client-check-invariants \
|
|
hadoop-client-modules/hadoop-client-check-test-invariants \
|
|
hadoop-client-modules/hadoop-client-integration-tests; do
|
|
if [ -d "${module}" ]; then
|
|
yetus_debug "hadoop personality: test module '${module}' is present."
|
|
modules+=(-pl "${module}")
|
|
fi
|
|
done
|
|
if [ ${#modules[@]} -eq 0 ]; then
|
|
echo "hadoop personality: no test modules present, skipping check of client artifacts."
|
|
return 0
|
|
fi
|
|
|
|
big_console_header "Checking client artifacts on ${repostatus} with shaded clients"
|
|
|
|
echo_and_redirect "${logfile}" \
|
|
"${MAVEN}" "${MAVEN_ARGS[@]}" verify -fae --batch-mode -am \
|
|
"${modules[@]}" \
|
|
-Dtest=NoUnitTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotbugs.skip=true
|
|
|
|
big_console_header "Checking client artifacts on ${repostatus} with non-shaded clients"
|
|
|
|
echo_and_redirect "${logfile}" \
|
|
"${MAVEN}" "${MAVEN_ARGS[@]}" verify -fae --batch-mode -am \
|
|
"${modules[@]}" \
|
|
-Pnoshade -Dtest=NoUnitTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotbugs.skip=true
|
|
|
|
count=$("${GREP}" -c '\[ERROR\]' "${logfile}")
|
|
if [[ ${count} -gt 0 ]]; then
|
|
add_vote_table -1 shadedclient "${repostatus} has errors when building and testing our client artifacts."
|
|
return 1
|
|
fi
|
|
|
|
add_vote_table +1 shadedclient "${repostatus} has no errors when building and testing our client artifacts."
|
|
return 0
|
|
}
|