first draft
authorbuild <build@41d37cc5-eb28-0410-a9bf-d37491348ade>
Sun, 22 Apr 2007 23:41:24 +0000 (23:41 +0000)
committerbuild <build@41d37cc5-eb28-0410-a9bf-d37491348ade>
Sun, 22 Apr 2007 23:41:24 +0000 (23:41 +0000)
scripts/nightly-build-svn.sh [new file with mode: 0755]

diff --git a/scripts/nightly-build-svn.sh b/scripts/nightly-build-svn.sh
new file mode 100755 (executable)
index 0000000..f10dcb7
--- /dev/null
@@ -0,0 +1,180 @@
+#!/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
+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"
+TAGSFILE=onelab-tags.mk
+
+####################
+# 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
+$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
+  exit 1
+}
+
+function success () {
+  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
+  exit 0
+}
+
+function create_base () {
+  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
+}
+
+function build () {
+  trap failure ERR INT
+  set -x
+
+  echo -n "============================== Starting $COMMAND on "
+  date
+
+  cd $ROOT
+  svn co $SVNPATH $BASE
+
+  # 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 ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
+
+  # only if successful
+  rm -f latest
+  ln -s $BASE latest
+
+  success
+}
+
+function show_env () {
+  echo ROOT=$ROOT
+  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 () {
+
+  if [ -d /plc/devel/data ] ; then
+    do_chroot "$@"
+  else
+    MAKEVARS=()
+    MAKEOPTS=()
+    while getopts "b:ued:t:r:B:s:nvm:s:h" opt ; do
+      case $opt in
+        b) BASE=$OPTARG ;;
+        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))
+    
+    ROOT=$ROOT/$DISTRO
+    cd $ROOT
+
+    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
+  fi
+}  
+
+##########
+main "$@"