36th tag
[infrastructure.git] / scripts / trash / 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.onelab.eu/svn/build/trunk"
12 DISTRO=onelab
13 MAILTO="onelab-build@onelab.eu"
14 PLDISTROTAGS=onelab-tags.mk
15 TESTBUILDURL="http://build.onelab.eu/"
16 TESTBOX=onelab-test.inria.fr
17 TESTBOXSSH=root@onelab-test.inria.fr
18 TESTSVNPATH="svn+ssh://build@svn.onelab.eu/svn/new_plc_api/trunk/plctest"
19 TESTSCRIPT=TestMain.py
20 ####################
21 # plc chroot runs in UTC
22 DATE=$(date -u +'%Y.%m.%d')
23
24 ### in the root context
25 function do_chroot () {
26     chroot /plc/devel/root su - build <<EOF
27 $CHROOTBINDIR/$COMMAND $@
28 EOF
29
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.onelab.eu/$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
76 function build () {
77     set -x
78     set -e
79     trap failure ERR INT
80
81     echo -n "============================== Starting $COMMAND:build on "
82     date
83
84     cd $ROOT
85     svn co $SVNPATH $BASE
86
87   # if TAGSTAG specified : update PLDISTROTAGS with this tag
88     if [ -n "$TAGSTAG" ] ; then
89         cd $BASE
90         svn up -r $TAGSTAG $PLDISTROTAGS
91         cd -
92     fi
93
94     show_env
95     
96     echo "Running make IN build $(pwd)"
97     make stage1=true ${MAKEOPTS[@]} PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE 
98     # in case we use an older build
99     set +e
100     make ${MAKEOPTS[@]} PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE versions
101     set -e
102     make ${MAKEOPTS[@]} PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
103
104     # restore silent mode - otherwise cron gets it
105     set +x
106 }
107
108 function runtest () {
109     set -x
110     set -e
111     trap failure ERR INT
112
113      
114
115     echo -n "============================== Starting $COMMAND:runtest on "
116     date
117     
118
119     ### compute URL to the myplc package
120     build=$1; shift
121     buildname=$(basename $build)
122     cd $build
123     rpm=$(find RPMS -name myplc\*.rpm )
124     url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
125   ### checkout the test material
126     svn co ${TESTSVNPATH} plctest
127   # compute test directory name on test box
128     testdir=plctest-${buildname}
129   # rsync/push test material onto the test box
130     ssh ${TESTBOXSSH} mkdir -p ${testdir}
131     rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
132   # invoke test on testbox
133     ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url} 
134    #invoke make install from build to the testbox
135     make install PLCHOST=${TESTBOX}
136         
137   if [ "$?" != 0 ] ; then
138         failure
139     fi
140
141     set +x
142 }
143
144 function show_env () {
145     echo ROOT=$ROOT
146     echo DISTRO=$DISTRO
147     echo BASE=$BASE
148     echo SVNPATH=$SVNPATH
149     echo MAKEVARS="${MAKEVARS[@]}"
150     echo MAKEOPTS="${MAKEOPTS[@]}"
151     echo PLDISTROTAGS="$PLDISTROTAGS"
152     echo TAGSTAG="$TAGSTAG"
153     echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $PLDISTROTAGS"
154     cat $BASE/$PLDISTROTAGS
155     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
156 }
157
158 function usage () {
159     echo "Usage: $COMMAND [option] make-targets"
160     echo "This is revision $REVISION"
161     echo "Supported options"
162     echo " -b BASE - may include @, then replaced with current date"
163     echo " -u : uses directory given as BASE as is, even if already exists"
164     echo " -d DISTRO"
165     echo " -t PLDISTROTAGS"
166     echo " -r TAGSTAG - a tag that refers to PLDISTROTAGS - defaults to HEAD"
167     echo " -s MAKEVAR=value - spaces in value are not supported"
168     echo " -n dry-run : -n passed to make - no mail sent"
169     echo " -m MAILTO"
170     echo " -s SVNPATH"
171     echo " -B : run build only"
172     echo " -T : run test only"
173     exit 1
174 }
175
176 function main () {
177
178     if [ -d /plc/devel/data ] ; then
179         do_chroot "$@"
180     else
181         MAKEVARS=()
182         MAKEOPTS=()
183         DO_BUILD=true
184         DO_TEST=true
185         while getopts "b:ud:t:r:s:nm:s:BTh" opt ; do
186             case $opt in
187                 b) BASE=$OPTARG ;;
188                 u) USEOLD=true ;;
189                 d) DISTRO=$OPTARG ;;
190                 t) PLDISTROTAGS=$OPTARG ;;
191                 r) TAGSTAG=$OPTARG ;;
192                 s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
193                 n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
194                 m) MAILTO=$OPTARG ;;
195                 s) SVNPATH=$OPTARG ;;
196                 B) DO_TEST= ;;
197                 T) DO_BUILD= ; USEOLD=true ;;
198                 h|*) usage ;;
199             esac
200         done
201         
202         shift $(($OPTIND - 1))
203         
204         ROOT=$ROOT/$DISTRO
205         cd $ROOT
206         
207         MAKETARGETS="$@"
208         
209     ### set BASE from DISTRO, if unspecified
210         [ -z "$BASE" ] && BASE=${DISTRO}
211         BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
212     
213         if [ -n "$USEOLD" ] ; then
214             use_base $BASE
215         else
216             create_base
217         fi
218         BUILD=$ROOT/$BASE
219         
220         if [ -n "$DO_SEND" ] ; then 
221             test_sendmail  ${BUILD} >> ${BUILD}/log-build.txt 2>&1 
222         fi
223         
224         if [ -n "$DO_BUILD" ] ; then 
225             build >> ${BUILD}/log-build.txt 2>&1 
226             touch ${BUILD}.build-ok
227         fi
228         
229         if [ -n "$DO_TEST" ] ; then 
230             runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1 
231         fi
232         
233         success >> ${BUILD}/log-build.txt 2>&1 
234         
235     fi
236 }  
237
238 ##########
239 main "$@"