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