reviewed logging, and attempted to enable runtest
[infrastructure.git] / scripts / nightly-build-vserver.sh
index dafc250..f692266 100755 (executable)
@@ -3,7 +3,6 @@ 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
@@ -11,36 +10,37 @@ 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
+
+# web publishing results
+WEBPATH=/build/@DISTRO@/@BUILD@
+WEBLOG=/build/@DISTRO@/@BUILD@.txt
+
+# for the test part
 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
+# assuming vserver runs in UTC
 DATE=$(date -u +'%Y.%m.%d')
 
 # 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
+    (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k /log-build.txt) >> $LOG
     if [ -n "$MAILTO" ] ; then
-       tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
+       tail -c 8k /log-build.txt | mail -s "Failures for ${BASE}" $MAILTO
     fi
     exit 1
 }
 
 function success () {
     set -x
-    touch ${BUILD}.ok
+    touch $(dirname $LOG)/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
+       (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
     fi
-    cd ${ROOT}
-    rm -f latest
-    ln -s $BASE latest
     exit 0
 }
 
@@ -52,25 +52,25 @@ function build () {
     echo -n "============================== Starting $COMMAND:build on "
     date
 
-    cd $ROOT
-    svn co $SVNPATH $BASE
+    cd /
+#    svn checkout $SVNPATH $BASE
 
   # if TAGSRELEASE specified : update DISTROMAKETAGS with this tag
     if [ -n "$TAGSRELEASE" ] ; then
-       cd $BASE
+       cd build
        svn up -r $TAGSRELEASE $DISTROMAKETAGS
-       cd -
+       cd - > /dev/null
     fi
 
     show_env
     
-    echo "Running make IN build $(pwd)"
-    make stage1=true ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE 
+    echo "Running make IN $(pwd)"
+    make stage1=true "${MAKEOPTS[@]}" DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} "${MAKEVARS[@]}" -C /build
     # in case we use an older build
     set +e
-    make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE versions
+    make "${MAKEOPTS[@]}" DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} "${MAKEVARS[@]}" -C /build versions
     set -e
-    make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+    make "${MAKEOPTS[@]}" DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} "${MAKEVARS[@]}" -C /build $MAKETARGETS
 
     # restore silent mode - otherwise cron gets it
     set +x
@@ -81,19 +81,13 @@ function runtest () {
     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
+    cd /build
     rpm=$(find RPMS -name myplc\*.rpm )
-    url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
+    url=${TESTBUILDURL}${DISTRO}/${BASE}/${rpm}
   ### checkout the test material
     svn co ${TESTSVNPATH} plctest
   # compute test directory name on test box
@@ -114,7 +108,7 @@ function runtest () {
 }
 
 function show_env () {
-    echo ROOT=$ROOT
+#    echo ROOT=$ROOT
     echo FC_DISTRO=$FC_DISTRO
     echo DISTRO=$DISTRO
     echo BASE=$BASE
@@ -123,8 +117,12 @@ function show_env () {
     echo MAKEOPTS="${MAKEOPTS[@]}"
     echo DISTROMAKETAGS="$DISTROMAKETAGS"
     echo TAGSRELEASE="$TAGSRELEASE"
-    echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
-    cat $BASE/$DISTROMAKETAGS
+    if [ -f /build/$DISTROMAKETAGS ] ; then
+       echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
+       cat /build/$DISTROMAKETAGS
+    else
+       echo "no tags definition yet - probably out of vserver"
+    fi
     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
 }
 
@@ -132,16 +130,16 @@ 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 " -n dry-run : -n passed to make - no mail sent"
     echo " -d PLDISTRO"
+    echo " -b BASE - may include @, then replaced with current date"
     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 " -s SVNPATH - where to fetch the build module"
+    echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO"
+    echo " -u : uses directory given as BASE as is, even if already exists"
+    echo " -s MAKEVAR=value"
     echo " -m MAILTO"
-    echo " -s SVNPATH"
     echo " -B : run build only"
     echo " -T : run test only"
     exit 1
@@ -149,6 +147,13 @@ function usage () {
 
 function main () {
 
+    set -x
+    set -e
+
+    # preserve arguments for passing them again later
+    declare -a argv
+    for arg in "$@"; do argv=(${argv[@]} "$arg") ; done
+    
     # parse arguments
     MAKEVARS=()
     MAKEOPTS=()
@@ -162,7 +167,7 @@ function main () {
            d) DISTRO=$OPTARG ;;
            t) DISTROMAKETAGS=$OPTARG ;;
            r) TAGSRELEASE=$OPTARG ;;
-           s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
+           s) MAKEVARS=(${MAKEVARS[@]} "$OPTARG") ;;
            n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
            m) MAILTO=$OPTARG ;;
            s) SVNPATH=$OPTARG ;;
