remove extra space in REVISION
[infrastructure.git] / scripts / nightly-build.sh
1 #!/bin/bash
2
3 # use svn propset svn:keywords Revision to enable this
4 REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
5
6 COMMAND=$(basename $0)
7 ROOT=/build
8 CVSROOT=":pserver:anon@cvs.planet-lab.org:/cvs"
9 DISTRO=onelab
10 MAILTO="thierry.parmentelat@sophia.inria.fr"
11 TAG=HEAD
12 CHROOTDIR=/root/bin
13
14 # plc chroot runs in UTC
15 date=$(date -u +'%Y.%m.%d')
16
17 ### in the root context
18 function do_chroot () {
19   chroot /plc/devel/root su - build <<EOF
20 $CHROOTDIR/$COMMAND $@
21 EOF
22 }
23
24 # Notify recipient of failure
25 function failure() {
26   if [ -n "$MAILTO" ] ; then
27     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
28   fi
29   exit 1
30 }
31
32 function success () {
33   if [ -n "$MAILTO" ] ; then
34     date | mail -s "Successfull build in ${BUILD}" $MAILTO
35   fi
36   exit 0
37 }
38
39 function create_base () {
40   BASE=${TAG/HEAD/`date +%Y.%m.%d`}
41   i=
42   while ! mkdir ${BASE}${i} 2>/dev/null ; do
43     [ -z ${i} ] && BASE=${BASE}.
44     i=$((${i}+1))
45     if [ $i -gt 100 ] ; then
46       echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
47       exit 1
48     fi
49   done
50   BASE=${BASE}${i}
51 }
52
53 function use_base () {
54   [ ! -d $BASE ] && mkdir $BASE
55   if [ ! -d $BASE ] ; then
56     echo $COMMAND failed to create base $BASE
57     exit 1
58   fi
59 }
60
61 function build () {
62   trap failure ERR INT
63   set -x
64
65   echo -n "============================== Starting $COMMAND on "
66   date
67
68   show_env
69     
70   cd $ROOT
71   cvs -d $CVSROOT co -d $BASE build
72
73   echo "Running make IN build $(pwd)"
74   make ${MAKEOPTS[@]} TAG=${TAG} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
75
76   # only if successful
77   rm -f latest
78   ln -s $BASE latest
79
80   success
81 }
82
83 function show_env () {
84   echo ROOT=$ROOT
85   echo BASE=$BASE
86   echo TAG=$TAG
87   echo DISTRO=$DISTRO
88 }
89
90 function usage () {
91   echo "Usage: $COMMAND [option] make-targets"
92   echo "This is revision $REVISION"
93   echo "Supported options"
94   echo " -v verbose"
95   echo " -d CVSROOT"
96   echo " -r TAG"
97   echo " -m MAILTO"
98   echo " -f DISTRO"
99   echo " -b BASE"
100   echo " -s MAKEVAR=value - spaces in value are not supported"
101   echo " -n passed to make"
102   exit 1
103 }
104
105 function main () {
106
107   if [ -d /plc/devel/data ] ; then
108     do_chroot "$@"
109   else
110     MAKEVARS=()
111     MAKEOPTS=()
112     while getopts "vd:r:m:f:b:s:nh" opt ; do
113       case $opt in
114         v) set -x ;;
115         d) CVSROOT=$OPTARG ;;
116         r) TAG=$OPTARG ;;
117         m) MAILTO=$OPTARG ;;
118         f) DISTRO=$OPTARG ;;
119         b) BASE=$OPTARG ;;
120         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
121         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
122         h|*) usage ;;
123       esac
124     done
125     shift $(($OPTIND - 1))
126     
127     MAKETARGETS="$@"
128
129     cd $ROOT
130     ### determine BASE
131     # if specified, use it, otherwise create from date
132     if [ -z "$BASE" ] ; then
133       create_base
134     else
135       use_base $BASE
136     fi
137     BUILD=$ROOT/$BASE
138     
139     build >> ${BUILD}/log-build.txt 2>&1
140   fi
141 }  
142
143 ##########
144 main "$@"