replaces %d with @, % is magic to crontab
[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 CHROOTBINDIR=/root/bin
9
10 # default values, tunable with command-line options
11 CVSROOT=":pserver:anon@cvs.planet-lab.org:/cvs"
12 DISTRO=onelab
13 MAILTO="onelab-build@one-lab.org"
14 TAGSFILE=onelab-tags.mk
15
16 ####################
17 # plc chroot runs in UTC
18 DATE=$(date -u +'%Y.%m.%d')
19
20 ### in the root context
21 function do_chroot () {
22   chroot /plc/devel/root su - build <<EOF
23 $CHROOTBINDIR/$COMMAND $@
24 EOF
25 }
26
27 # Notify recipient of failure
28 function failure() {
29   if [ -n "$MAILTO" ] ; then
30     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
31   fi
32   exit 1
33 }
34
35 function success () {
36   touch ${BUILD}/log-success.stamp
37   if [ -n "$MAILTO" ] ; then
38     date | mail -s "Successfull build in ${BUILD}" $MAILTO
39   fi
40   exit 0
41 }
42
43 function create_base () {
44   i=
45   while ! mkdir ${BASE}${i} 2>/dev/null ; do
46     [ -z ${i} ] && BASE=${BASE}.
47     i=$((${i}+1))
48     if [ $i -gt 100 ] ; then
49       echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
50       exit 1
51     fi
52   done
53   BASE=${BASE}${i}
54 }
55
56 function use_base () {
57   [ ! -d $BASE ] && mkdir $BASE
58   if [ ! -d $BASE ] ; then
59     echo $COMMAND failed to create base $BASE
60     exit 1
61   fi
62 }
63
64 function build () {
65   trap failure ERR INT
66   set -x
67
68   echo -n "============================== Starting $COMMAND on "
69   date
70
71   cd $ROOT
72   cvs -d $CVSROOT co -r $BUILDTAG -d $BASE build
73
74   # if TAGSTAG specified : update TAGSFILE with this tag
75   if [ -n "$TAGSTAG" ] ; then
76     cd $BASE
77     cvs up -r $TAGSTAG $TAGSFILE
78     cd -
79   fi
80
81   show_env
82     
83   echo "Running make IN build $(pwd)"
84   make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
85
86   # only if successful
87   rm -f latest
88   ln -s $BASE latest
89
90   success
91 }
92
93 function show_env () {
94   echo ROOT=$ROOT
95   echo DISTRO=$DISTRO
96   echo BASE=$BASE
97   echo MAKEVARS="${MAKEVARS[@]}"
98   echo MAKEOPTS="${MAKEOPTS[@]}"
99   echo BUILDTAG="$BUILDTAG"
100   echo TAGSFILE="$TAGSFILE"
101   echo TAGSTAG="$TAGSTAG"
102   echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
103   cat $BASE/$TAGSFILE
104   echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
105 }
106
107 function usage () {
108   echo "Usage: $COMMAND [option] make-targets"
109   echo "This is revision $REVISION"
110   echo "Supported options"
111   echo " -b BASE - may include @, then replaced with current date"
112   echo " -u : uses directory given as BASE as is, even if already exists"
113   echo " -e : exits (does nothing) if BASE already exists"
114   echo " -d DISTRO"
115   echo " -t TAGSFILE"
116   echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
117   echo " -B BUILDTAG - the tag used to extract build/"
118   echo " -s MAKEVAR=value - spaces in value are not supported"
119   echo " -n passed to make"
120   echo " -v verbose"
121   echo " -m MAILTO"
122   echo " -c CVSROOT"
123   exit 1
124 }
125
126 function main () {
127
128   if [ -d /plc/devel/data ] ; then
129     do_chroot "$@"
130   else
131     MAKEVARS=()
132     MAKEOPTS=()
133     while getopts "b:ued:t:r:B:s:nvm:c:h" opt ; do
134       case $opt in
135         b) BASE=$OPTARG ;;
136         u) USEOLD=true ;;
137         e) EXITIFOLD=true ;;
138         d) DISTRO=$OPTARG ;;
139         t) TAGSFILE=$OPTARG ;;
140         r) TAGSTAG=$OPTARG ;;
141         B) BUILDTAG=$OPTARG ;;
142         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
143         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
144         v) set -x ;;
145         m) MAILTO=$OPTARG ;;
146         c) CVSROOT=$OPTARG ;;
147         h|*) usage ;;
148       esac
149     done
150
151     shift $(($OPTIND - 1))
152     
153     ROOT=$ROOT/$DISTRO
154     cd $ROOT
155
156     MAKETARGETS="$@"
157
158     ### set BUILDTAG
159     [ -z "$BUILDTAG" ] && BUILDTAG=HEAD
160
161     ### set BASE from DISTRO, if unspecified
162     [ -z "$BASE" ] && BASE=${DISTRO}
163     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
164
165     if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
166       echo "$COMMAND: -e : exits on existing base directory $BASE"
167       BUILD=$ROOT/$BASE
168       failure
169       exit 1
170     fi
171     
172     if [ -n "$USEOLD" ] ; then
173       use_base $BASE
174     else
175       create_base
176     fi
177     BUILD=$ROOT/$BASE
178     
179     build >> ${BUILD}/log-build.txt 2>&1
180   fi
181 }  
182
183 ##########
184 main "$@"