From 92fd6d40f2c52308202b65cb2ef30474a299c43e Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 7 Apr 2009 17:28:14 +0000 Subject: [PATCH] Added to repository. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@755 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- nightly/README.txt | 44 ++++++++++ nightly/bin/nightly | 159 +++++++++++++++++++++++++++++++++++ nightly/conf/pcbart.conf | 6 ++ nightly/conf/pcbart.sendmail | 14 +++ 4 files changed, 223 insertions(+) create mode 100644 nightly/README.txt create mode 100755 nightly/bin/nightly create mode 100644 nightly/conf/pcbart.conf create mode 100755 nightly/conf/pcbart.sendmail diff --git a/nightly/README.txt b/nightly/README.txt new file mode 100644 index 000000000..c5f931dd2 --- /dev/null +++ b/nightly/README.txt @@ -0,0 +1,44 @@ + +This directory (nightly/) contains a simple, automatic build-and-test +system for SCST, intended to be run by cron. + +Note (importantly) it doesn't test the sources in the tree of which +this directory is a part (viz, nightly/..). Instead it checks out +a complete new tree, builds and tests that independently of the +existing tree. + +To use, choose a tag, probably a machine name, and run + + bin/nightly + +and supply the following two config files: + +- conf/.conf: this is sourced by the 'nightly' script, and can define + any or all of the following environment variables: + + ABT_DETAILS: describes the machine in more detail, eg. the OS. The default + is empty. + ABT_EVAL: if provided, it must be the name of a shell script that executes + the shell command $1 with arguments $2 .. ${$#}. Allows to compile and + run the SCST regression tests on another system than the system the + 'nightly' script runs on. It is assumed that the remote system shares the + local filesystem tree through e.g. NFS. It is the responsibility of the + shell script to set the remote working directory such that it matches the + local current directory ($PWD). + ABT_JOBS: allows parallel builds -- it's passed as the argument to "make + -j" when building SCST and the tests. The default is 1. + ABT_KERNELS: kernel version numbers to test SCST against. + ABT_TMPDIR: absolute path in which temporary files will be stored. + +- conf/.sendmail: this should be a script that sends an email to the + desired recipient (eg. the scst-developers list). It takes three + command line arguments. The first is the email subject line, the second + is the name of the file containing the email's body (showing the tests + that failed, and the difference between now and 24 hours ago), the third + is the name of the file containing all the diffs (which can be made into + an attachment, for example). + +CREDITS + +The automatic build-and-test infrastructure for the SCST project reuses some +ideas and shell script code from a similar infrastructure in the Valgrind project. diff --git a/nightly/bin/nightly b/nightly/bin/nightly new file mode 100755 index 000000000..d459d04d0 --- /dev/null +++ b/nightly/bin/nightly @@ -0,0 +1,159 @@ +#!/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 function +#---------------------------------------------------------------------------- + +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 +} + +#---------------------------------------------------------------------------- +# Startup +#---------------------------------------------------------------------------- +# Must have exactly one argument +if [ "$#" -ne 1 ] ; then + echo "usage: $0 " + 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"` + +svn_old_date=`date --date=yesterday +%Y-%m-%dT%H:%M:%S` +svn_new_date=`date --date=today +%Y-%m-%dT%H:%M:%S` + +cd $ABT_TOP + +# Setup any relevant environment variables from conf/.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 +#---------------------------------------------------------------------------- + +# 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 + svn_date="$svn_old_date" + else + svn_date="$svn_new_date" + fi + + # Check out and run the tests. + runcmd ${logfile} \ + "Checking out SCST source tree" \ + "svn co -q -r {${svn_date}} https://scst.svn.sourceforge.net/svnroot/scst/trunk ${ABT_TMPDIR}/scst" && \ + echo "Checked out SCST revision `svn info ${ABT_TMPDIR}/scst | grep Revision: | sed 's/.* //'`" &&\ + runcmd ${logfile} \ + "Running regression tests" \ + "cd ${ABT_TMPDIR}/scst && scripts/run-regression-tests -d ${ABT_TMPDIR}/regtest -j ${ABT_JOBS} ${ABT_KERNELS}" + runcmd ${logfile} \ + "Cleaning up" \ + "rm -rf ${ABT_TMPDIR}" + + cat ${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 ")" \ + "started at" $ABT_START >> final + +# If the results differ from 24 hours ago, print extra stuff. +diff -C1 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 + +# Always show the current results. +cat new.short >> final + +if [ $changed != 0 ] ; then + echo "=================================================" >> final + echo "== Results from 24 hours ago ==" >> final + echo "=================================================" >> final + cat old.short >> final + + echo >> final + echo "=================================================" >> final + echo "== Difference between 24 hours ago and now ==" >> final + echo "=================================================" >> final + echo >> final + cat diff.short >> final + echo >> final +fi + +# Use the conf/.sendmail script to email the results. +conf/$ABT_MACHINE.sendmail \ + "$changed_str$ABT_START nightly build ($ABT_MACHINE, $ABT_DETAILS)" \ + final > sendmail.log 2>&1 diff --git a/nightly/conf/pcbart.conf b/nightly/conf/pcbart.conf new file mode 100644 index 000000000..245309353 --- /dev/null +++ b/nightly/conf/pcbart.conf @@ -0,0 +1,6 @@ + +# Specifics for Bart Van Assche's PC. + +ABT_DETAILS="PC Bart, x86_64, openSUSE 11.1" +ABT_JOBS=3 +ABT_KERNELS="2.6.23.17 2.6.29.1" diff --git a/nightly/conf/pcbart.sendmail b/nightly/conf/pcbart.sendmail new file mode 100755 index 000000000..d7108c223 --- /dev/null +++ b/nightly/conf/pcbart.sendmail @@ -0,0 +1,14 @@ +#!/bin/sh + +# usage: $0 subject file-to-mail [file-to-attach] +# Don't forget to set the variables 'from' and 'realname' in ~/.muttrc !! + +recipients="scst-devel@lists.sourceforge.net" +#recipients="bart.vanassche@gmail.com,bart" +if [ $# -ge 3 ]; then + gzip -9 <"$3" >"$3.gz" + mutt -s "$1" -a "$3.gz" ${recipients} < "$2" + rm -f "$3.gz" +else + mutt -s "$1" ${recipients} < "$2" +fi