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