oops, wrong path in custom script search
[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="onelab-build@one-lab.org"
11 TAG=HEAD
12 CHROOTBINDIR=/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 $CHROOTBINDIR/$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   touch ${BUILD}/log-success.stamp
34   if [ -n "$MAILTO" ] ; then
35     date | mail -s "Successfull build in ${BUILD}" $MAILTO
36   fi
37   exit 0
38 }
39
40 function create_base () {
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   echo MAKEVARS="${MAKEVARS[@]}"
89   echo MAKEOPTS="${MAKEOPTS[@]}"
90 }
91
92 function usage () {
93   echo "Usage: $COMMAND [option] make-targets"
94   echo "This is revision $REVISION"
95   echo "Supported options"
96   echo " -v verbose"
97   echo " -b BASE"
98   echo " -u : uses directory given as BASE as is, even if already exists"
99   echo " -e : exits (does nothing) if BASE already exists"
100   echo " -f DISTRO"
101   echo " -d CVSROOT"
102   echo " -r TAG"
103   echo " -m MAILTO"
104   echo " -s MAKEVAR=value - spaces in value are not supported"
105   echo " -n passed to make"
106   exit 1
107 }
108
109 function main () {
110
111   if [ -d /plc/devel/data ] ; then
112     do_chroot "$@"
113   else
114     while getopts "vd:r:m:f:b:s:uenh" opt ; do
115     MAKEVARS=()
116     MAKEOPTS=()
117       case $opt in
118         v) set -x ;;
119         d) CVSROOT=$OPTARG ;;
120         r) TAG=$OPTARG ;;
121         m) MAILTO=$OPTARG ;;
122         f) DISTRO=$OPTARG ;;
123         b) BASE=$OPTARG ;;
124         u) USEOLD=true ;;
125         e) EXITIFOLD=true ;;
126         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
127         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
128         h|*) usage ;;
129       esac
130     done
131
132     ROOT=$ROOT/$DISTRO
133
134     shift $(($OPTIND - 1))
135     
136     MAKETARGETS="$@"
137
138     cd $ROOT
139     ### set BASE from TAG, if unspecified
140     [ -z "$BASE" ] && BASE=${TAG}
141
142     if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
143       echo "$COMMAND: -e : exits on existing base directory $BASE"
144       BUILD=$ROOT/$BASE
145       failure
146       exit 1
147     fi
148     
149     if [ -n "$USEOLD" ] ; then
150       use_base $BASE
151     else
152       BASE=${BASE}--${DATE}
153       create_base
154     fi
155     BUILD=$ROOT/$BASE
156     
157     build >> ${BUILD}/log-build.txt 2>&1
158   fi
159 }  
160
161 ##########
162 main "$@"