fix how to compute build url
[infrastructure.git] / scripts / nightly-build.sh
index a04c289..0a7f632 100755 (executable)
@@ -1,35 +1,36 @@
 #!/bin/bash
 
+# 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"
+CHROOTBINDIR=/root/bin
+
+# default values, tunable with command-line options
+SVNPATH="svn+ssh://build@svn.one-lab.org/svn/build/trunk"
 DISTRO=onelab
-MAILTO="thierry.parmentelat@sophia.inria.fr"
-TAG=HEAD
-CHROOTDIR=/root/bin
+MAILTO="onelab-build@one-lab.org"
+TAGSFILE=onelab-tags.mk
 
-# plc chroot runs in UTC
-date=$(date -u +'%Y.%m.%d')
+TESTBUILDURL="http://onelab-build.inria.fr/"
+TESTBOX=onelab-test.inria.fr
+TESTSCRIPT=plctest/TestMain.py
 
-function usage () {
-  echo "$COMMAND [option]"
-  echo " -d CVSROOT"
-  echo " -r TAG"
-  echo " -m MAILTO"
-  echo " -f DISTRO"
-  echo " -b BASE"
-  exit 1
-}
+####################
+# plc chroot runs in UTC
+DATE=$(date -u +'%Y.%m.%d')
 
 ### in the root context
 function do_chroot () {
   chroot /plc/devel/root su - build <<EOF
-$CHROOTDIR/$COMMAND $@
+$CHROOTBINDIR/$COMMAND $@
 EOF
 }
 
 # Notify recipient of failure
 function failure() {
+  touch ${BUILD}.broken
   if [ -n "$MAILTO" ] ; then
     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
   fi
@@ -37,14 +38,14 @@ function failure() {
 }
 
 function success () {
+  touch ${BUILD}.ok
   if [ -n "$MAILTO" ] ; then
-    date | mail -s "Successfull build in ${BUILD}" $MAILTO
+    (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
   fi
-  exit 1
+  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}.
@@ -65,38 +66,6 @@ function use_base () {
   fi
 }
 
-function manage_distro () {
-
-# both .mk and .xml inserted into princeton's cvs
-
-#  DISTROFILE=$BUILD/$DISTRO.mk
-#
-#  if [ -f $DISTROFILE ] ; then
-#    echo Using $DISTROFILE
-#  elif [ -f $ROOT/$DISTRO.mk ] ; then
-#    echo Using $ROOT/$DISTRO.mk
-#    ln -s $ROOT/$DISTRO.mk $DISTROFILE
-#  else
-#    echo Could not locate $DISTRO.mk
-#    exit 1
-#  fi
-#
-#  if [ "$DISTRO" != planetlab ] ; then
-#    DISTROFILE=$BUILD/$DISTRO.xml
-#
-#    if [ -f $DISTROFILE ] ; then
-#      echo Using $DISTROFILE
-#    elif [ -f $ROOT/$DISTRO.xml ] ; then
-#      echo Using $ROOT/$DISTRO.xml
-#      ln -s $ROOT/$DISTRO.xml $DISTROFILE
-#    else
-#      echo Could not locate $DISTRO.xml
-#      exit 1
-#    fi
-#  fi
-
-}
-
 function build () {
   trap failure ERR INT
   set -x
@@ -104,28 +73,70 @@ function build () {
   echo -n "============================== Starting $COMMAND on "
   date
 
-  show_env
-    
   cd $ROOT
-  cvs -d $CVSROOT co -d $BASE build
+  svn co $SVNPATH $BASE
 
-  manage_distro
+  # if TAGSTAG specified : update TAGSFILE with this tag
+  if [ -n "$TAGSTAG" ] ; then
+    cd $BASE
+    svn up -r $TAGSTAG $TAGSFILE
+    cd -
+  fi
 
+  show_env
+    
   echo "Running make IN build $(pwd)"
-  make TAG=${TAG} PLDISTRO=${DISTRO} -C $BASE
+  make stage1=true ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+  make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
 
   # only if successful
   rm -f latest
   ln -s $BASE latest
 
-  success
+}
+
+function runtest () {
+  set -x
+  build=$1; shift
+  buildname=$(basename $build)
+  distroname=$(basename $(dirname $build))
+  cd build
+  rpm=$(find . -name myplc\*.rpm )
+  url=${TESTBUILDURL}${distroname}/${buildname}/${rpm}
+  ssh root@${TESTBOX} ${TESTSCRIPT} ${URL}
+  return $?
 }
 
 function show_env () {
   echo ROOT=$ROOT
-  echo BASE=$BASE
-  echo TAG=$TAG
   echo DISTRO=$DISTRO
+  echo BASE=$BASE
+  echo SVNPATH=$SVNPATH
+  echo MAKEVARS="${MAKEVARS[@]}"
+  echo MAKEOPTS="${MAKEOPTS[@]}"
+  echo TAGSFILE="$TAGSFILE"
+  echo TAGSTAG="$TAGSTAG"
+  echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
+  cat $BASE/$TAGSFILE
+  echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
+}
+
+function usage () {
+  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 " -e : exits (does nothing) if BASE already exists"
+  echo " -d DISTRO"
+  echo " -t TAGSFILE"
+  echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
+  echo " -s MAKEVAR=value - spaces in value are not supported"
+  echo " -n passed to make"
+  echo " -v verbose"
+  echo " -m MAILTO"
+  echo " -s SVNPATH"
+  exit 1
 }
 
 function main () {
@@ -133,29 +144,56 @@ function main () {
   if [ -d /plc/devel/data ] ; then
     do_chroot "$@"
   else
-    while getopts "d:r:m:f:b:h" opt ; do
+    MAKEVARS=()
+    MAKEOPTS=()
+    while getopts "b:ued:t:r:B:s:nvm:s:h" opt ; do
       case $opt in
-       d) CVSROOT=$OPTARG ;;
-        r) TAG=$OPTARG ;;
-        m) MAILTO=$OPTARG ;;
-        f) DISTRO=$OPTARG ;;
         b) BASE=$OPTARG ;;
-        h) usage ;;
+        u) USEOLD=true ;;
+       e) EXITIFOLD=true ;;
+        d) DISTRO=$OPTARG ;;
+        t) TAGSFILE=$OPTARG ;;
+       r) TAGSTAG=$OPTARG ;;
+        s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
+       n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
+       v) set -x ;;
+        m) MAILTO=$OPTARG ;;
+       s) SVNPATH=$OPTARG ;;
+        h|*) usage ;;
       esac
     done
-    shift $(($OPTIND - 1))
 
+    shift $(($OPTIND - 1))
+    
+    ROOT=$ROOT/$DISTRO
     cd $ROOT
-    ### determine BASE
-    # if specified, use it, otherwise create from date
-    if [ -z "$BASE" ] ; then
-      create_base
-    else
+
+    MAKETARGETS="$@"
+
+    ### set BASE from DISTRO, if unspecified
+    [ -z "$BASE" ] && BASE=${DISTRO}
+    BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
+
+    if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
+      echo "$COMMAND: -e : exits on existing base directory $BASE"
+      BUILD=$ROOT/$BASE
+      failure
+      exit 1
+    fi
+    
+    if [ -n "$USEOLD" ] ; then
       use_base $BASE
+    else
+      create_base
     fi
     BUILD=$ROOT/$BASE
     
     build >> ${BUILD}/log-build.txt 2>&1
+
+    runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1
+
+    success
+
   fi
 }