blob: bb0a24ba50bfcf265caa4c87cb39af952f3605c1 [file] [log] [blame]
#!/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.
#
#
#
# example usage:
#
# sh build.sh -ptOvI
#
#
# see serve-timeline.sh to serve up the generated website (requires JDK18)
#
BASENAME_0=$(basename $0)
usage() {
echo "" >&2
echo "$BASENAME_0 options:" >&2
echo "" >&2
echo " -C run 'git clean -dfx first" >&2
echo " -H run 'git reset --hard origin/<branchname>' first" >&2
echo " -p run 'git pull --ff-only' first" >&2
echo " -c include 'clean' goal" >&2
echo " -O do NOT add '-o' (offline) flag, ie bring down any new dependencies" >&2
echo " -t skip tests" >&2
echo " -l single threaded, do NOT add '-T1C' flag" >&2
echo " -k use 'package' rather than 'install'. Does not run integ tests. Cannot combine with '-y'" >&2
echo " -y use 'verify' rather than 'install'. Cannot combine with '-k'" >&2
echo " -a append '-Dmodule-all'. Cannot combine with '-I' or '-K'" >&2
echo " -K append '-Dmodule-all-except-kroviz'. Cannot combine with '-a' or '-I'" >&2
echo " -I append '-Dmodule-all-except-incubator'. Cannot combine with '-a' or '-K'" >&2
echo " -d use mvnd rather than mvn (requires: mvndaemon)" >&2
echo " -n serve up timeline afterwards (prereq: npm i -g serve)" >&2
echo " -F do NOT search for Failures and Errors at the end" >&2
echo " -S do NOT print summary or last 50 lines at the end" >&2
echo " -w whatif - don't run the command but do print it out. Implies -v (verbose)" >&2
echo " -v verbose" >&2
echo " -e edit log file at end. Cannot combine with '-v'" >&2
echo "" >&2
echo "" >&2
echo "example usage:" >&2
echo "" >&2
echo "sh build.sh -tOd # no tests, no offline, use mvnd, released only" >&2
echo "sh build.sh -ptOdI # pull, no tests, no offline, use mvnd, no incubator" >&2
echo "sh build.sh -pctOvI # pull, clean, no tests, no offline, verbose, no incubator" >&2
echo "sh build.sh -CHOdI # fetch, clean and reset, no offline, use mvnd, no incubator" >&2
echo "" >&2
}
GIT_CLEAN_HARD=false
GIT_RESET_HARD=false
GIT_PULL=false
CLEAN=false
SKIP_TESTS=false
SKIP_OFFLINE=false
PACKAGE_ONLY=false
VERIFY_ONLY=false
TIMELINE=false
WHATIF=false
SINGLE_THREADED=false
ALL=false
ALL_EXCEPT_KROVIZ=false
ALL_EXCEPT_INCUBATOR=false
USE_MVND=false
SKIP_SEARCH_FOR_FAILURES=false
SKIP_SUMMARY=false
EDIT=false
VERBOSE=false
MVN_LOG=/tmp/$BASENAME_0.$$.log
while getopts 'CHprcntlkyaIKOdFSwveh' opt
do
case $opt in
C) GIT_CLEAN_HARD=true ;;
H) GIT_RESET_HARD=true ;;
p) GIT_PULL=true ;;
c) CLEAN=true ;;
O) SKIP_OFFLINE=true ;;
l) SINGLE_THREADED=true ;;
t) SKIP_TESTS=true ;;
k) PACKAGE_ONLY=true ;;
y) VERIFY_ONLY=true ;;
a) ALL=true ;;
I) ALL_EXCEPT_INCUBATOR=true ;;
K) ALL_EXCEPT_KROVIZ=true ;;
n) TIMELINE=true ;;
d) USE_MVND=true ;;
F) SKIP_SEARCH_FOR_FAILURES=true ;;
S) SKIP_SUMMARY=true ;;
w) WHATIF=true ;;
v) VERBOSE=true ;;
e) EDIT=true ;;
h) usage
exit 1
;;
*) echo "unknown option $opt - aborting" >&2
usage
exit 1
;;
esac
done
shift $((OPTIND-1))
echo ""
if [ "$VERBOSE" = "true" ]; then
echo "-C (git clean -dfx) : $GIT_CLEAN_HARD"
echo "-H (git reset --hard) : $GIT_RESET_HARD"
echo "-p (git pull --ff-only) : $GIT_PULL"
echo "-c mvn clean : $CLEAN"
echo "-t skip all tests (mvn -DskipTests) : $SKIP_TESTS"
echo "-O not mvn --offline : $SKIP_OFFLINE"
echo "-l not mvn -T1C : $SINGLE_THREADED"
echo "-k mvn package : $PACKAGE_ONLY"
echo "-y mvn verify : $VERIFY_ONLY"
echo "-a include ALL modules : $ALL"
echo "-I include all modules except incubator : $ALL_EXCEPT_INCUBATOR"
echo "-K include all modules except kroviz : $ALL_EXCEPT_KROVIZ"
echo "-d use mvnd rather than mvn : $USE_MVND"
echo "-n serve up timeline : $TIMELINE"
echo "-F skip search for failures : $SKIP_SEARCH_FOR_FAILURES"
echo "-S skip summary : $SKIP_SUMMARY"
echo "-w what-if : $WHATIF"
echo "-v verbose : $VERBOSE"
echo ""
fi
if [ "$PACKAGE_ONLY" = "true" ] && [ "$VERIFY_ONLY" = "true" ]; then
echo "$BASENAME_0 : cannot use '-y' and '-k' flags together" >&2
usage
exit 1
fi
if [ "$ALL" = "true" ] && [ "$ALL_EXCEPT_INCUBATOR" = "true" ]; then
echo "$BASENAME_0 : cannot use '-a' and '-I' flags together" >&2
usage
exit 1
fi
if [ "$ALL" = "true" ] && [ "$ALL_EXCEPT_KROVIZ" = "true" ]; then
echo "$BASENAME_0 : cannot use '-a' and '-K' flags together" >&2
usage
exit 1
fi
if [ "$ALL_EXCEPT_INCUBATOR" = "true" ] && [ "$ALL_EXCEPT_KROVIZ" = "true" ]; then
echo "$BASENAME_0 : cannot use '-I' and '-K' flags together" >&2
usage
exit 1
fi
if [ "$VERBOSE" = "true" ] && [ "$EDIT" = "true" ]; then
echo "$BASENAME_0 : cannot use '-v' and '-e' flags together" >&2
usage
exit 1
fi
OPTS=""
if [ "$CLEAN" = "true" ]; then
OPTS="$OPTS clean"
fi
if [ "$SKIP_TESTS" = "true" ]; then
OPTS="$OPTS -DskipTests=true"
fi
if [ "$ALL" = "true" ]; then
OPTS="$OPTS -Dmodule-all"
fi
if [ "$ALL_EXCEPT_INCUBATOR" = "true" ]; then
OPTS="$OPTS -Dmodule-all-except-incubator"
fi
if [ "$ALL_EXCEPT_KROVIZ" = "true" ]; then
OPTS="$OPTS -Dmodule-all-except-kroviz"
fi
if [ "$SKIP_OFFLINE" = "false" ]; then
OPTS="$OPTS -o"
fi
if [ "$SINGLE_THREADED" = "false" ]; then
OPTS="$OPTS -T1C"
fi
if [ "$PACKAGE_ONLY" = "true" ]; then
OPTS="$OPTS package"
else
if [ "$VERIFY_ONLY" = "true" ]; then
OPTS="$OPTS verify"
else
OPTS="$OPTS install"
fi
fi
if [ "$USE_MVND" = "true" ]; then
CMD="mvnd"
else
CMD="mvn"
fi
CURRENT_BRANCH=$(git branch --show-current)
if [ "$WHATIF" = "true" ]; then
echo git fetch
if [ "$GIT_CLEAN_HARD" = "true" ]; then
echo git clean -dfx
fi
if [ "$GIT_RESET_HARD" = "true" ]; then
echo git reset --hard origin/$CURRENT_BRANCH
fi
if [ "$GIT_PULL" = "true" ]; then
echo git pull --ff-only
fi
if [ "$VERBOSE" = "true" ]; then
echo "$CMD $OPTS $* 2>&1 | tee $MVN_LOG "
else
OPTS="$OPTS --log-file $MVN_LOG"
echo $CMD $OPTS "$@"
fi
if [ "$SKIP_SEARCH_FOR_FAILURES" = "false" ]; then
echo "... grep for failures/errors"
fi
if [ "$SKIP_SUMMARY" = "false" ]; then
echo "... print summary"
fi
if [ "$TIMELINE" = "true" ]; then
echo "serve -d target/timeline"
fi
echo ""
else
git fetch
if [ $? -ne 0 ]; then
echo "git fetch failed; aborting" >&2
exit 1
fi
if [ "$GIT_CLEAN_HARD" = "true" ]; then
git clean -dfx
if [ $? -ne 0 ]; then
echo "git clean -dfx failed; aborting" >&2
exit 1
fi
fi
if [ "$GIT_RESET_HARD" = "true" ]; then
git reset --hard origin/$CURRENT_BRANCH
if [ $? -ne 0 ]; then
echo "git reset --hard origin/$CURRENT_BRANCH failed; aborting" >&2
exit 1
fi
fi
if [ "$GIT_PULL" = "true" ]; then
git pull --ff-only
if [ $? -ne 0 ]; then
echo "git pull --ff-only failed; aborting" >&2
exit 1
fi
fi
if [ "$VERBOSE" = "true" ]; then
echo "$CMD $OPTS $* 2>&1 | tee $MVN_LOG"
$CMD $OPTS "$@" 2>&1 | tee $MVN_LOG
else
OPTS="$OPTS --log-file $MVN_LOG"
echo "$CMD $OPTS $*"
$CMD $OPTS "$@"
fi
if [ "$SKIP_SEARCH_FOR_FAILURES" = "false" ]; then
if [ "$VERBOSE" = "true" ]; then
echo "searching for failures and errors (in $MVN_LOG) ..."
fi
grep -in -E 'Failures:\s[1-9]+, Errors: [0-9]+, Skipped: [0-9]+$' -B 20 $MVN_LOG
grep -in -E 'Failures:\s[0-9]+, Errors: [1-9]+, Skipped: [0-9]+$' -B 20 $MVN_LOG
else
if [ "$VERBOSE" = "true" ]; then
echo "NOT searching for failures and errors"
fi
fi
if [ "$SKIP_SUMMARY" = "false" ]; then
if [ "$VERBOSE" = "true" ]; then
echo "printing summary..."
fi
if grep -n "Segment walltime" $MVN_LOG ; then
if [ "$VERBOSE" = "true" ]; then
echo "found 'Segment walltime' ......"
fi
tail -n +$(grep -n "Segment walltime" $MVN_LOG | cut -f1 -d:) $MVN_LOG
else
if [ "$VERBOSE" = "true" ]; then
echo "did NOT find 'Segment walltime', so printing last 120 lines of log"
fi
tail -n 120 $MVN_LOG
fi
else
if [ "$VERBOSE" = "true" ]; then
echo "NOT printing any summary"
fi
fi
if [ "$EDIT" = "true" ]; then
vi $MVN_LOG
fi
if [ "$TIMELINE" = "true" ]; then
## when we eventually target only jdk18 and above, then can replace with:
## jwebserver -d $(pwd)/target/timeline -b ::
serve -d target/timeline
fi
fi