distro-dependent make variables renamed
[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 DISTROMAKETAGS=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     (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k ${BUILD}/log-build.txt) >> ${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 DISTROMAKETAGS with this tag
87     if [ -n "$TAGSTAG" ] ; then
88         cd $BASE
89         svn up -r $TAGSTAG $DISTROMAKETAGS
90         cd -
91     fi
92
93     show_env
94     
95     echo "Running make IN build $(pwd)"
96     make stage1=true ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
97     make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
98
99     # restore silent mode - otherwise cron gets it
100     set +x
101 }
102
103 function runtest () {
104     set -x
105     set -e
106     trap failure ERR INT
107
108     echo -n "============================== Starting $COMMAND:runtest on "
109     date
110     
111   ### compute URL to the myplc package
112     build=$1; shift
113     buildname=$(basename $build)
114     cd $build
115     rpm=$(find RPMS -name myplc\*.rpm )
116     url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
117
118   ### checkout the test material
119     svn co ${TESTSVNPATH} plctest
120   # compute test directory name on test box
121     testdir=plctest-${buildname}
122   # rsync/push test material onto the test box
123     ssh ${TESTBOXSSH} mkdir -p ${testdir}
124     rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
125   # invoke test on testbox
126     ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url}
127     if [ "$?" != 0 ] ; then
128         failure
129     fi
130
131     set +x
132 }
133
134 function show_env () {
135     echo ROOT=$ROOT
136     echo DISTRO=$DISTRO
137     echo BASE=$BASE
138     echo SVNPATH=$SVNPATH
139     echo MAKEVARS="${MAKEVARS[@]}"
140     echo MAKEOPTS="${MAKEOPTS[@]}"
141     echo DISTROMAKETAGS="$DISTROMAKETAGS"
142     echo TAGSTAG="$TAGSTAG"
143     echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
144     cat $BASE/$DISTROMAKETAGS
145     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
146 }
147
148 function usage () {
149     echo "Usage: $COMMAND [option] make-targets"
150     echo "This is revision $REVISION"
151     echo "Supported options"
152     echo " -b BASE - may include @, then replaced with current date"
153     echo " -u : uses directory given as BASE as is, even if already exists"
154     echo " -d DISTRO"
155     echo " -t DISTROMAKETAGS"
156     echo " -r TAGSTAG - a tag that refers to DISTROMAKETAGS - defaults to HEAD"
157     echo " -s MAKEVAR=value - spaces in value are not supported"
158     echo " -n dry-run : -n passed to make - no mail sent"
159     echo " -m MAILTO"
160     echo " -s SVNPATH"
161     echo " -B : run build only"
162     echo " -T : run test only"
163     exit 1
164 }
165
166 function main () {
167
168     if [ -d /plc/devel/data ] ; then
169         do_chroot "$@"
170     else
171         MAKEVARS=()
172         MAKEOPTS=()
173         DO_BUILD=true
174         DO_TEST=true
175         while getopts "b:ud:t:r:s:nm:s:BTh" opt ; do
176             case $opt in
177                 b) BASE=$OPTARG ;;
178                 u) USEOLD=true ;;
179                 d) DISTRO=$OPTARG ;;
180                 t) DISTROMAKETAGS=$OPTARG ;;
181                 r) TAGSTAG=$OPTARG ;;
182                 s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
183                 n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
184                 m) MAILTO=$OPTARG ;;
185                 s) SVNPATH=$OPTARG ;;
186                 B) DO_TEST= ;;
187                 T) DO_BUILD= ; USEOLD=true ;;
188                 h|*) usage ;;
189             esac
190         done
191         
192         shift $(($OPTIND - 1))
193         
194         ROOT=$ROOT/$DISTRO
195         cd $ROOT
196         
197         MAKETARGETS="$@"
198         
199     ### set BASE from DISTRO, if unspecified
200         [ -z "$BASE" ] && BASE=${DISTRO}
201         BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
202     
203         if [ -n "$USEOLD" ] ; then
204             use_base $BASE
205         else
206             create_base
207         fi
208         BUILD=$ROOT/$BASE
209         
210         if [ -n "$DO_BUILD" ] ; then 
211             build >> ${BUILD}/log-build.txt 2>&1 
212             touch ${BUILD}.build-ok
213         fi
214         
215         if [ -n "$DO_TEST" ] ; then 
216             runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1 
217         fi
218         
219         success >> ${BUILD}/log-build.txt 2>&1 
220         
221     fi
222 }  
223
224 ##########
225 main "$@"