From fd0e5b5eb716340839374f5ec2ba0a23cc64050b Mon Sep 17 00:00:00 2001 From: thierry Date: Mon, 5 Nov 2007 23:25:11 +0000 Subject: [PATCH] first attempt --- scripts/nightly-build-vserver.sh | 268 +++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 scripts/nightly-build-vserver.sh diff --git a/scripts/nightly-build-vserver.sh b/scripts/nightly-build-vserver.sh new file mode 100644 index 0000000..741f029 --- /dev/null +++ b/scripts/nightly-build-vserver.sh @@ -0,0 +1,268 @@ +#!/bin/bash +REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' ) + +COMMANDPATH=$0 +COMMAND=$(basename $0) +ROOT=/build + +# default values, tunable with command-line options +DEFAULT_FC_DISTRO=fc6 +SVNPATH="http://svn.one-lab.org/build/trunk" +DISTRO=onelab +MAILTO="onelab-build@one-lab.org" +DISTROMAKETAGS=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="http://svn.one-lab.org/new_plc_api/trunk/plctest" +TESTSCRIPT=TestMain.py +TESTSEND=TestSendMail +#################### +# plc chroot runs in UTC +DATE=$(date -u +'%Y.%m.%d') + +###### copy this command into the vserver before invoking it - install in / +###function install_in_vserver () { +### vserver=$1; shift +### cp $COMMANDPATH /vservers/$vserver/$COMMAND +###} +### +###function run_in_vserver () { +### vserver=$1; shift +### vserver $vserver exec /$COMMAND "$@" +###} + +# Notify recipient of failure or success, manage various stamps +function failure() { + 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 () { + 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_vserver () { +} + +function use_base () { + if + [ ! -d $BASE ] && mkdir $BASE + if [ ! -d $BASE ] ; then + echo $COMMAND failed to create base $BASE + exit 1 + fi +} + + +function build () { + set -x + set -e + trap failure ERR INT + + echo -n "============================== Starting $COMMAND:build on " + date + + cd $ROOT + svn co $SVNPATH $BASE + + # if TAGSRELEASE specified : update DISTROMAKETAGS with this tag + if [ -n "$TAGSRELEASE" ] ; then + cd $BASE + svn up -r $TAGSRELEASE $DISTROMAKETAGS + cd - + fi + + show_env + + echo "Running make IN build $(pwd)" + make stage1=true ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE + # in case we use an older build + set +e + make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE versions + set -e + make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS + + # restore silent mode - otherwise cron gets it + set +x +} + +function runtest () { + set -x + set -e + trap failure ERR INT + + echo -n"==============================> testing the sendmail service on PLE" + 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 FC_DISTRO=$FC_DISTRO + echo DISTRO=$DISTRO + echo BASE=$BASE + echo SVNPATH=$SVNPATH + echo MAKEVARS="${MAKEVARS[@]}" + echo MAKEOPTS="${MAKEOPTS[@]}" + echo DISTROMAKETAGS="$DISTROMAKETAGS" + echo TAGSRELEASE="$TAGSRELEASE" + echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS" + cat $BASE/$DISTROMAKETAGS + echo "XXXXXXXXXXXXXXXXXXXX end tags definition" +} + +function usage () { + echo "Usage: $COMMAND [option] make-targets" + echo "This is revision $REVISION" + echo "Supported options" + echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO" + 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 PLDISTRO" + echo " -t PLDISTROMAKETAGS" + echo " -r TAGSRELEASE - a release number that refers to PLDISTROMAKETAGS - 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 () { + + # parse arguments + MAKEVARS=() + MAKEOPTS=() + DO_BUILD=true + DO_TEST=true + while getopts "f:b:ud:t:r:s:nm:s:BTh" opt ; do + case $opt in + f) FC_DISTRO=$OPTARG ;; + b) BASE=$OPTARG ;; + u) USEOLD=true ;; + d) DISTRO=$OPTARG ;; + t) DISTROMAKETAGS=$OPTARG ;; + r) TAGSRELEASE=$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)) + + [ -z "$FC_DISTRO" ] && FC_DISTRO=$DEFAULT_FC_DISTRO + MAKETARGETS="$@" + + ### set BASE from DISTRO, if unspecified + [ -z "$BASE" ] && BASE=${DISTRO}-${FC_DISTRO} + BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g") + + # if we run in the root context : + # (*) create or check for the vserver to use + # (*) copy this command in the vserver + # (*) invoke it + + if [ -d /vservers ] ; then + + if [ -n "$USEOLD" ] ; then + ### Re-use a vserver (finish an unfinished build..) + if [ ! -d /vservers/${BASE} ] ; then + echo $COMMAND : cannot find vserver $BASE + exit 1 + fi + # update build + vserver ${BASE} exec svn update /build + else + # create vserver: check it does not exist yet + i= + while [ -d /vservers/${BASE}${i} ] ; do + [ -z ${i} ] && BASE=${BASE}. + i=$((${i}+1)) + if [ $i -gt 100 ] ; then + echo "$COMMAND: Failed to create release directory /vservers/${BASE}${i}" + exit 1 + fi + done + BASE=${BASE}${i} + ### extract vbuild.setup and run it + svn checkout $SVNPATH/vbuild.setup /tmp/vbuild-$$ + # Create vserver + /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} $DISTRO + # Extract build + vserver ${BASE} exec svn checkout ${SVNPATH} /build + fi + + cp $COMMANDPATH /vservers/${BASE} + # invoke this command in the vserver + vserver ${BASE} exec /$COMMAND "$@" + + else + if [ -n "$DO_BUILD" ] ; then + build >> /log-build.txt 2>&1 + touch /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 + + # todo : gather results from various vservers into a single build index + #ROOT=$ROOT/$DISTRO + #BUILD=$ROOT/$BASE + +} + +########## +main "$@" -- 2.43.0