2 REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
7 # default values, tunable with command-line options
9 DEFAULT_PLDISTRO=onelab
11 DEFAULT_SVNPATH="http://svn.one-lab.org/build/trunk"
13 DEFAULT_MAILTO_planetlab="devel@planet-lab.org"
14 DEFAULT_MAILTO_onelab="onelab-build@one-lab.org"
16 # web publishing results
17 WEBPATH=/build/@PLDISTRO@/@BASE@
18 WEBLOG=/build/@PLDISTRO@/@BASE@.txt
21 TESTBUILDURL="http://build.one-lab.org/"
22 TESTBOX=onelab-test.inria.fr
23 TESTBOXSSH=root@onelab-test.inria.fr
24 TESTSVNPATH="http://svn.one-lab.org/new_plc_api/trunk/plctest"
25 TESTSCRIPT=TestMain.py
27 # assuming vserver runs in UTC
28 DATE=$(date -u +'%Y.%m.%d')
30 # Notify recipient of failure or success, manage various stamps
33 (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k $LOG) >> $(dirname $LOG)/build-broken.txt
34 if [ -n "$MAILTO" ] ; then
35 tail -c 8k $LOG | mail -s "Failures for ${BASE}" $MAILTO
42 touch $(dirname $LOG)/build-ok.txt
43 if [ -n "$MAILTO" ] ; then
44 (echo "http://build.one-lab.org/$PLDISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
54 echo -n "============================== Starting $COMMAND:build on "
58 # svn checkout $SVNPATH $BASE
60 # if TAGSRELEASE specified : update PLDISTROTAGS with this tag
61 if [ -n "$TAGSRELEASE" ] ; then
63 svn up -r $TAGSRELEASE $PLDISTROTAGS
69 echo "Running make IN $(pwd)"
70 make stage1=true "${MAKEOPTS[@]}" PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${PLDISTRO} "${MAKEVARS[@]}" -C /build
71 # in case we use an older build
73 make "${MAKEOPTS[@]}" PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${PLDISTRO} "${MAKEVARS[@]}" -C /build versions
75 make "${MAKEOPTS[@]}" PLDISTROTAGS=${PLDISTROTAGS} PLDISTRO=${PLDISTRO} "${MAKEVARS[@]}" -C /build $MAKETARGETS
77 # restore silent mode - otherwise cron gets it
86 echo -n "============================== Starting $COMMAND:runtest on "
89 ### compute URL to the myplc package
91 rpm=$(find RPMS -name myplc\*.rpm )
92 url=${TESTBUILDURL}${PLDISTRO}/${BASE}/${rpm}
93 ### checkout the test material
94 svn co ${TESTSVNPATH} plctest
95 # compute test directory name on test box
96 testdir=plctest-${buildname}
97 # rsync/push test material onto the test box
98 ssh ${TESTBOXSSH} mkdir -p ${testdir}
99 rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
100 # invoke test on testbox
101 ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url}
102 #invoke make install from build to the testbox
103 make install PLCHOST=${TESTBOX}
105 if [ "$?" != 0 ] ; then
112 function show_env () {
114 echo FCDISTRO=$FCDISTRO
115 echo PLDISTRO=$PLDISTRO
117 echo SVNPATH=$SVNPATH
118 echo MAKEVARS="${MAKEVARS[@]}"
119 echo MAKEOPTS="${MAKEOPTS[@]}"
120 echo PLDISTROTAGS="$PLDISTROTAGS"
121 echo TAGSRELEASE="$TAGSRELEASE"
122 if [ -f /build/$PLDISTROTAGS ] ; then
123 echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $PLDISTROTAGS"
124 cat /build/$PLDISTROTAGS
126 echo "no tags definition - normal if outside of the vserver"
128 echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
132 echo "Usage: $COMMAND [option] make-targets"
133 echo "This is $REVISION"
134 echo "Supported options"
135 echo " -n dry-run : -n passed to make - vserver gets created though - no mail sent"
136 echo " -f FCDISTRO - defaults to $DEFAULT_FCDISTRO"
137 echo " -d PLDISTRO - defaults to $DEFAULT_PLDISTRO"
138 echo " -b BASE - defaults to $DEFAULT_BASE"
139 echo " may include @ (replaced with date), % (fcdistro) or = (pldistro)"
140 echo " -t PLDISTROTAGS - defaults to \${PLDISTRO}-tags.mk"
141 echo " -r TAGSRELEASE - a release number that refers to PLDISTROTAGS - defaults to HEAD"
142 echo " -s SVNPATH - where to fetch the build module"
143 echo " -o : overwrite - re-run in base directory, do not create vserver"
145 echo " -a MAKEVAR=value - space in values are not supported"
146 echo " -B : run build only"
147 echo " -T : run test only"
155 # preserve arguments for passing them again later
157 for arg in "$@"; do argv=(${argv[@]} "$arg") ; done
164 while getopts "nf:d:b:t:r:s:om:a:BTh" opt ; do
166 n) DRY_RUN="true" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
167 f) FCDISTRO=$OPTARG ;;
168 d) PLDISTRO=$OPTARG ;;
170 t) PLDISTROTAGS=$OPTARG ;;
171 r) TAGSRELEASE=$OPTARG ;;
172 s) SVNPATH=$OPTARG ;;
175 a) MAKEVARS=(${MAKEVARS[@]} "$OPTARG") ;;
177 T) DO_BUILD= ; USEOLD=true ;;
182 shift $(($OPTIND - 1))
186 [ -z "$FCDISTRO" ] && FCDISTRO=$DEFAULT_FCDISTRO
187 [ -z "$PLDISTRO" ] && PLDISTRO=$DEFAULT_PLDISTRO
188 [ -z "$PLDISTROTAGS" ] && PLDISTROTAGS="${PLDISTRO}-tags.mk"
189 [ -z "$BASE" ] && BASE="$DEFAULT_BASE"
190 [ -z "$SVNPATH" ] && SVNPATH="$DEFAULT_SVNPATH"
192 if [ "$PLDISTRO" = "onelab" ] ; then
193 [ -z "$MAILTO" ] && MAILTO="$DEFAULT_MAILTO_onelab"
195 [ -z "$MAILTO" ] && MAILTO="$DEFAULT_MAILTO_planetlab"
197 [ -n "$DRY_RUN" ] && MAILTO=""
199 ### set BASE from DISTRO, if unspecified
200 BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g" -e "s,%,${FCDISTRO},g" -e "s,=,${PLDISTRO},g")
202 if [ -d /vservers ] ; then
203 # we run in the root context :
204 # (*) create or check for the vserver to use
205 # (*) copy this command in the vserver
208 if [ -n "$USEOLD" ] ; then
209 ### Re-use a vserver (finish an unfinished build..)
210 if [ ! -d /vservers/${BASE} ] ; then
211 echo $COMMAND : cannot find vserver $BASE
215 LOG=/vservers/${BASE}-log.txt
217 echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date)
220 vserver ${BASE} exec svn update /build
222 # create vserver: check it does not exist yet
224 while [ -d /vservers/${BASE}${i} ] ; do
225 # we name subsequent builds <base>-n<i> so the logs and builds get sorted properly
226 [ -z ${i} ] && BASE=${BASE}-n
228 if [ $i -gt 100 ] ; then
229 echo "$COMMAND: Failed to create build vserver /vservers/${BASE}${i}"
235 LOG=/vservers/${BASE}-log.txt
237 echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date)
240 ### extract vbuild-init-vserver.sh and run it
241 svn cat $SVNPATH/vbuild-init-vserver.sh > /tmp/vbuild-init-vserver-$$
244 svn cat $SVNPATH/${PLDISTRO}-devel-${FCDISTRO}.lst > /tmp/devel-$$.lst
245 if [ "$?" = 0 ] ; then
246 mv /tmp/devel-$$.lst /tmp/${PLDISTRO}-devel-${FCDISTRO}.lst
248 svn cat $SVNPATH/${PLDISTRO}-devel.lst > /tmp/devel-$$.lst
249 if [ "$?" = 0 ] ; then
250 mv /tmp/devel-$$.lst /tmp/${PLDISTRO}-devel.lst
252 echo "$COMMAND: Cannot locate ${PLDISTRO}-devel.lst"
260 chmod +x vbuild-init-vserver-$$
261 /tmp/vbuild-init-vserver-$$ ${BASE} ${FCDISTRO} ${PLDISTRO}
264 vserver ${BASE} exec svn checkout ${SVNPATH} /build
266 # The log inside the vserver contains everything
267 LOG2=/vservers/${BASE}/build/build-log.txt
268 (echo "==================== Transcript of vserver creation" ; cat $LOG ; echo "==================== End of vserver creation") >> $LOG2
269 echo "==================== See next stages in $LOG2" >> $LOG
274 echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date)
275 cp $COMMANDPATH /vservers/${BASE}/
276 # invoke this command in the vserver
277 vserver ${BASE} exec /$COMMAND "${argv[@]}"
280 webpath=$(echo $WEBPATH | sed -e s,@PLDISTRO@,"$PLDISTRO",g -e s,@BASE@,"$BASE",g)
281 weblog=$(echo $WEBLOG | sed -e s,@PLDISTRO@,"$PLDISTRO",g -e s,@BASE@,"$BASE",g)
283 ln -s /vservers/$BASE/build $webpath
288 LOG=/build/build-log.txt
289 if [ -n "$DO_BUILD" ] ; then
295 # ssh is missing in the vserver
296 # and in any case the way it's done now, the stuff gets published AFTER the test is run
297 # if [ -n "$DO_TEST" ] ; then