X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lbuild-nightly.sh;h=af3a49d9a122181ed2fd8bf51bff19d20e318eb0;hb=8aaf2a42f56e2f99a0c61dce1cb9ccdff2e4ccf9;hp=8fd1f7d7c25c14f3837f80e0b1b70b68c68b05c7;hpb=862ea1525607b04e2f786ba95cc5146750ec332c;p=build.git diff --git a/lbuild-nightly.sh b/lbuild-nightly.sh index 8fd1f7d7..af3a49d9 100755 --- a/lbuild-nightly.sh +++ b/lbuild-nightly.sh @@ -3,6 +3,13 @@ COMMANDPATH=$0 COMMAND=$(basename $0) +# close stdin, as with ubuntu and debian VMs this script tends to hang and wait for input .. +0<&- + +# old guests have e.g. mount in /bin but this is no longer part of +# the standard PATH in recent hosts after usrmove, so let's keep it simple +export PATH=$PATH:/bin:/sbin + # default values, tunable with command-line options DEFAULT_FCDISTRO=f20 DEFAULT_PLDISTRO=planetlab @@ -20,26 +27,17 @@ DEFAULT_TESTCONFIG="default" RUN_LOG_EXTRAS="" # for publishing results, and the tests settings -x=$(hostname) -y=$(hostname|sed -e s,inria,,) -# INRIA defaults -if [ "$x" != "$y" ] ; then - DEFAULT_WEBPATH="/build/@PLDISTRO@/" - DEFAULT_TESTBUILDURL="http://build.onelab.eu/" - # this is where the buildurl is pointing towards - DEFAULT_WEBROOT="/build/" - DEFAULT_TESTMASTER="testmaster.onelab.eu" -else - DEFAULT_WEBPATH="/build/@FCDISTRO@/@PLDISTRO@/" - DEFAULT_TESTBUILDURL="http://build.planet-lab.org/" - # this is where the buildurl is pointing towards - DEFAULT_WEBROOT="/build/" - DEFAULT_TESTMASTER="manager.test.planet-lab.org" -fi +DEFAULT_WEBPATH="/build/@PLDISTRO@/" +DEFAULT_TESTBUILDURL="http://build.onelab.eu/" +# this is where the buildurl is pointing towards +DEFAULT_WEBROOT="/build/" +DEFAULT_TESTMASTER="testmaster.onelab.eu" #################### # assuming vm runs in UTC DATE=$(date +'%Y.%m.%d') +BUILD_BEG=$(date +'%H:%M') +BUILD_BEG_S=$(date +'%s') # still using /vservers for legacy reasons # as far as the build & test infra, we could adopt a new name @@ -133,12 +131,23 @@ function webpublish_rsync_files () { rsync --archive $VERBOSE "$@" root@${WEBHOST}:"$remote" ; } +function pretty_duration () { + total_seconds=$1; shift + + seconds=$(($total_seconds%60)) + total_minutes=$(($total_seconds/60)) + minutes=$(($total_minutes%60)) + hours=$(($total_minutes/60)) + + printf "%02d:%02d:%02d" $hours $minutes $seconds +} + # Notify recipient of failure or success, manage various stamps function failure() { set -x # early stage ? - let's not create /build/@PLDISTRO@ - if test -z "$WEBLOG" ; then - WEBHOST=$(hostname) + if [ -z "$WEBLOG" ] ; then + WEBHOST=localhost WEBPATH=/tmp WEBBASE=/tmp/lbuild-early-$(date +%Y-%m-%d) WEBLOG=/tmp/lbuild-early-$(date +%Y-%m-%d).log.txt @@ -166,8 +175,8 @@ function failure() { function success () { set -x # early stage ? - let's not create /build/@PLDISTRO@ - if test -z "$WEBLOG" ; then - WEBHOST=$(hostname) + if [ -z "$WEBLOG" ] ; then + WEBHOST=localhost WEBPATH=/tmp WEBLOG=/tmp/lbuild-early-$(date +%Y-%m-%d).log.txt fi @@ -176,12 +185,15 @@ function success () { summary $LOG | webpublish_append_stdin_to_file $WEBLOG if [ -n "$DO_TEST" ] ; then short_message="PASS" + ext="pass" + if [ -n "$IGNORED" ] ; then short_message="PASS/WARN"; ext="warn"; fi ( \ echo "Successfully built and tested" ; \ echo "see build results at $WEBBASE_URL" ; \ echo "including full build log at $WEBBASE_URL/log.txt" ; \ echo "and complete test logs at $WEBBASE_URL/testlogs" ; \ - ) | webpublish_cp_stdin_to_file $WEBBASE.pass + [ -n "$IGNORED" ] && echo "WARNING: some tests steps failed but were ignored - see trace file" ; \ + ) | webpublish_cp_stdin_to_file $WEBBASE.$ext webpublish rm -f $WEBBASE.pkg-ok $WEBBASE.ko else short_message="PKGOK" @@ -192,6 +204,8 @@ function success () { ) | webpublish_cp_stdin_to_file $WEBBASE.pkg-ok webpublish rm -f $WEBBASE.ko fi + BUILD_END=$(date +'%H:%M') + BUILD_END_S=$(date +'%s') if [ -n "$MAILTO" ] ; then ( \ echo "Subject: $short_message ${BASE} ${MAIL_SUBJECT}" ; \ @@ -199,8 +213,10 @@ function success () { echo "$PLDISTRO ($BASE) build for $FCDISTRO completed on $(date)" ; \ echo "see build results at $WEBBASE_URL" ; \ echo "including full build log at $WEBBASE_URL/log.txt" ; \ - [ -n "$DO_TEST" ] && echo "and complete test logs at $WEBBASE_URL/testlogs" ) \ - | sendmail $MAILTO + [ -n "$DO_TEST" ] && echo "and complete test logs at $WEBBASE_URL/testlogs" ; \ + [ -n "$IGNORED" ] && echo "WARNING: some tests steps failed but were ignored - see trace file" ; \ + echo "BUILD TIME: begin $BUILD_BEG -- end $BUILD_END -- duration $(pretty_duration $(($BUILD_END_S-$BUILD_BEG_S)))" ; \ + ) | sendmail $MAILTO fi # XXX For some reason, we haven't been getting this email for successful builds. If this sleep # doesn't fix the problem, I'll remove it -- Sapan. @@ -214,22 +230,6 @@ function in_root_context () { rpm -q libvirt > /dev/null } -# copied from build.common because this cannot have deps. -# (when pulled from infrastructure/scripts/lbuild-nightly.sh) -# old guests have e.g. mount in /bin but this is no longer part of -# the standard PATH in recent hosts after usrmove, so let's keep it simple -export PATH=$PATH:/bin:/sbin - -# would be much simpler if enter-lxc-namespace was looking along a PATH... -function bin_in_container () { - lxc=$1; shift - binary=$1; shift - for path in $(echo $PATH | sed -e 's,:, ,g' ); do - [ -f /vservers/$lxc/$path/$binary ] && { echo $path/$binary; return; } - done - echo bin_in_container_cannot_find_$binary -} - # run in the vm - do not manage success/failure, will be done from the root ctx function build () { set -x @@ -304,20 +304,30 @@ function run_log () { ssh -n ${testmaster_ssh} rm -rf ${testdir} ${testdir}.git # check it out in the build - virsh -c lxc:/// lxc-enter-namespace $BASE -- $(bin_in_container $BASE make) -C /build tests-module + virsh -c lxc:/// lxc-enter-namespace $BASE /bin/bash -c "make -C /build tests-module" # push it onto the testmaster - just the 'system' subdir is enough rsync --verbose --archive $(rootdir $BASE)/build/MODULES/tests/system/ ${testmaster_ssh}:${BASE} # toss the build in the bargain, so the tests don't need to mess with extracting it rsync --verbose --archive $(rootdir $BASE)/build/MODULES/build ${testmaster_ssh}:${BASE}/ - # invoke test on testbox - pass url and build url - so the tests can use vtest-init-lxc.sh + # invoke test on testbox - pass url and build url - so the tests can use lbuild-initvm.sh run_log_env="-p $PERSONALITY -d $PLDISTRO -f $FCDISTRO" - # need to proceed despite of set -e - success=true - # passing the build_scm_url should not be needed anymore - ssh 2>&1 -n ${testmaster_ssh} ${testdir}/run_log --build ${BUILD_SCM_URL} --url ${url} $run_log_env $RUN_LOG_EXTRAS $VERBOSE --all || success= + # temporarily turn off set -e + set +e + trap - ERR INT + ssh 2>&1 ${testmaster_ssh} ${testdir}/run_log --build ${BUILD_SCM_URL} --url ${url} $run_log_env $RUN_LOG_EXTRAS $VERBOSE --all; retcod=$? + + set -e + trap failure ERR INT + # interpret retcod of TestMain.py; 2 means there were ignored steps that failed + echo "retcod from run_log" $retcod + case $retcod in + 0) success=true; IGNORED="" ;; + 2) success=true; IGNORED=true ;; + *) success=""; IGNORED="" ;; + esac # gather logs in the build vm mkdir -p $(rootdir $BASE)/build/testlogs @@ -474,6 +484,7 @@ function usage () { function main () { set -e + trap failure ERR INT # parse arguments MAKEVARS=() @@ -632,11 +643,11 @@ function main () { virsh -c lxc:/// start ${BASE} || : # retrieve environment from the previous run FCDISTRO=$(virsh -c lxc:/// lxc-enter-namespace ${BASE} /build/getdistroname.sh) - BUILD_SCM_URL=$(virsh -c lxc:/// lxc-enter-namespace ${BASE} -- $(bin_in_container $BASE make) --no-print-directory -C /build stage1=skip +build-GITPATH) + BUILD_SCM_URL=$(virsh -c lxc:/// lxc-enter-namespace ${BASE} /bin/bash -c "make --no-print-directory -C /build stage1=skip +build-GITPATH") # for efficiency, crop everything in one make run tmp=/tmp/${BASE}-env.sh - virsh -c lxc:/// lxc-enter-namespace ${BASE} -- $(bin_in_container $BASE make) --no-print-directory -C /build stage1=skip \ - ++PLDISTRO ++PLDISTROTAGS ++PERSONALITY ++MAILTO ++WEBPATH ++TESTBUILDURL ++WEBROOT > $tmp + virsh -c lxc:/// lxc-enter-namespace ${BASE} /bin/bash -c "make --no-print-directory -C /build stage1=skip \ + ++PLDISTRO ++PLDISTROTAGS ++PERSONALITY ++MAILTO ++WEBPATH ++TESTBUILDURL ++WEBROOT" > $tmp . $tmp rm -f $tmp # update build @@ -721,12 +732,13 @@ function main () { cp $COMMANDPATH $(rootdir ${BASE})/build/ # invoke this command in the vm for building (-T) - virsh -c lxc:/// lxc-enter-namespace ${BASE} $(bin_in_container $BASE chmod) +x /build/$COMMAND + virsh -c lxc:/// lxc-enter-namespace ${BASE} /bin/bash -c "chmod +x /build/$COMMAND" virsh -c lxc:/// lxc-enter-namespace ${BASE} /build/$COMMAND "${options[@]}" -b "${BASE}" "${MAKEVARS[@]}" "${MAKETARGETS[@]}" fi # publish to the web so run_log can find them set +e + trap - ERR INT webpublish rm -rf $WEBPATH/$BASE # guess if we've been doing any debian-related build if [ ! -f $(rootdir $BASE)/etc/debian_version ] ; then @@ -745,6 +757,7 @@ function main () { release=$(rootdir $BASE)/build/myplc-release [ -f $release ] && webpublish_rsync_files $WEBPATH/$BASE $release set -e + trap failure ERR INT # create yum repo and sign packages. if [ -n "$SIGNYUMREPO" ] ; then