cleanup
[build.git] / vbuild-nightly.sh
index 29d2827..74f8c7b 100755 (executable)
@@ -10,42 +10,56 @@ DEFAULT_PLDISTRO=planetlab
 DEFAULT_BASE="@DATE@--@PLDISTRO@-@FCDISTRO@"
 DEFAULT_SVNPATH="http://svn.planet-lab.org/svn/build/trunk"
 
-DEFAULT_MAILTO_onelab="onelab-build@one-lab.org"
-# tmp - send all mails to onelab
-#DEFAULT_MAILTO_planetlab="devel@planet-lab.org"
-DEFAULT_MAILTO_planetlab=$DEFAULT_MAILTO_onelab
+# NOTE: do not think we want to put email addresses into scripts
+# that can be harvested by spambots. --mef
+DEFAULT_MAILTO="onelab-build@one-lab.org"
 
 # web publishing results
-DEFAULT_WEBPATH="/build/@PLDISTRO@/@BASE@"
+DEFAULT_WEBPATH="/build/@PLDISTRO@/"
 
 # 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"
+TESTSVNPATH="http://svn.planet-lab.org/svn/tests/trunk/system/"
 TESTSCRIPT=TestMain.py
 ####################
 # assuming vserver runs in UTC
-DATE=$(date -u +'%Y.%m.%d')
+DATE=$(date +'%Y.%m.%d')
+
+# temporary - wrap a quick summary of suspicious stuff
+# this is to focus on installation that go wrong
+# use with care, a *lot* of other things can go bad as well
+function summary () {
+    from=$1; shift
+    echo "******************** BEG SUMMARY" 
+    tr -d '\r' < $from | egrep 'BEG RPM|not installed|Installing:.*([eE]rror|[wW]arning)' 
+    echo "******************** END SUMMARY" 
+}
+
 
 # Notify recipient of failure or success, manage various stamps 
 function failure() {
     set -x
+    WEBLOG=${WEBPATH}/${BASE}.log.txt
+    cp $LOG ${WEBLOG}
+    summary $LOG >> ${WEBLOG}
+    (echo -n "============================== $COMMAND: failure at " ; date ; tail -c 20k $WEBLOG) > ${WEBLOG}.ko
     if [ -n "$MAILTO" ] ; then
-       tail -c 8k $LOG | mail -s "Failures for build ${BASE}" $MAILTO
+       tail -c 20k ${WEBPATH}/${BASE}.log.txt | mail -s "Failures for build ${BASE}" $MAILTO
     fi
-    cp $LOG ${WEBPATH}.log.txt
-    (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k $LOG) > ${WEBPATH}.bko.txt
     exit 1
 }
 
 function success () {
     set -x
+    WEBLOG=${WEBPATH}/${BASE}.log.txt
+    cp $LOG ${WEBLOG}
+    summary $LOG >> ${WEBLOG}
+    touch ${WEBLOG}.ok
     if [ -n "$MAILTO" ] ; then
-       (echo "http://build.one-lab.org/$PLDISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
+       (echo "$PLDISTRO ($BASE) build for $FCDISTRO completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
     fi
-    cp $LOG ${WEBPATH}.log.txt
-    touch ${WEBPATH}.bok.txt
     exit 0
 }
 
@@ -83,6 +97,7 @@ function build () {
 function runtest () {
     set -x
     set -e
+    trap failure ERR INT
 
     echo -n "============================== Starting $COMMAND:runtest on $(date)"
     here=$(pwd)
@@ -92,21 +107,27 @@ function runtest () {
     rpm=$(ls myplc-[0-9]*.rpm)
     if [ ${#rpm[@]} != 1 ] ; then
        echo "$COMMAND: Cannot locate rpm for testing"
+       failure
        exit 1
     fi
     url=${TESTBUILDURL}${PLDISTRO}/${BASE}/RPMS/i386/${rpm}
 
-    # find the place where the plctest material was checked out
-    cd /vservers/$BASE/build/CODEBASES/PLCAPI
-    if [ ! -d plctest/ ] ; then
-       echo "$COMMAND : Cannot not locate plctest/ - exiting"
+    # checkout the system test (formerly known as plctest)
+    cd /vservers/${BASE}/build
+    rm -rf TESTS
+    svn export $TESTSVNPATH TESTS
+    # dont trust retcod
+    if [ ! -d TESTS ] ; then 
+       echo "$COMMAND: could not svn export $SVNPATH - check url"
        exit 1
     fi
+
   # compute test directory name on test box
     testdir=plctest-${BASE}
-  # rsync/push test material onto the test box
+  # rsync/push test material onto the test box - clean first
+    ssh ${TESTBOXSSH} rm -rf ${testdir}
     ssh ${TESTBOXSSH} mkdir -p ${testdir}
-    rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
+    rsync -a -v TESTS/ ${TESTBOXSSH}:${testdir}/
   # invoke test on testbox
     ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url} 
   #invoke make install from build to the testbox
@@ -132,6 +153,7 @@ function show_env () {
     echo MAKEOPTS="${MAKEOPTS[@]}"
     echo PLDISTROTAGS="$PLDISTROTAGS"
     echo TAGSRELEASE="$TAGSRELEASE"
+    echo -n "(might be unexpanded)"
     echo WEBPATH="$WEBPATH"
     if [ -d /vservers ] ; then
        echo PLDISTROTAGS="$PLDISTROTAGS"
@@ -208,18 +230,19 @@ function main () {
     [ -z "$BASE" ] && BASE="$DEFAULT_BASE"
     [ -z "$WEBPATH" ] && WEBPATH="$DEFAULT_WEBPATH"
     [ -z "$SVNPATH" ] && SVNPATH="$DEFAULT_SVNPATH"
-    # 
+
+    # NOTE: suggest that by default no email is sent and that the user
+    # should explicitly invoke this script with the -m arg to pass in
+    # the appropriate email address. --mef
     if [ "$PLDISTRO" = "onelab" ] ; then
-       [ -z "$MAILTO" ] && MAILTO="$DEFAULT_MAILTO_onelab"
-    else
-       [ -z "$MAILTO" ] && MAILTO="$DEFAULT_MAILTO_planetlab"
+       [ -z "$MAILTO" ] && MAILTO="$DEFAULT_MAILTO"
     fi
     [ -n "$DRY_RUN" ] && MAILTO=""
        
     ### set BASE from DISTRO, if unspecified
     sedargs="-e s,@DATE@,${DATE},g -e s,@FCDISTRO@,${FCDISTRO},g -e s,@PLDISTRO@,${PLDISTRO},g"
     BASE=$(echo ${BASE} | sed $sedargs)
-    WEBPATH=$(echo ${WEBPATH} | sed $sedargs -e s,@BASE@,"$BASE",g)
+    WEBPATH=$(echo ${WEBPATH} | sed $sedargs)
 
     if [ ! -d /vservers ] ; then
         # in the vserver
@@ -263,7 +286,6 @@ function main () {
            done
            BASE=${BASE}${i}
            # need update
-           WEBPATH=$(echo ${WEBPATH} | sed $sedargs -e s,@BASE@,"$BASE",g)
            # manage LOG - beware it might be a symlink so nuke it first
            LOG=/vservers/${BASE}.log.txt
            rm -f $LOG
@@ -272,29 +294,25 @@ function main () {
            echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date)
            show_env
 
-           ### extract vbuild-init-vserver.sh and run it
-           svn cat $SVNPATH/vbuild-init-vserver.sh > /tmp/vbuild-init-vserver-$$.sh
-           # get .lst 
-           lst=${PLDISTRO}-${FCDISTRO}-devel.lst
-           svn cat $SVNPATH/$lst > /tmp/$lst 
-
+           ### extract the whole build - much simpler
+           tmpdir=/tmp/$COMMAND-$$
+           svn export $SVNPATH $tmpdir
             # Create vserver
-           cd /tmp
-           chmod +x vbuild-init-vserver-$$.sh
-           /tmp/vbuild-init-vserver-$$.sh ${BASE} ${FCDISTRO} ${PLDISTRO}
+           cd $tmpdir
+           ./vbuild-init-vserver.sh ${BASE} ${FCDISTRO} ${PLDISTRO}
            # cleanup
-           rm -f /tmp/vbuild-init-vserver-$$.sh /tmp/$lst
            cd -
-           # Extract build
+           rm -rf $tmpdir
+           # Extract build again - in the vserver
            vserver ${BASE} exec svn checkout ${SVNPATH} /build
        fi
        echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date)
 
        # The log inside the vserver contains everything
        LOG2=/vservers/${BASE}/log.txt
-       (echo "==================== Transcript of vserver creation -- BEG $(date)" ; \
+       (echo "==================== BEG VSERVER Transcript of vserver creation" ; \
         cat $LOG ; \
-        echo "==================== Transcript of vserver creation -- END $(date)" ; \
+        echo "==================== END VSERVER Transcript of vserver creation" ; \
         echo "xxxxxxxxxx Messing with logs, symlinking $LOG2 to $LOG" ) >> $LOG2
        ### not too nice : nuke the former log, symlink it to the new one
        rm $LOG; ln -s $LOG2 $LOG
@@ -307,14 +325,15 @@ function main () {
            cp $COMMANDPATH /vservers/${BASE}/build/
 
            # invoke this command in the vserver for building (-T)
+           vserver ${BASE} exec chmod +x /build/$COMMAND
            vserver ${BASE} exec /build/$COMMAND "${argv[@]}" -b "${BASE}"
        fi
 
        # publish to the web so runtest can find them
-       rm -rf $WEBPATH ; mkdir -p $WEBPATH
-       tar -C /vservers/$BASE/build -cf - RPMS SRPMS | tar -C $WEBPATH -xf -
+       rm -rf $WEBPATH/$BASE ; mkdir -p $WEBPATH/$BASE/{RPMS,SRPMS}
+       rsync --archive --delete --verbose /vservers/$BASE/build/RPMS/ $WEBPATH/$BASE/RPMS/
+       rsync --archive --delete --verbose /vservers/$BASE/build/SRPMS/ $WEBPATH/$BASE/SRPMS/
        
-       set +e
        if [ -n "$DO_TEST" ] ; then 
            runtest
        fi