@@ -181,12 +186,11 @@ function main () {
     [ -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
+        # we run in the root context : 
+        # (*) create or check for the vserver to use
+        # (*) copy this command in the vserver
+        # (*) invoke it
        
        if [ -n "$USEOLD" ] ; then
             ### Re-use a vserver (finish an unfinished build..)
@@ -195,52 +199,69 @@ function main () {
                exit 1
            fi
            # update build
+           LOG=/vservers/${BASE}/build/build-log.txt
+           # redirect stdout and stderr from now on
+           exec > $LOG 2>&1 
+           echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date)
            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}.
+               # we name subsequent builds <base>-n<i> so the logs and builds get sorted properly
+               [ -z ${i} ] && BASE=${BASE}-n
                i=$((${i}+1))
                if [ $i -gt 100 ] ; then
-                   echo "$COMMAND: Failed to create release directory /vservers/${BASE}${i}"
+                   echo "$COMMAND: Failed to create build vserver /vservers/${BASE}${i}"
                    exit 1
                fi
            done
            BASE=${BASE}${i}
+           LOG=/vservers/${BASE}/build/build-log.txt
+           # redirect stdout and stderr from now on
+           exec > $LOG 2>&1 
+           echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date)
+           show_env
            ### extract vbuild.setup and run it
-           svn cat $SVNPATH/vbuild.setup /tmp/vbuild-$$
-           svn cat $SVNPATH/${DISTRO}-devel.lst /tmp/${DISTRO}-devel.lst
+           svn cat $SVNPATH/vbuild.setup /tmp/vbuild-$$
+           svn cat $SVNPATH/${DISTRO}-devel.lst /tmp/${DISTRO}-devel.lst
             # Create vserver
            cd /tmp
-           /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} ${DISTRO}-devel
+           chmod +x vbuild-$$
+           /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} ${DISTRO}
            cd -
            # Extract build
            vserver ${BASE} exec svn checkout ${SVNPATH} /build
        fi
 
-       cp $COMMANDPATH /vservers/${BASE}
+       echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date)
+       cp $COMMANDPATH /vservers/${BASE}/
        # invoke this command in the vserver
-       vserver ${BASE} exec /$COMMAND "$@"
+       vserver ${BASE} exec /$COMMAND "${argv[@]}"
 
+       # publish
+       webpath=$(echo $WEBPATH | sed -e s,@DISTRO@,"$DISTRO",g -e s,@BUILD@,"$BASE",g)
+       weblog=$(echo $WEBLOG | sed -e s,@DISTRO@,"$DISTRO",g -e s,@BUILD@,"$BASE",g)
+       rm -f $webpath
+       ln -s /vservers/$BASE/build $webpath
+       rm -f $weblog
+       ln -s $LOG $weblog
+       
     else
+       LOG=/build/build-log.txt
        if [ -n "$DO_BUILD" ] ; then 
-           build >> /log-build.txt 2>&1 
+           build 
            touch /build-ok
        fi
     
        if [ -n "$DO_TEST" ] ; then 
-           runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1 
+           runtest
        fi
     
-       success >> ${BUILD}/log-build.txt 2>&1 
+       success 
 
     fi
 
-    # todo : gather results from various vservers into a single build index
-    #ROOT=$ROOT/$DISTRO
-    #BUILD=$ROOT/$BASE
-       
 }  
 
 ##########