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