diff options
author | Kris Kennaway <kris@FreeBSD.org> | 2004-07-14 10:33:19 +0000 |
---|---|---|
committer | Kris Kennaway <kris@FreeBSD.org> | 2004-07-14 10:33:19 +0000 |
commit | 0d973156a703be9306fa58e7ba060bbe154b3780 (patch) | |
tree | ba4311534df947c07d48d5fa216e9cda14e1cd2a /Tools | |
parent | * Add a cleanup() function and use it so that we archive the ${WRKDIR} (diff) |
* Add support for ${TRYBROKEN}.
* Clients no longer have ssh access to the master, so we need to
push/pull everything on the client from here. This means we need to
know where the build took place so we can go in and get the files
after it finishes. Introduce the claim-chroot script which
atomically claims a free chroot directory on the host and returns
the name. This directory is later populated by the portbuild script
if it does not already contain an extracted bindist.
* Use the per-node portbuild.$(hostname) config file to decide where
in the filesystem to claim the chroot on the build host.
* If a port failed unexpectedly (i.e. is not marked BROKEN), or if
something strange happened when trying to pull in build results from
a client, then send me email (XXX should be configurable).
* Clean up after the build finishes and we have everything we need, by
dispatching the clean-chroot script on the client.
Notes
Notes:
svn path=/head/; revision=113622
Diffstat (limited to 'Tools')
-rwxr-xr-x | Tools/portbuild/scripts/pdispatch | 73 |
1 files changed, 67 insertions, 6 deletions
diff --git a/Tools/portbuild/scripts/pdispatch b/Tools/portbuild/scripts/pdispatch index 8ed63f80fe95..1954da4196f7 100755 --- a/Tools/portbuild/scripts/pdispatch +++ b/Tools/portbuild/scripts/pdispatch @@ -16,8 +16,8 @@ if [ "$arch" = "alpha" -o "$arch" = "sparc64" ]; then # wait 16 hours maximum timeout=57600 else - # wait 8 hours maximum - timeout=28800 + # wait 80 hours maximum + timeout=288000 fi branch=$1 @@ -31,19 +31,31 @@ unset DISPLAY pkgname=$(basename $1 ${PKGSUFFIX}) -if grep -qxF $pkgname ${pb}/${arch}/${branch}/duds; then - echo "skipping $pkgname" +if grep -qxF ${pkgname} ${pb}/${arch}/${branch}/duds; then + echo "skipping ${pkgname}" exit 1 fi args=${1+"$@"} + num=$(wc -w ${pb}/${arch}/ulist | awk '{print $1}') random=$(jot -r 1 1 ${num}) mach=$(cat ${pb}/${arch}/ulist | cut -f ${random} -d ' ' ) +# If ulist is empty, then all build machines are busy, so try again in 15 seconds. +if [ -z "${mach}" ]; then + echo "All machines busy, sleeping" + sleep 15 + echo "Retrying build of ${pkgname}" + make ${pkgname} + exit 0 +fi set $mach + flags="" +noclean=0 if [ "x$NOCLEAN" != "x" ]; then flags="${flags} -noclean" + noclean=1 fi if [ "x$NO_RESTRICTED" != "x" ]; then flags="${flags} -norestr" @@ -60,6 +72,55 @@ fi if [ "x$FETCH_ORIGINAL" != "x" ]; then flags="${flags} -fetch-original" fi +if [ "x$TRYBROKEN" != "x" ]; then + flags="${flags} -trybroken" +fi +host=$1 +. ${pb}/${arch}/portbuild.${host} + +echo "Claiming a directory for ${pkgname} on ${host}" +chroot=$(ssh -a -n root@${host} ${pb}/scripts/claim-chroot ${arch} ${branch} ${pkgname}) +status=$? +if [ ! ${status} ]; then + exit ${status} +fi +echo "--> got directory ${chroot}" + +echo "dispatching: ssh -a -t -n root@${host} ${command} ${arch} ${branch} ${chroot} ${flags} \"$ED\" \"$PD\" \"$FD\" \"$BD\" \"$RD\" ${args}" +${pb}/scripts/ptimeout.host $timeout ssh -a -t -n root@${host} ${command} ${arch} ${branch} ${chroot} ${flags} \"$ED\" \"$PD\" \"$FD\" \"$BD\" \"$RD\" ${args} +error=$? + +# Pull in the results of the build from the client + +scp root@${host}:${chroot}/tmp/${pkgname}.log ${pb}/${arch}/${branch}/logs/${pkgname}.log +(ssh -a -n root@${host} test -f ${chroot}/tmp/work.tbz ) && scp root@${host}:${chroot}/tmp/work.tbz ${pb}/${arch}/${branch}/wrkdirs/${pkgname}.tbz + +if [ "x$WANT_DISTFILES" != "x" ]; then + mkdir -p ${pb}/${arch}/${branch}/distfiles/.pbtmp/${pkgname} + ssh -a -n root@${host} tar -C ${chroot}/tmp/distfiles -cf - . | \ + tar --unlink -C ${pb}/${arch}/${branch}/distfiles/.pbtmp/${pkgname} -xvf - + touch ${pb}/${arch}/${branch}/distfiles/.pbtmp/${pkgname}/.done +fi + +if [ "${error}" = 0 ]; then + ssh -a -n root@${host} tar -C ${chroot}/tmp -cf - packages | \ + tar --unlink -C ${pb}/${arch}/${branch} -xvf - + test -f ${pb}/${arch}/${branch}/packages/All/${pkgname}${PKGSUFFIX} && \ + touch ${pb}/${arch}/${branch}/packages/All/${pkgname}${PKGSUFFIX} + rm -f ${pb}/${arch}/${branch}/errors/${pkgname}.log + lockf ${pb}/${arch}/${branch}/failure.lock ${pb}/scripts/buildsuccess ${arch} ${branch} ${pkgname} + if grep -q "even though it is marked BROKEN" ${pb}/${arch}/${branch}/logs/$pkgname.log; then + echo | mail -s "${pkgname} BROKEN but built on ${arch} ${branch}" kris@FreeBSD.org + fi +else + log=${pb}/${arch}/${branch}/errors/${pkgname}.log + scp root@${host}:${chroot}/tmp/${pkgname}.log ${log} || (echo ${chroot}@${host}; ssh -a -n root@${host} ls -laR ${chroot}/tmp) | mail -s "${pkgname} logfile not found" kris@FreeBSD.org + if ! grep -q "even though it is marked BROKEN" ${log}; then + tail -1000 ${log} | mail -s "${pkgname} failed on ${arch} ${branch}" kris@FreeBSD.org + fi + lockf ${pb}/${arch}/${branch}/failure.lock ${pb}/scripts/buildfailure ${arch} ${branch} ${pkgname} +fi + +ssh -a -n root@${host} ${pb}/scripts/clean-chroot ${arch} ${branch} ${chroot} ${noclean} -echo "dispatching: ssh -a -t -n root@$1 ${command} ${arch} ${branch} $flags $args at $(date)" -${pb}/scripts/ptimeout.host $timeout ssh -a -t -n root@$1 ${command} ${arch} ${branch} ${flags} $args +exit ${error} |