d688b7b865dc542bc0ec0d7000c521bcf0ad0784
[infrastructure.git] / scripts / nightly-build-vserver.sh
1 #!/bin/bash
2 REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
3
4 COMMANDPATH=$0
5 COMMAND=$(basename $0)
6 #ROOT=/build
7
8 # default values, tunable with command-line options
9 DEFAULT_FC_DISTRO=fc6
10 SVNPATH="http://svn.one-lab.org/build/trunk"
11 DISTRO=onelab
12 MAILTO="onelab-build@one-lab.org"
13 DISTROMAKETAGS=onelab-tags.mk
14 PLEBOX=root@planet-lab.eu
15 TESTBUILDURL="http://build.one-lab.org/"
16 TESTBOX=onelab-test.inria.fr
17 TESTBOXSSH=root@onelab-test.inria.fr
18 TESTSVNPATH="http://svn.one-lab.org/new_plc_api/trunk/plctest"
19 TESTSCRIPT=TestMain.py
20 TESTSEND=TestSendMail
21 ####################
22 # plc chroot runs in UTC
23 DATE=$(date -u +'%Y.%m.%d')
24
25 # Notify recipient of failure or success, manage various stamps 
26 function failure() {
27     set -x
28     (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k /log-build.txt) >> /build.broken
29     if [ -n "$MAILTO" ] ; then
30         tail -c 8k /log-build.txt | mail -s "Failures for ${BASE}" $MAILTO
31     fi
32     exit 1
33 }
34
35 function success () {
36     set -x
37     touch /build.ok
38     if [ -n "$MAILTO" ] ; then
39         (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
40     fi
41 #    cd ${ROOT}
42 #    rm -f latest
43 #    ln -s $BASE latest
44     exit 0
45 }
46
47 function build () {
48     set -x
49     set -e
50     trap failure ERR INT
51
52     echo -n "============================== Starting $COMMAND:build on "
53     date
54
55     cd /
56 #    svn checkout $SVNPATH $BASE
57
58   # if TAGSRELEASE specified : update DISTROMAKETAGS with this tag
59     if [ -n "$TAGSRELEASE" ] ; then
60         cd build
61         svn up -r $TAGSRELEASE $DISTROMAKETAGS
62         cd - > /dev/null
63     fi
64
65     show_env
66     
67     echo "Running make IN build $(pwd)"
68     make stage1=true ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C /build
69     # in case we use an older build
70     set +e
71     make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C /build versions
72     set -e
73     make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C /build $MAKETARGETS
74
75     # restore silent mode - otherwise cron gets it
76     set +x
77 }
78
79 function runtest () {
80     set -x
81     set -e
82     trap failure ERR INT
83
84     echo -n"==============================> testing the sendmail service on PLE"
85     ssh ${PLEBOX} python -u /root/${TESTSEND} 
86
87     echo -n "============================== Starting $COMMAND:runtest on "
88     date
89     
90
91     ### compute URL to the myplc package
92     build=$1; shift
93     buildname=$(basename $build)
94     cd $build
95     rpm=$(find RPMS -name myplc\*.rpm )
96     url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
97   ### checkout the test material
98     svn co ${TESTSVNPATH} plctest
99   # compute test directory name on test box
100     testdir=plctest-${buildname}
101   # rsync/push test material onto the test box
102     ssh ${TESTBOXSSH} mkdir -p ${testdir}
103     rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
104   # invoke test on testbox
105     ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url} 
106    #invoke make install from build to the testbox
107     make install PLCHOST=${TESTBOX}
108         
109   if [ "$?" != 0 ] ; then
110         failure
111     fi
112
113     set +x
114 }
115
116 function show_env () {
117 #    echo ROOT=$ROOT
118     echo FC_DISTRO=$FC_DISTRO
119     echo DISTRO=$DISTRO
120     echo BASE=$BASE
121     echo SVNPATH=$SVNPATH
122     echo MAKEVARS="${MAKEVARS[@]}"
123     echo MAKEOPTS="${MAKEOPTS[@]}"
124     echo DISTROMAKETAGS="$DISTROMAKETAGS"
125     echo TAGSRELEASE="$TAGSRELEASE"
126     if [ -f /build/$DISTROMAKETAGS ] ; then
127         echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
128         cat /build/$DISTROMAKETAGS
129     else
130         echo "no tags definition yet - probably out of vserver"
131     fi
132     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
133 }
134
135 function usage () {
136     echo "Usage: $COMMAND [option] make-targets"
137     echo "This is revision $REVISION"
138     echo "Supported options"
139     echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO"
140     echo " -b BASE - may include @, then replaced with current date"
141     echo " -u : uses directory given as BASE as is, even if already exists"
142     echo " -d PLDISTRO"
143     echo " -t PLDISTROMAKETAGS"
144     echo " -r TAGSRELEASE - a release number that refers to PLDISTROMAKETAGS - defaults to HEAD"
145     echo " -s MAKEVAR=value - spaces in value are not supported"
146     echo " -n dry-run : -n passed to make - no mail sent"
147     echo " -m MAILTO"
148     echo " -s SVNPATH"
149     echo " -B : run build only"
150     echo " -T : run test only"
151     exit 1
152 }
153
154 function main () {
155
156     set -x
157     # parse arguments
158     MAKEVARS=()
159     MAKEOPTS=()
160     DO_BUILD=true
161     DO_TEST=true
162     while getopts "f:b:ud:t:r:s:nm:s:BTh" opt ; do
163         case $opt in
164             f) FC_DISTRO=$OPTARG ;;
165             b) BASE=$OPTARG ;;
166             u) USEOLD=true ;;
167             d) DISTRO=$OPTARG ;;
168             t) DISTROMAKETAGS=$OPTARG ;;
169             r) TAGSRELEASE=$OPTARG ;;
170             s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
171             n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
172             m) MAILTO=$OPTARG ;;
173             s) SVNPATH=$OPTARG ;;
174             B) DO_TEST= ;;
175             T) DO_BUILD= ; USEOLD=true ;;
176             h|*) usage ;;
177         esac
178     done
179         
180     shift $(($OPTIND - 1))
181     
182     [ -z "$FC_DISTRO" ] && FC_DISTRO=$DEFAULT_FC_DISTRO
183     MAKETARGETS="$@"
184         
185     ### set BASE from DISTRO, if unspecified
186     [ -z "$BASE" ] && BASE=${DISTRO}-${FC_DISTRO}
187     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
188     
189     if [ -d /vservers ] ; then
190         # we run in the root context : 
191         # (*) create or check for the vserver to use
192         # (*) copy this command in the vserver
193         # (*) invoke it
194         
195         if [ -n "$USEOLD" ] ; then
196             ### Re-use a vserver (finish an unfinished build..)
197             if [ ! -d /vservers/${BASE} ] ; then
198                 echo $COMMAND : cannot find vserver $BASE
199                 exit 1
200             fi
201             # update build
202             LOG=/vservers/${BASE}.log
203             echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date) >> $LOG 2>&1
204             vserver ${BASE} exec svn update /build >> $LOG 2>&1
205         else
206             # create vserver: check it does not exist yet
207             i=
208             while [ -d /vservers/${BASE}${i} ] ; do
209                 # we name subsequent builds <base>-n<i> so the logs and builds get sorted properly
210                 [ -z ${i} ] && BASE=${BASE}-n
211                 i=$((${i}+1))
212                 if [ $i -gt 100 ] ; then
213                     echo "$COMMAND: Failed to create build vserver /vservers/${BASE}${i}"
214                     exit 1
215                 fi
216             done
217             BASE=${BASE}${i}
218             LOG=/vservers/${BASE}.log
219             echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date) >> $LOG 2>&1
220             show_env >> $LOG 2>&1
221             ### extract vbuild.setup and run it
222             svn cat $SVNPATH/vbuild.setup > /tmp/vbuild-$$  2>> $LOG
223             svn cat $SVNPATH/${DISTRO}-devel.lst > /tmp/${DISTRO}-devel.lst  2>> $LOG
224             # Create vserver
225             cd /tmp
226             chmod +x vbuild-$$
227             /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} ${DISTRO} >> $LOG 2>&1
228             cd - > /dev/null
229             # Extract build
230             vserver ${BASE} exec svn checkout ${SVNPATH} /build  >> $LOG 2>&1
231         fi
232
233         echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date) >> $LOG 2>&1
234         cp $COMMANDPATH /vservers/${BASE}/
235         # invoke this command in the vserver
236         vserver ${BASE} exec /$COMMAND "$@"  >> $LOG 2>&1
237
238     else
239         echo "In vserver : got args" "$@"
240         if [ -n "$DO_BUILD" ] ; then 
241             build 
242             touch /build-ok
243         fi
244     
245         # xxx - need to gather builds under the build index before we can re-enable this
246         #if [ -n "$DO_TEST" ] ; then 
247         #runtest ${BUILD} 
248         #fi
249     
250         success 
251
252     fi
253
254     # todo : gather results from various vservers into a single build index
255     #ROOT=$ROOT/$DISTRO
256     #BUILD=$ROOT/$BASE
257         
258 }  
259
260 ##########
261 main "$@"