X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fnightly-build.sh;h=9fd29e348afa94c7592579b7183eb5e04d079d52;hb=2bf34da513a42f2eaf3af916b52fc3f0962ccf66;hp=dd513f950478279f80c4c5181b03c67f48a2af65;hpb=376abace646f6a19e85c90c9728682c67edb13d6;p=infrastructure.git diff --git a/scripts/nightly-build.sh b/scripts/nightly-build.sh index dd513f9..9fd29e3 100755 --- a/scripts/nightly-build.sh +++ b/scripts/nightly-build.sh @@ -1,139 +1,238 @@ #!/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,,' ) COMMAND=$(basename $0) ROOT=/build -CVSROOT=":pserver:anon@cvs.planet-lab.org:/cvs" -DISTRO=onelab -MAILTO="thierry.parmentelat@sophia.inria.fr" -TAG=HEAD -CHROOTDIR=/root/bin +CHROOTBINDIR=/root/bin +# default values, tunable with command-line options +SVNPATH="svn+ssh://build@svn.one-lab.org/svn/build/trunk" +DISTRO=onelab +MAILTO="onelab-build@one-lab.org" +PLDISTROTAGS=onelab-tags.mk +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 +#################### # plc chroot runs in UTC -date=$(date -u +'%Y.%m.%d') +DATE=$(date -u +'%Y.%m.%d') ### in the root context function do_chroot () { - chroot /plc/devel/root su - build <> ${BUILD}.broken + if [ -n "$MAILTO" ] ; then + tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO + fi + exit 1 } function success () { - if [ -n "$MAILTO" ] ; then - 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 () { - BASE=${TAG/HEAD/`date +%Y.%m.%d`} - 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 - show_env + cd $ROOT + svn co $SVNPATH $BASE + + # if TAGSTAG specified : update PLDISTROTAGS with this tag + if [ -n "$TAGSTAG" ] ; then + cd $BASE + svn up -r $TAGSTAG $PLDISTROTAGS + cd - + fi + + show_env - cd $ROOT - cvs -d $CVSROOT co -d $BASE build + 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 +} - echo "Running make IN build $(pwd)" - make ${MAKEOPTS[@]} TAG=${TAG} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS +function runtest () { + set -x + set -e + trap failure ERR INT - # only if successful - rm -f latest - ln -s $BASE latest + + + echo -n "============================== Starting $COMMAND:runtest on " + date + - success + ### 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 BASE=$BASE - echo TAG=$TAG - echo DISTRO=$DISTRO + 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 "Supported options" - echo " -v verbose" - echo " -d CVSROOT" - echo " -r TAG" - echo " -m MAILTO" - echo " -f DISTRO" - echo " -b BASE" - echo " -s MAKEVAR=value - spaces in value are not supported" - echo " -n passed to make" - 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 "vd:r:m:f:b:s:nh" opt ; do - case $opt in - v) set -x ;; - d) CVSROOT=$OPTARG ;; - r) TAG=$OPTARG ;; - m) MAILTO=$OPTARG ;; - f) DISTRO=$OPTARG ;; - b) BASE=$OPTARG ;; - s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;; - n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;; - h|*) usage ;; - esac - done - shift $(($OPTIND - 1)) - - MAKETARGETS="$@" - - cd $ROOT - ### determine BASE - # if specified, use it, otherwise create from date - if [ -z "$BASE" ] ; then - create_base + if [ -d /plc/devel/data ] ; then + do_chroot "$@" else - use_base $BASE - fi - BUILD=$ROOT/$BASE + 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") - build >> ${BUILD}/log-build.txt 2>&1 - fi + 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 } ##########