blob: 9173eeac5541c088d80a69fb2d15b712ab4c4579 [file] [log] [blame]
#!/bin/sh
#----------------------------------------------------------------------------
# Automated build and test for SCST. Compares SCST build from 24 hours
# ago with the current one. See the README.txt on how to run it.
#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
# Helper functions
#----------------------------------------------------------------------------
# Returns the revision number of the source files with date $1.
get_revision() {
if svn info . >/dev/null 2>&1; then
svn info -r "{$1}" "${scst_repo}" | sed -n 's/^Revision: //p'
else
git log --before="$1" | head -n 1 | cut -f2 -d ' '
fi
}
runcmd () {
logfile="$1"
str="$2"
shift 2
# Header in short logfile
printf "%-30s ..." "$str" >> ${logfile}.short
# Header and command in verbose logfile
{ printf "%-30s ... " "$str"; echo "$*"; } >> ${logfile}.verbose
# Run the command
("${ABT_EVAL}" "$*") >> ${logfile}.verbose 2>&1
res=$?
# Write result to the short logfile
if [ $res = 0 ]
then
echo "done" >> ${logfile}.short
else
echo "failed" >> ${logfile}.short
fi
return $res
}
usage () {
echo "usage: $0 [-r <recipient>] <tag>"
}
#----------------------------------------------------------------------------
# Startup
#----------------------------------------------------------------------------
scst_rootdir="$(dirname "$(dirname "$(cd "$(dirname "$0")" && echo "$PWD")")")"
if svn info . >/dev/null 2>&1; then
scst_repo="$(svn info "$scst_rootdir" | sed -n -e 's|\+ssh://[^@]*@|://|' -e 's/^URL: //p')"
else
scst_repo="$scst_rootdir"
fi
sendmail_opts=""
run_if_unchanged="false"
set -- $(/usr/bin/getopt "ahr:" "$@")
while [ "$1" != "${1#-}" ]
do
case "$1" in
'-a') run_if_unchanged=true; shift;;
'-h') usage; exit 1;;
'-r') sendmail_opts="$1 $2"; shift; shift;;
'--') shift;;
*) usage; exit 1;;
esac
done
# Must have exactly one argument
if [ "$#" -ne 1 ] ; then
usage
exit 1
fi
# Get args from command line
if [ "${arg0#/}" = "${arg0}" ]; then
scriptpath=`dirname $PWD/$0`
else
scriptpath=`dirname $0`
fi
ABT_TOP=`dirname ${scriptpath}`
ABT_MACHINE="$1"
# Get times and date
ABT_START=`date "+%F %H:%M:%S %Z"`
old_date=`date --date=yesterday +%Y-%m-%dT%H:%M:%S`
new_date=`date --date=today +%Y-%m-%dT%H:%M:%S`
cd $ABT_TOP
# Clean up output files produced by a previous run.
rm -rf diffs diff.short final new.short new.verbose old.short old.verbose
rm -rf sendmail.log unchanged.log
# Setup any relevant environment variables from conf/<tag>.conf.
. conf/$ABT_MACHINE.conf
if [ "${ABT_JOBS}" = "" ]; then
ABT_JOBS=1
fi
if [ "${ABT_EVAL}" = "" ]; then
ABT_EVAL="eval"
fi
if [ "${ABT_TMPDIR}" = "" ]; then
ABT_TMPDIR="/tmp/scst-$$"
fi
#----------------------------------------------------------------------------
# Check out, build, test
#----------------------------------------------------------------------------
old_rev="`get_revision ${old_date}`"
new_rev="`get_revision ${new_date}`"
if [ "${run_if_unchanged}" != "true" -a "${old_rev}" = "${new_rev}" ]; then
echo "Both {$old_date} and {$new_date} correspond to r${new_rev}"\
"-- skipping nightly build." >unchanged.log
exit 0
fi
# Do everything twice -- once for the 24 hours old SCST, and once
# for the current one.
for logfile in old new ; do
# Remove the old scst directory.
rm -rf "${ABT_TMPDIR}"
mkdir -p "${ABT_TMPDIR}/scst"
# Remove old short and verbose log files, and start the new ones.
for ext in short verbose ; do
echo > ${logfile}.$ext
done
# Choose the current SCST, or one from 24 hours ago.
if [ ${logfile} = "old" ] ; then
date="$old_date"
rev="$old_rev"
else
date="$new_date"
rev="$new_rev"
fi
# Check out and run the tests.
runcmd ${logfile} \
"Checking out SCST source tree" \
"if svn info . >/dev/null 2>&1; then \
svn co -q -r {${date}} ${scst_repo} ${ABT_TMPDIR}/scst; \
else \
( rmdir ${ABT_TMPDIR}/scst && \
git clone -q ${scst_repo} ${ABT_TMPDIR}/scst && \
cd ${ABT_TMPDIR}/scst && git reset --hard ${rev} ); \
fi" &&
runcmd ${logfile} \
"Running regression tests" \
"cd ${ABT_TMPDIR}/scst && \
scripts/run-regression-tests -k -d ${ABT_TMPDIR}/regtest \
-j ${ABT_JOBS} -q ${ABT_KERNELS}"
runcmd ${logfile} \
"Cleaning up" \
"rm -rf ${ABT_TMPDIR}"
tail -n +4 ${logfile}.verbose >>${logfile}.short
done
#----------------------------------------------------------------------------
# Prepare results and send
#----------------------------------------------------------------------------
# 'final' shows the difference between the old and new results
echo > final
echo "Nightly build on $ABT_MACHINE ($ABT_DETAILS)" >> final
echo "started at $ABT_START and compared r${old_rev} with r${new_rev}." \
>> final
# If the results differ from 24 hours ago, print extra stuff.
diff -u old.short new.short > diff.short
changed=$?
if [ $changed != 0 ] ; then
echo "Results differ from 24 hours ago" >> final
changed_str=""
else
echo "Results unchanged from 24 hours ago" >> final
changed_str="(unchanged) "
fi
if [ $changed != 0 ] ; then
echo "=================================================" >> final
echo "== Difference between 24 hours ago and now ==" >> final
echo "=================================================" >> final
echo >> final
cat diff.short >> final
echo >> final
fi
# Always show the current results.
echo >> final
echo "=================================================" >> final
echo "== Current results ==" >> final
echo "=================================================" >> final
cat new.short >> final
echo >> final
if [ $changed != 0 ] ; then
echo "=================================================" >> final
echo "== Results from 24 hours ago ==" >> final
echo "=================================================" >> final
cat old.short >> final
echo >> final
fi
# Use the conf/<tag>.sendmail script to email the results.
conf/$ABT_MACHINE.sendmail \
${sendmail_opts} \
"$changed_str$ABT_START $(basename "$scst_repo") nightly build ($ABT_MACHINE, $ABT_DETAILS)" \
final > sendmail.log 2>&1