X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vbuild-nightly.sh;h=245dd6f6ca216efd7e1a2690c6d4d820500fa29a;hb=1d6463ce5573f5e9d5b2b78bfeffadd99cdc405b;hp=08843d3adb9aaa2bf0a1a8c2722fcefd9bd894f7;hpb=71ccfeb2b514ee738f1b95b0dccb9fd05a1a2de6;p=build.git diff --git a/vbuild-nightly.sh b/vbuild-nightly.sh index 08843d3a..245dd6f6 100755 --- a/vbuild-nightly.sh +++ b/vbuild-nightly.sh @@ -1,15 +1,15 @@ #!/bin/bash -REVISION=$(echo '$Revision: 18119 $' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' ) +REVISION=$(echo '$Revision: 18120 $' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' ) COMMANDPATH=$0 COMMAND=$(basename $0) # default values, tunable with command-line options -DEFAULT_FCDISTRO=centos5 +DEFAULT_FCDISTRO=f14 DEFAULT_PLDISTRO=planetlab -DEFAULT_PERSONALITY=linux32 +DEFAULT_PERSONALITY=linux64 DEFAULT_BASE="@DATE@--@PLDISTRO@-@FCDISTRO@-@PERSONALITY@" -DEFAULT_BUILD_SCM_URL="http://svn.planet-lab.org/svn/build/trunk" +DEFAULT_BUILD_SCM_URL="git://git.onelab.eu/build" DEFAULT_IFNAME=eth0 # default gpg path used in signing yum repo @@ -18,6 +18,8 @@ DEFAULT_GPGPATH="/etc/planetlab" DEFAULT_GPGUID="root@$( /bin/hostname )" DEFAULT_TESTCONFIG="default" +# for passing args to run_log +RUN_LOG_EXTRAS="" # for publishing results, and the tests settings x=$(hostname) @@ -111,18 +113,22 @@ EOF # utilities for handling the pushed material (rpms, logfiles, ...) function webpublish_misses_dir () { ssh root@${WEBHOST} "bash -c \"test \! -d $1\"" ; } function webpublish () { ssh root@${WEBHOST} "$@" ; } -function webpublish_rsync_dir () { rsync --archive --delete $VERBOSE $1 root@${WEBHOST}:$2 ; } -function webpublish_rsync_file () { rsync $VERBOSE $1 root@${WEBHOST}:$2 ; } function webpublish_cp_local_to_remote () { scp $1 root@${WEBHOST}:$2 ; } function webpublish_cp_stdin_to_file () { ssh root@${WEBHOST} cat \> $1; } function webpublish_append_stdin_to_file () { ssh root@${WEBHOST} cat \>\> $1; } +# provide remote dir as first argument, so any number of local files can be passed next +function webpublish_rsync_dir () { rsync --archive --delete $VERBOSE $2 root@${WEBHOST}:$1 ; } +function webpublish_rsync_files () { + remote="$1"; shift + rsync --archive $VERBOSE "$@" root@${WEBHOST}:"$remote" ; +} # Notify recipient of failure or success, manage various stamps function failure() { set -x # early stage ? - let's not create /build/@PLDISTRO@ - if webpublish_misses_dir $WEBPATH ; then - WEBHOST=localhost + if test -z "$WEBLOG" ; then + WEBHOST=$(hostname) WEBPATH=/tmp WEBBASE=/tmp/vbuild-early-$(date +%Y-%m-%d) WEBLOG=/tmp/vbuild-early-$(date +%Y-%m-%d).log.txt @@ -135,10 +141,11 @@ function failure() { webpublish_cp_stdin_to_file $WEBBASE.ko ||: if [ -n "$MAILTO" ] ; then ( \ - echo "Subject: Failures with $MAIL_SUBJECT $BASE on $(hostname)" ; \ - echo "See full build log at $WEBBASE_URL/log.txt" ; \ - echo "and tail version at $WEBBASE_URL.ko" ; \ - echo "See complete set of testlogs at $WEBBASE_URL/testlogs" ; \ + echo "Subject: KO ${BASE} ${MAIL_SUBJECT}" ; \ + echo "To: $MAILTO" ; \ + 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" ; \ echo "........................................" ; \ webpublish tail --lines=1000 $WEBLOG ) | \ sendmail $MAILTO @@ -149,8 +156,8 @@ function failure() { function success () { set -x # early stage ? - let's not create /build/@PLDISTRO@ - if webpublish_misses_dir ${WEBPATH} ; then - WEBHOST=localhost + if test -z "$WEBLOG" ; then + WEBHOST=$(hostname) WEBPATH=/tmp WEBLOG=/tmp/vbuild-early-$(date +%Y-%m-%d).log.txt fi @@ -158,25 +165,31 @@ function success () { webpublish_cp_local_to_remote $LOG $WEBLOG summary $LOG | webpublish_append_stdin_to_file $WEBLOG if [ -n "$DO_TEST" ] ; then + short_message="PASS" ( \ echo "Successfully built and tested" ; \ - echo "See full build log at $WEBBASE_URL/log.txt" ; \ - echo "See complete set of testlogs at $WEBBASE_URL/testlogs" ; \ + 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 webpublish rm -f $WEBBASE.pkg-ok $WEBBASE.ko else + short_message="PKGOK" ( \ echo "Successful package-only build, no test requested" ; \ - echo "See full build log at $WEBBASE_URL/log.txt" ; \ + echo "see build results at $WEBBASE_URL" ; \ + echo "including full build log at $WEBBASE_URL/log.txt" ; \ ) | webpublish_cp_stdin_to_file $WEBBASE.pkg-ok webpublish rm -f $WEBBASE.ko fi if [ -n "$MAILTO" ] ; then ( \ - echo "Subject: Success with ${MAIL_SUBJECT} ${BASE} on $(hostname)" ; \ + echo "Subject: $short_message ${BASE} ${MAIL_SUBJECT}" ; \ + echo "To: $MAILTO" ; \ echo "$PLDISTRO ($BASE) build for $FCDISTRO completed on $(date)" ; \ - echo "See full build log at $WEBBASE_URL/log.txt" ; \ - [ -n "$DO_TEST" ] && echo "See complete set of testlogs at $WEBBASE_URL/testlogs" ) \ + 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 fi # XXX For some reason, we haven't been getting this email for successful builds. If this sleep @@ -214,6 +227,9 @@ function build () { MAKEVARS=("BASE=${BASE}" "${MAKEVARS[@]}") + # initialize latex + /build/latex-first-run.sh || : + # stage1 make -C /build $DRY_RUN "${MAKEVARS[@]}" stage1=true # versions @@ -268,23 +284,19 @@ function run_log () { rsync --verbose --archive /vservers/$BASE/build/MODULES/build ${testmaster_ssh}:${BASE}/ # invoke test on testbox - pass url and build url - so the tests can use vtest-init-vserver.sh - configs="" - for config in ${TESTCONFIG} ; do - configs="$configs --config $config" - done - test_env="-p $PERSONALITY -d $PLDISTRO -f $FCDISTRO" + 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} $configs $test_env $VERBOSE --all || success= + ssh 2>&1 -n ${testmaster_ssh} ${testdir}/run_log --build ${BUILD_SCM_URL} --url ${url} $run_log_env $RUN_LOG_EXTRAS $VERBOSE --all || success= # gather logs in the build vserver mkdir -p /vservers/$BASE/build/testlogs rsync --verbose --archive ${testmaster_ssh}:$BASE/logs/ /vservers/$BASE/build/testlogs # push them to the build web chmod -R a+r /vservers/$BASE/build/testlogs/ - webpublish_rsync_dir /vservers/$BASE/build/testlogs/ $WEBPATH/$BASE/testlogs/ + webpublish_rsync_dir $WEBPATH/$BASE/testlogs/ /vservers/$BASE/build/testlogs/ echo "============================== END $COMMAND:run_log on $(date)" @@ -405,17 +417,23 @@ function usage () { echo " -p personality - defaults to $DEFAULT_PERSONALITY" echo " -m mailto - no default" echo " -s build_scm_url - git or svn URL where to fetch the build module - defaults to $DEFAULT_BUILD_SCM_URL" + echo " define GIT tag or branch name appending @tagname to url" echo " -t pldistrotags - defaults to \${PLDISTRO}-tags.mk" echo " -b base - defaults to $DEFAULT_BASE" echo " @NAME@ replaced as appropriate" echo " -o base: (overwrite) do not re-create vserver, re-use base instead" echo " the -f/-d/-p/-m/-s/-t options are uneffective in this case" echo " -c testconfig - defaults to $DEFAULT_TESTCONFIG" + echo " -y {pl,pg} - passed to run_log" + echo " -e step - passed to run_log" + echo " -X : passes --lxc to run_log" + echo " -S : passes --vs to run_log" + echo " -x - a hook to pass other arguments to run_log" echo " -w webpath - defaults to $DEFAULT_WEBPATH" echo " -W testbuildurl - defaults to $DEFAULT_TESTBUILDURL; this is also used to get the hostname where to publish builds" echo " -r webroot - defaults to $DEFAULT_WEBROOT - the fs point where testbuildurl actually sits" echo " -M testmaster - defaults to $DEFAULT_TESTMASTER" - echo " -y - sign yum repo in webpath" + echo " -Y - sign yum repo in webpath" echo " -g gpg_path - to the gpg secring used to sign rpms. Defaults to $DEFAULT_GPGPATH" echo " -u gpg_uid - email used in secring. Defaults to $DEFAULT_GPGUID" echo " -K svnsshkey - specify key to use when svn+ssh:// URLs are used for SVNPATH" @@ -426,6 +444,7 @@ function usage () { echo " -v - be verbose" echo " -7 - uses weekday-@FCDISTRO@ as base" echo " -i ifname - defaults to $DEFAULT_IFNAME - used to determine local IP" + echo " --build-branch branch - build using the branch from build module" exit 1 } @@ -442,40 +461,61 @@ function main () { PUBLISH_SRPMS=true SSH_KEY="" SIGNYUMREPO="" - while getopts "f:d:p:m:s:t:b:o:c:w:W:r:M:yg:u:K:SBTnv7i:" opt ; do - case $opt in - f) FCDISTRO=$OPTARG ;; - d) PLDISTRO=$OPTARG ;; - p) PERSONALITY=$OPTARG ;; - m) MAILTO=$OPTARG ;; - s) BUILD_SCM_URL=$OPTARG ;; - t) PLDISTROTAGS=$OPTARG ;; - b) BASE=$OPTARG ;; - o) OVERBASE=$OPTARG ;; - c) TESTCONFIG="$TESTCONFIG $OPTARG" ;; - w) WEBPATH=$OPTARG ;; - W) TESTBUILDURL=$OPTARG ;; - r) WEBROOT=$OPTARG ;; - M) TESTMASTER=$OPTARG ;; - y) SIGNYUMREPO=true ;; - g) GPGPATH=$OPTARG ;; - u) GPGUID=$OPTARG ;; - K) SSH_KEY=$OPTARG ;; - S) PUBLISH_SRPMS="" ;; - B) DO_TEST= ;; - T) DO_BUILD= ;; - n) DRY_RUN="-n" ;; - v) set -x ; VERBOSE="-v" ;; - 7) BASE="$(date +%a|tr A-Z a-z)-@FCDISTRO@" ;; - i) IFNAME=$OPTARG ;; - h|*) usage ;; + + OPTS_ORIG=$@ + OPTS=$(getopt -o "f:d:p:m:s:t:b:o:c:y:e:XSx:w:W:r:M:Yg:u:K:SBTnv7i:P:h" -l "build-branch:" -- $@) + if [ $? != 0 ] + then + usage + fi + eval set -- "$OPTS" + while true; do + case $1 in + -f) FCDISTRO=$2; shift 2 ;; + -d) PLDISTRO=$2; shift 2 ;; + -p) PERSONALITY=$2; shift 2 ;; + -m) MAILTO=$2; shift 2 ;; + -s) BUILD_SCM_URL=$2; shift 2 ;; + -t) PLDISTROTAGS=$2; shift 2 ;; + -b) BASE=$2; shift 2 ;; + -o) OVERBASE=$2; shift 2 ;; + -c) TESTCONFIG="$TESTCONFIG $2"; shift 2 ;; + ########## passing stuff to run_log + # -y foo -> run_log -y foo + -y) RUN_LOG_EXTRAS="$RUN_LOG_EXTRAS --rspec-style $2"; shift 2 ;; + # -e foo -> run_log -e foo + -e) RUN_LOG_EXTRAS="$RUN_LOG_EXTRAS --exclude $2"; shift 2 ;; + # -X -> run_log --lxc + -X) RUN_LOG_EXTRAS="$RUN_LOG_EXTRAS --lxc"; shift;; + # -S -> run_log --vs + -S) RUN_LOG_EXTRAS="$RUN_LOG_EXTRAS --vs"; shift;; + # more general form to pass args to run_log + # -x foo -> run_log foo + -x) RUN_LOG_EXTRAS="$RUN_LOG_EXTRAS $2"; shift 2;; + ########## + -w) WEBPATH=$2; shift 2 ;; + -W) TESTBUILDURL=$2; shift 2 ;; + -r) WEBROOT=$2; shift 2 ;; + -M) TESTMASTER=$2; shift 2 ;; + -Y) SIGNYUMREPO=true; shift ;; + -g) GPGPATH=$2; shift 2 ;; + -u) GPGUID=$2; shift 2 ;; + -K) SSH_KEY=$2; shift 2 ;; + -S) PUBLISH_SRPMS="" ; shift ;; + -B) DO_TEST= ; shift ;; + -T) DO_BUILD= ; shift;; + -n) DRY_RUN="-n" ; shift ;; + -v) set -x ; VERBOSE="-v" ; shift ;; + -7) BASE="$(date +%a|tr A-Z a-z)-@FCDISTRO@" ; shift ;; + -i) IFNAME=$2; shift 2 ;; + -P) PREINSTALLED="-P $2"; shift 2;; + -h) usage ; shift ;; + --) shift; break ;; esac done - + # preserve options for passing them again later, together with expanded base - declare -a options - toshift=$(($OPTIND - 1)) - arg=1; while [ $arg -le $toshift ] ; do options=(${options[@]} "$1") ; shift; arg=$(($arg+1)) ; done + options=$OPTS_ORIG # allow var=value stuff; for target in "$@" ; do @@ -505,6 +545,12 @@ function main () { [ -z "$TESTMASTER" ] && TESTMASTER="$DEFAULT_TESTMASTER" [ -n "$DRY_RUN" ] && MAILTO="" + + # elaborate the extra args to be passed to run_log + for config in ${TESTCONFIG} ; do + RUN_LOG_EXTRAS="$RUN_LOG_EXTRAS --config $config" + done + if [ -n "$OVERBASE" ] ; then sedargs="-e s,@DATE@,${DATE},g" @@ -516,17 +562,19 @@ function main () { ### elaborate mail subject if [ -n "$DO_BUILD" -a -n "$DO_TEST" ] ; then - MAIL_SUBJECT="complete" + MAIL_SUBJECT="full" elif [ -n "$DO_BUILD" ] ; then - MAIL_SUBJECT="package-only" + MAIL_SUBJECT="pkg-only" elif [ -n "$DO_TEST" ] ; then MAIL_SUBJECT="test-only" fi if [ -n "$OVERBASE" ] ; then - MAIL_SUBJECT="$MAIL_SUBJECT incremental run on" + MAIL_SUBJECT="${MAIL_SUBJECT} rerun" else - MAIL_SUBJECT="$MAIL_SUBJECT fresh build" + MAIL_SUBJECT="${MAIL_SUBJECT} fresh" fi + short_hostname=$(hostname | cut -d. -f1) + MAIL_SUBJECT="on ${short_hostname} - ${MAIL_SUBJECT}" ### compute WEBHOST from TESTBUILDURL # this is to avoid having to change the builds configs everywhere @@ -560,25 +608,24 @@ function main () { echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date) # start in case e.g. we just rebooted vserver ${BASE} start || : + # retrieve environment from the previous run + FCDISTRO=$(vserver ${BASE} exec /build/getdistroname.sh) + BUILD_SCM_URL=$(vserver ${BASE} exec make --no-print-directory -C /build stage1=skip +build-SVNPATH +build-GITPATH) + # for efficiency, crop everything in one make run + tmp=/tmp/${BASE}-env.sh + vserver ${BASE} exec make --no-print-directory -C /build stage1=skip \ + ++PLDISTRO ++PLDISTROTAGS ++PERSONALITY ++MAILTO ++WEBPATH ++TESTBUILDURL ++WEBROOT > $tmp + . $tmp + rm -f $tmp # update build [ -n "$SSH_KEY" ] && setupssh ${BASE} ${SSH_KEY} if echo $BUILD_SCM_URL | grep -q git ; then - vserver $BASE exec bash -c "cd /build; git pull" + vserver $BASE exec bash -c "cd /build; git pull; make tests-clean" else vserver $BASE exec svn update /build fi # make sure we refresh the tests place in case it has changed rm -f /build/MODULES/tests - # get environment from the first run - FCDISTRO=$(vserver ${BASE} exec /build/getdistroname.sh) - # retrieve all in one run - tmp=/tmp/${BASE}-env.sh - vserver ${BASE} exec make --no-print-directory -C /build stage1=skip \ - ++PLDISTRO ++PLDISTROTAGS ++PERSONALITY ++MAILTO ++WEBPATH ++TESTBUILDURL ++WEBROOT > $tmp - # sh vars cannot have a minus - echo BUILD_SCM_URL=$(vserver ${BASE} exec make --no-print-directory -C /build stage1=skip +build-SVNPATH +build-GITPATH) >> $tmp - . $tmp - rm -f $tmp options=(${options[@]} -d $PLDISTRO -t $PLDISTROTAGS -s $BUILD_SCM_URL) [ -n "$PERSONALITY" ] && options=(${options[@]} -p $PERSONALITY) [ -n "$MAILTO" ] && options=(${options[@]} -m $MAILTO) @@ -620,14 +667,14 @@ function main () { fi # Create vserver cd $tmpdir - ./vbuild-init-vserver.sh $VERBOSE -f ${FCDISTRO} -d ${PLDISTRO} -p ${PERSONALITY} -i ${IFNAME} ${BASE} + ./vbuild-init-vserver.sh $VERBOSE -f ${FCDISTRO} -d ${PLDISTRO} -p ${PERSONALITY} -i ${IFNAME} ${PREINSTALLED} ${BASE} # cleanup cd - rm -rf $tmpdir # Extract build again - in the vserver [ -n "$SSH_KEY" ] && setupssh ${BASE} ${SSH_KEY} if echo $BUILD_SCM_URL | grep -q git ; then - vserver $BASE exce bash -c "mkdir /build ; git archive --remote=$GIT_REPO $GIT_TAG | tar -C /build -xf -" + vserver $BASE exec bash -c "git clone $GIT_REPO /build; cd /build; git checkout $GIT_TAG" else vserver $BASE exec svn checkout ${BUILD_SCM_URL} /build fi @@ -670,12 +717,22 @@ function main () { # publish to the web so run_log can find them set +e webpublish rm -rf $WEBPATH/$BASE - webpublish mkdir -p $WEBPATH/$BASE/{RPMS,SRPMS} - webpublish_rsync_dir /vservers/$BASE/build/RPMS/ $WEBPATH/$BASE/RPMS/ - [[ -n "$PUBLISH_SRPMS" ]] && webpublish_rsync_dir /vservers/$BASE/build/SRPMS/ $WEBPATH/$BASE/SRPMS/ + # guess if we've been doing any debian-related build + if [ ! -f /vservers/$BASE/etc/debian_version ] ; then + webpublish mkdir -p $WEBPATH/$BASE/{RPMS,SRPMS} + webpublish_rsync_dir $WEBPATH/$BASE/RPMS/ /vservers/$BASE/build/RPMS/ + [[ -n "$PUBLISH_SRPMS" ]] && webpublish_rsync_dir $WEBPATH/$BASE/SRPMS/ /vservers/$BASE/build/SRPMS/ + else + # run scanpackages so we can use apt-get on this + # (not needed on fedora b/c this is done by the regular build already) + vserver $BASE exec bash -c "(cd /build ; dpkg-scanpackages DEBIAN/ | gzip -9c > DEBIAN/Packages.gz)" + webpublish mkdir -p $WEBPATH/$BASE/DEBIAN + webpublish_rsync_files $WEBPATH/$BASE/DEBIAN/ /vservers/$BASE/build/DEBIAN/*.deb + webpublish_rsync_files $WEBPATH/$BASE/ /vservers/$BASE/build/DEBIAN/*.gz + fi # publish myplc-release if this exists release=/vservers/$BASE/build/myplc-release - [ -f $release ] && webpublish_rsync_file $release $WEBPATH/$BASE + [ -f $release ] && webpublish_rsync_files $WEBPATH/$BASE $release set -e # create yum repo and sign packages.