264567c39160af9b48f130cab9650d26f52acbd2
[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 SVNPATH="svn+ssh://build@svn.one-lab.org/svn/build/trunk"
12 DISTRO=onelab
13 MAILTO="onelab-build@one-lab.org"
14 TAGSFILE=onelab-tags.mk
15
16 TESTBUILDURL="http://build.one-lab.org/"
17 TESTBOXSSH=root@onelab-test.inria.fr
18 TESTSVNPATH="svn+ssh://build@svn.one-lab.org/svn/new_plc_api/trunk/plctest"
19 TESTSCRIPT=TestMain.py
20
21 ####################
22 # plc chroot runs in UTC
23 DATE=$(date -u +'%Y.%m.%d')
24
25 ### in the root context
26 function do_chroot () {
27   chroot /plc/devel/root su - build <<EOF
28 $CHROOTBINDIR/$COMMAND $@
29 EOF
30 }
31
32 # Notify recipient of failure or success, manage various stamps 
33 function failure() {
34   set -x
35   touch ${BUILD}.broken
36   if [ -n "$MAILTO" ] ; then
37     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
38   fi
39   exit 1
40 }
41
42 function success () {
43   set -x
44   touch ${BUILD}.ok
45   if [ -n "$MAILTO" ] ; then
46     (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
47   fi
48   cd ${ROOT}
49   rm -f latest
50   ln -s $BASE latest
51   exit 0
52 }
53
54 function create_base () {
55   i=
56   while ! mkdir ${BASE}${i} 2>/dev/null ; do
57     [ -z ${i} ] && BASE=${BASE}.
58     i=$((${i}+1))
59     if [ $i -gt 100 ] ; then
60       echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
61       exit 1
62     fi
63   done
64   BASE=${BASE}${i}
65 }
66
67 function use_base () {
68   [ ! -d $BASE ] && mkdir $BASE
69   if [ ! -d $BASE ] ; then
70     echo $COMMAND failed to create base $BASE
71     exit 1
72   fi
73 }
74
75 function build () {
76   set -x
77   set -e
78   trap failure ERR INT
79
80   echo -n "============================== Starting $COMMAND:build on "
81   date
82
83   cd $ROOT
84   svn co $SVNPATH $BASE
85
86   # if TAGSTAG specified : update TAGSFILE with this tag
87   if [ -n "$TAGSTAG" ] ; then
88     cd $BASE
89     svn up -r $TAGSTAG $TAGSFILE
90     cd -
91   fi
92
93   show_env
94     
95   echo "Running make IN build $(pwd)"
96   make stage1=true ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
97   make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
98 }
99
100 function runtest () {
101   set -x
102   set -e
103   trap failure ERR INT
104
105   echo -n "============================== Starting $COMMAND:runtest on "
106   date
107
108   ### compute URL to the myplc package
109   build=$1; shift
110   buildname=$(basename $build)
111   cd $build
112   rpm=$(find RPMS -name myplc\*.rpm )
113   url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
114
115   ### checkout the test material
116   svn co ${TESTSVNPATH} plctest
117   # compute test directory name on test box
118   testdir=plctest-${buildname}
119   # rsync/push test material onto the test box
120   ssh ${TESTBOXSSH} mkdir -p ${testdir}
121   rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
122   # invoke test on testbox
123   ssh ${TESTBOXSSH} ${testdir}/${TESTSCRIPT} ${url}
124   return $?
125 }
126
127 function show_env () {
128   echo ROOT=$ROOT
129   echo DISTRO=$DISTRO
130   echo BASE=$BASE
131   echo SVNPATH=$SVNPATH
132   echo MAKEVARS="${MAKEVARS[@]}"
133   echo MAKEOPTS="${MAKEOPTS[@]}"
134   echo TAGSFILE="$TAGSFILE"
135   echo TAGSTAG="$TAGSTAG"
136   echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
137   cat $BASE/$TAGSFILE
138   echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
139 }
140
141 function usage () {
142   echo "Usage: $COMMAND [option] make-targets"
143   echo "This is revision $REVISION"
144   echo "Supported options"
145   echo " -b BASE - may include @, then replaced with current date"
146   echo " -u : uses directory given as BASE as is, even if already exists"
147   echo " -e : exits (does nothing) if BASE already exists"
148   echo " -d DISTRO"
149   echo " -t TAGSFILE"
150   echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
151   echo " -s MAKEVAR=value - spaces in value are not supported"
152   echo " -n passed to make"
153   echo " -m MAILTO"
154   echo " -s SVNPATH"
155   echo " -T : run test only"
156   exit 1
157 }
158
159 function main () {
160
161   if [ -d /plc/devel/data ] ; then
162     do_chroot "$@"
163   else
164     MAKEVARS=()
165     MAKEOPTS=()
166     while getopts "b:ued:t:r:B:s:nm:s:Th" opt ; do
167       case $opt in
168         b) BASE=$OPTARG ;;
169         u) USEOLD=true ;;
170         e) EXITIFOLD=true ;;
171         d) DISTRO=$OPTARG ;;
172         t) TAGSFILE=$OPTARG ;;
173         r) TAGSTAG=$OPTARG ;;
174         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
175         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
176         m) MAILTO=$OPTARG ;;
177         s) SVNPATH=$OPTARG ;;
178         T) TESTONLY=true ; USEOLD=true ;;
179         h|*) usage ;;
180       esac
181     done
182
183     shift $(($OPTIND - 1))
184     
185     ROOT=$ROOT/$DISTRO
186     cd $ROOT
187
188     MAKETARGETS="$@"
189
190     ### set BASE from DISTRO, if unspecified
191     [ -z "$BASE" ] && BASE=${DISTRO}
192     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
193
194     if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
195       echo "$COMMAND: -e : exits on existing base directory $BASE"
196       BUILD=$ROOT/$BASE
197       failure
198       exit 1
199     fi
200     
201     if [ -n "$USEOLD" ] ; then
202       use_base $BASE
203     else
204       create_base
205     fi
206     BUILD=$ROOT/$BASE
207     
208     if [ -z "$TESTONLY" ] ; then 
209       build >> ${BUILD}/log-build.txt 2>&1 
210     fi
211
212     runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1 
213
214     success >> ${BUILD}/log-build.txt 2>&1 
215
216   fi
217 }  
218
219 ##########
220 main "$@"