| #!/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 |