first attempt
authorthierry <thierry@41d37cc5-eb28-0410-a9bf-d37491348ade>
Mon, 5 Nov 2007 23:25:11 +0000 (23:25 +0000)
committerthierry <thierry@41d37cc5-eb28-0410-a9bf-d37491348ade>
Mon, 5 Nov 2007 23:25:11 +0000 (23:25 +0000)
scripts/nightly-build-vserver.sh [new file with mode: 0644]

diff --git a/scripts/nightly-build-vserver.sh b/scripts/nightly-build-vserver.sh
new file mode 100644 (file)
index 0000000..741f029
--- /dev/null
@@ -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 "$@"