#!/bin/bash
-
+##export PATH=/usr/sbin:/sbin:/usr/bin:/bin
# use svn propset svn:keywords Revision to enable this
REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
CHROOTBINDIR=/root/bin
# default values, tunable with command-line options
-CVSROOT=":pserver:anon@cvs.planet-lab.org:/cvs"
+SVNPATH="svn+ssh://build@svn.one-lab.org/svn/build/trunk"
DISTRO=onelab
MAILTO="onelab-build@one-lab.org"
-TAGSFILE=onelab-tags.mk
-
+PLDISTROTAGS=onelab-tags.mk
+PLEBOX=root@planet-lab.eu
+TESTBUILDURL="http://build.one-lab.org/"
+TESTBOX=onelab-test.inria.fr
+TESTBOXSSH=root@onelab-test.inria.fr
+TESTSVNPATH="svn+ssh://build@svn.one-lab.org/svn/new_plc_api/trunk/plctest"
+TESTSCRIPT=TestMain.py
+TESTSEND=TestSendMail
####################
# plc chroot runs in UTC
DATE=$(date -u +'%Y.%m.%d')
### in the root context
function do_chroot () {
- chroot /plc/devel/root su - build <<EOF
+ chroot /plc/devel/root su - build <<EOF
$CHROOTBINDIR/$COMMAND $@
EOF
+
}
-# Notify recipient of failure
+# Notify recipient of failure or success, manage various stamps
function failure() {
- if [ -n "$MAILTO" ] ; then
- tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
- fi
- exit 1
+ set -x
+ (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k ${BUILD}/log-build.txt) >> ${BUILD}.broken
+ if [ -n "$MAILTO" ] ; then
+ tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
+ fi
+ exit 1
}
function success () {
- touch ${BUILD}/log-success.stamp
- if [ -n "$MAILTO" ] ; then
- (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
- fi
- exit 0
+ set -x
+ touch ${BUILD}.ok
+ if [ -n "$MAILTO" ] ; then
+ (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
+ fi
+ cd ${ROOT}
+ rm -f latest
+ ln -s $BASE latest
+ exit 0
}
function create_base () {
- i=
- while ! mkdir ${BASE}${i} 2>/dev/null ; do
- [ -z ${i} ] && BASE=${BASE}.
- i=$((${i}+1))
- if [ $i -gt 100 ] ; then
- echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
- exit 1
- fi
- done
- BASE=${BASE}${i}
+ i=
+ while ! mkdir ${BASE}${i} 2>/dev/null ; do
+ [ -z ${i} ] && BASE=${BASE}.
+ i=$((${i}+1))
+ if [ $i -gt 100 ] ; then
+ echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
+ exit 1
+ fi
+ done
+ BASE=${BASE}${i}
}
function use_base () {
- [ ! -d $BASE ] && mkdir $BASE
- if [ ! -d $BASE ] ; then
- echo $COMMAND failed to create base $BASE
- exit 1
- fi
+ [ ! -d $BASE ] && mkdir $BASE
+ if [ ! -d $BASE ] ; then
+ echo $COMMAND failed to create base $BASE
+ exit 1
+ fi
}
+
function build () {
- trap failure ERR INT
- set -x
+ set -x
+ set -e
+ trap failure ERR INT
- echo -n "============================== Starting $COMMAND on "
- date
+ echo -n "============================== Starting $COMMAND:build on "
+ date
- cd $ROOT
- cvs -d $CVSROOT co -r $BUILDTAG -d $BASE build
+ cd $ROOT
+ svn co $SVNPATH $BASE
- # if TAGSTAG specified : update TAGSFILE with this tag
- if [ -n "$TAGSTAG" ] ; then
- cd $BASE
- cvs up -r $TAGSTAG $TAGSFILE
- cd -
- fi
+ # if TAGSTAG specified : update PLDISTROTAGS with this tag
+ if [ -n "$TAGSTAG" ] ; then
+ cd $BASE
+ svn up -r $TAGSTAG $PLDISTROTAGS
+ cd -
+ fi
- show_env
+ show_env
- echo "Running make IN build $(pwd)"
- make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+ echo "Running make IN build $(pwd)"
+ make stage1=true ${MAKEOPTS[@]} PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE
+ # in case we use an older build
+ set +e
+ make ${MAKEOPTS[@]} PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE versions
+ set -e
+ make ${MAKEOPTS[@]} PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+
+ # restore silent mode - otherwise cron gets it
+ set +x
+}
- # only if successful
- rm -f latest
- ln -s $BASE latest
+function runtest () {
+ set -x
+ set -e
+ trap failure ERR INT
- success
+ echo -n"==============================> testing the sendmail service on PLE"
+ #under the chroot jail launch an ssh on ple and the script is run there
+ ssh ${PLEBOX} python -u /root/${TESTSEND}
+
+ echo -n "============================== Starting $COMMAND:runtest on "
+ date
+
+
+ ### compute URL to the myplc package
+ build=$1; shift
+ buildname=$(basename $build)
+ cd $build
+ rpm=$(find RPMS -name myplc\*.rpm )
+ url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
+ ### checkout the test material
+ svn co ${TESTSVNPATH} plctest
+ # compute test directory name on test box
+ testdir=plctest-${buildname}
+ # rsync/push test material onto the test box
+ ssh ${TESTBOXSSH} mkdir -p ${testdir}
+ rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
+ # invoke test on testbox
+ ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url}
+ #invoke make install from build to the testbox
+ make install PLCHOST=${TESTBOX}
+
+ if [ "$?" != 0 ] ; then
+ failure
+ fi
+
+ set +x
}
function show_env () {
- echo ROOT=$ROOT
- echo DISTRO=$DISTRO
- echo BASE=$BASE
- echo MAKEVARS="${MAKEVARS[@]}"
- echo MAKEOPTS="${MAKEOPTS[@]}"
- echo BUILDTAG="$BUILDTAG"
- echo TAGSFILE="$TAGSFILE"
- echo TAGSTAG="$TAGSTAG"
- echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
- cat $BASE/$TAGSFILE
- echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
+ echo ROOT=$ROOT
+ echo DISTRO=$DISTRO
+ echo BASE=$BASE
+ echo SVNPATH=$SVNPATH
+ echo MAKEVARS="${MAKEVARS[@]}"
+ echo MAKEOPTS="${MAKEOPTS[@]}"
+ echo PLDISTROTAGS="$PLDISTROTAGS"
+ echo TAGSTAG="$TAGSTAG"
+ echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $PLDISTROTAGS"
+ cat $BASE/$PLDISTROTAGS
+ echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
}
function usage () {
- echo "Usage: $COMMAND [option] make-targets"
- echo "This is revision $REVISION"
- echo "Supported options"
- echo " -b BASE - may include @, then replaced with current date"
- echo " -u : uses directory given as BASE as is, even if already exists"
- echo " -e : exits (does nothing) if BASE already exists"
- echo " -d DISTRO"
- echo " -t TAGSFILE"
- echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
- echo " -B BUILDTAG - the tag used to extract build/"
- echo " -s MAKEVAR=value - spaces in value are not supported"
- echo " -n passed to make"
- echo " -v verbose"
- echo " -m MAILTO"
- echo " -c CVSROOT"
- exit 1
+ echo "Usage: $COMMAND [option] make-targets"
+ echo "This is revision $REVISION"
+ echo "Supported options"
+ echo " -b BASE - may include @, then replaced with current date"
+ echo " -u : uses directory given as BASE as is, even if already exists"
+ echo " -d DISTRO"
+ echo " -t PLDISTROTAGS"
+ echo " -r TAGSTAG - a tag that refers to PLDISTROTAGS - defaults to HEAD"
+ echo " -s MAKEVAR=value - spaces in value are not supported"
+ echo " -n dry-run : -n passed to make - no mail sent"
+ echo " -m MAILTO"
+ echo " -s SVNPATH"
+ echo " -B : run build only"
+ echo " -T : run test only"
+ exit 1
}
function main () {
- if [ -d /plc/devel/data ] ; then
- do_chroot "$@"
- else
- MAKEVARS=()
- MAKEOPTS=()
- while getopts "b:ued:t:r:B:s:nvm:c:h" opt ; do
- case $opt in
- b) BASE=$OPTARG ;;
- u) USEOLD=true ;;
- e) EXITIFOLD=true ;;
- d) DISTRO=$OPTARG ;;
- t) TAGSFILE=$OPTARG ;;
- r) TAGSTAG=$OPTARG ;;
- B) BUILDTAG=$OPTARG ;;
- s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
- n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
- v) set -x ;;
- m) MAILTO=$OPTARG ;;
- c) CVSROOT=$OPTARG ;;
- h|*) usage ;;
- esac
- done
-
- shift $(($OPTIND - 1))
-
- ROOT=$ROOT/$DISTRO
- cd $ROOT
-
- MAKETARGETS="$@"
-
- ### set BUILDTAG
- [ -z "$BUILDTAG" ] && BUILDTAG=HEAD
-
+ if [ -d /plc/devel/data ] ; then
+ do_chroot "$@"
+ else
+ MAKEVARS=()
+ MAKEOPTS=()
+ DO_BUILD=true
+ DO_TEST=true
+ while getopts "b:ud:t:r:s:nm:s:BTh" opt ; do
+ case $opt in
+ b) BASE=$OPTARG ;;
+ u) USEOLD=true ;;
+ d) DISTRO=$OPTARG ;;
+ t) PLDISTROTAGS=$OPTARG ;;
+ r) TAGSTAG=$OPTARG ;;
+ s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
+ n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
+ m) MAILTO=$OPTARG ;;
+ s) SVNPATH=$OPTARG ;;
+ B) DO_TEST= ;;
+ T) DO_BUILD= ; USEOLD=true ;;
+ h|*) usage ;;
+ esac
+ done
+
+ shift $(($OPTIND - 1))
+
+ ROOT=$ROOT/$DISTRO
+ cd $ROOT
+
+ MAKETARGETS="$@"
+
### set BASE from DISTRO, if unspecified
- [ -z "$BASE" ] && BASE=${DISTRO}
- BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
-
- if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
- echo "$COMMAND: -e : exits on existing base directory $BASE"
- BUILD=$ROOT/$BASE
- failure
- exit 1
- fi
+ [ -z "$BASE" ] && BASE=${DISTRO}
+ BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
- if [ -n "$USEOLD" ] ; then
- use_base $BASE
- else
- create_base
+ if [ -n "$USEOLD" ] ; then
+ use_base $BASE
+ else
+ create_base
+ fi
+ BUILD=$ROOT/$BASE
+
+ if [ -n "$DO_SEND" ] ; then
+ test_sendmail ${BUILD} >> ${BUILD}/log-build.txt 2>&1
+ fi
+
+ if [ -n "$DO_BUILD" ] ; then
+ build >> ${BUILD}/log-build.txt 2>&1
+ touch ${BUILD}.build-ok
+ fi
+
+ if [ -n "$DO_TEST" ] ; then
+ runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1
+ fi
+
+ success >> ${BUILD}/log-build.txt 2>&1
+
fi
- BUILD=$ROOT/$BASE
-
- build >> ${BUILD}/log-build.txt 2>&1
- fi
}
##########