diff options
author | kris <kris@FreeBSD.org> | 2004-07-14 17:05:32 +0800 |
---|---|---|
committer | kris <kris@FreeBSD.org> | 2004-07-14 17:05:32 +0800 |
commit | e540436119734f1aff2660681f5e8759fde95b55 (patch) | |
tree | 29bb26c9bc203e941a6037adb58b67190d91a9c4 | |
parent | 4fb0d54618beb045fb242bbd9d44276e0bc3bfdf (diff) | |
download | freebsd-ports-gnome-e540436119734f1aff2660681f5e8759fde95b55.tar.gz freebsd-ports-gnome-e540436119734f1aff2660681f5e8759fde95b55.tar.zst freebsd-ports-gnome-e540436119734f1aff2660681f5e8759fde95b55.zip |
* Initial support for disconnected nodes (not on same LAN as build
host), specified by disconnected=1 in portbuild.$(hostname) file.
These do not mount via NFS, so we need to maintain a local copy of
things needed by the build (like the ports/src/doc trees) on the build
host, which are mounted into the chroot by read-only nullfs. These
local files are maintained in the dopackages script via rsync.
* Download packages via http instead of NFS. Allow fetching via a
local http proxy (http_proxy variable in per-node
portbuild.$(hostname) file). Caching package dependencies saves about
85% of package fetches and similar reduction in package fetch traffic
by byte count.
* Support a per-node tarball (bindist-$(hostname).tar) to customize
the build chroots. This is used for things like local resolv.conf and
make.conf files on disconnected nodes.
* Make sure we don't use a chroot until it is finished extracting.
* Don't set '.' in PATH; this is bad practise, and fortunately nothing
seems to rely on it.
* Only try to build broken packages if requested
* Try harder to unmount leftover linprocfs mounts in the chroot, by copying
in the 5.x mount binary and supporting libraries from the host system.
The 5.x mount is able to unmount by FSID in situations where the 4.x umount
becomes confused.
* Don't clean up when we are signalled, that is done by the build
master from outside.
* Suppress some code relating to jail builds, which are not yet ready
for use.
* Don't push results of the build back to the master; the master now
pulls them from the client when the build completes. Clients no
longer need ssh access into the master; this is good for security as
well as significantly reducing the load on the master since it is not
thrashed by dozens of sshd processes.
-rwxr-xr-x | Tools/portbuild/scripts/portbuild | 171 |
1 files changed, 88 insertions, 83 deletions
diff --git a/Tools/portbuild/scripts/portbuild b/Tools/portbuild/scripts/portbuild index 03e82553bc26..5abf29b09795 100755 --- a/Tools/portbuild/scripts/portbuild +++ b/Tools/portbuild/scripts/portbuild @@ -2,6 +2,38 @@ # usage: $0 ARCH BRANCH [-noclean] [-norestr] [-plistcheck] [-nodummy] PKGNAME.tgz DIRNAME [DEPENDENCY.tgz ...] +mount_fs() +{ + fs=$1 + mntpt=$2 + master=$3 + + if [ ${disconnected} = 1 ]; then + mount -t nullfs -r ${fs} ${mntpt} + else + mount -o nfsv3,intr -r ${master}:${fs} ${mntpt} + fi +} + +copypkg() +{ + pb=$1 + host=$2 + from=$3 + to=$4 + http_proxy=$5 + + if [ ${host} = $(hostname) ]; then + cp ${pb}/${arch}/${branch}/packages/All/${from} ${to} + else + if [ ! -z "${http_proxy}" ]; then + env HTTP_PROXY=${http_proxy} fetch -m -o ${to} http://${host}/errorlogs/${arch}-${branch}-packages-latest/All/${from} + else + fetch -m -o ${to} http://${host}/errorlogs/${arch}-${branch}-packages-latest/All/${from} + fi + fi +} + cleanup() { chroot=$1 @@ -12,6 +44,7 @@ cleanup() #umount ${chroot}/proc + echo ARCH=${arch} if [ ${arch} = "i386" ]; then umount -f ${chroot}/compat/linux/proc fi @@ -38,7 +71,7 @@ cleanup() rmdir ${chroot}/used fi - echo -n "$pkgname done on $(hostname -s) at " + echo -n "$pkgname done on $(hostname) at " date exit $error @@ -54,13 +87,15 @@ shift nice=0 . ${pb}/${arch}/portbuild.conf +. ${pb}/${arch}/portbuild.$(hostname) . ${pb}/scripts/buildenv buildroot=${scratchdir} error=0 branch=$1 -shift +chroot=$2 +shift 2 noclean=0 if [ "x$1" = "x-noclean" ]; then @@ -94,14 +129,26 @@ if [ "x$1" = "x-fetch-original" ]; then export FETCH_ORIGINAL=1 shift fi -args="$*" +if [ "x$1" = "x-trybroken" ]; then + export TRYBROKEN=1 + shift +fi + +ED=$1 +PD=$2 +FD=$3 +BD=$4 +RD=$5 buildenv ${pb} ${arch} ${branch} -pkgname=$(basename $1 ${PKGSUFFIX}) -dirname=$2 +pkgname=$(basename $6 ${PKGSUFFIX}) +dirname=$7 shift 2 +echo $pkgname +echo $dirname + export WRKDIRPREFIX=/tmp export DISTDIR=/tmp/distfiles export PACKAGES=/tmp/packages @@ -127,84 +174,73 @@ cleandirs="/usr/local /usr/X11R6 /compat /var/db/pkg" export FTP_TIMEOUT=900 export HTTP_TIMEOUT=900 -export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:. +export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/X11R6/bin -echo "building $pkgname" +echo "building $pkgname in $chroot" -chrootdir=${buildroot}/${branch}/chroot bakdir=${pb}/${arch}/${branch}/tarballs bindist=${buildroot}/${branch}/tarballs/bindist.tar +bindistlocal=${buildroot}/${branch}/tarballs/bindist-$(hostname).tar packages=${pb}/${arch}/${branch}/packages -found=0 -for dir in ${chrootdir}/*; do - if [ -d ${dir}/tmp -a ! -e ${dir}/used ]; then - mkdir ${dir}/used 2>/dev/null - touch ${dir}/used/${pkgname} - if [ $(echo $(echo ${dir}/used/* | wc -w)) = 1 ]; then - found=1 - chroot=${dir} - break - else - rm ${dir}/used/${pkgname} - rmdir ${dir}/used 2>/dev/null - fi - fi -done - -if [ ${found} != 1 ]; then - chroot=${chrootdir}/$$ - while [ -d ${chroot} ]; do - chroot=${chroot}- - done - - mkdir -p ${chroot}/used - touch ${chroot}/used/${pkgname} +if [ -f ${chroot}/.notready ]; then tar -C ${chroot} -xpf ${bindist} + if [ -f ${bindistlocal} ]; then + tar -C ${chroot} -xpf ${bindistlocal} + fi # to be able to run ps and killall inside chroot area if [ "${branch}" = "4" -o "${branch}" = "4-exp" ]; then mkdir -p ${chroot}/libexec mkdir -p ${chroot}/lib + if [ "${arch}" = "i386" ]; then + cp -p /sbin/mount_linprocfs /sbin/mount /sbin/umount ${chroot}/sbin + cp -p /lib/libufs.so.2 ${chroot}/lib + fi cp -p /libexec/ld-elf.so.1 ${chroot}/libexec cp -p /lib/libc.so.5 /lib/libkvm.so.2 /lib/libm.so.2 ${chroot}/lib fi cp -p /bin/ps ${chroot}/bin cp -p /usr/bin/killall ${chroot}/usr/bin + rm ${chroot}/.notready + touch ${chroot}/.ready fi # Figure out jail IP addr -chrootpid=$(basename ${chroot}) -ip1=$(($chrootpid /(256*256))) -ip2=$((($chrootpid - ($ip1*256*256)) /256)) -ip3=$((($chrootpid - ($ip1*256*256) - ($ip2*256)))) +#chrootpid=$(basename ${chroot}) +#ip1=$(($chrootpid /(256*256))) +#ip2=$((($chrootpid - ($ip1*256*256)) /256)) +#ip3=$((($chrootpid - ($ip1*256*256) - ($ip2*256)))) # Set up desired uname version echo ${OSREL}-${BRANCH} > ${chroot}/usr/bin/UNAME_VERSION -trap "cleanup ${chroot} ${noclean} ${error} \"${cleandirs}\" ${pkgname}" 1 2 3 9 10 11 15 +#trap "cleanup ${chroot} ${noclean} ${error} \"${cleandirs}\" ${pkgname}" 1 2 3 9 10 11 15 +trap "exit 255" 1 2 3 9 10 11 15 rm -rf ${chroot}/tmp/* cd ${chroot}/tmp mkdir -p depends distfiles packages -echo "building ${pkgname} on $(hostname -s)" | tee ${chroot}/tmp/${pkgname}.log +echo "building ${pkgname} on $(hostname)" | tee ${chroot}/tmp/${pkgname}.log echo "in directory ${chroot}" | tee -a ${chroot}/tmp/${pkgname}.log -echo "with arguments: ${args}" | tee -a ${chroot}/tmp/${pkgname}.log # intentionally set up ${PORTSDIR} with symlink to catch broken ports mkdir -p ${chroot}/a/ports rm -rf ${chroot}/usr/ports -mount -o nfsv3,intr -r ${master}:${pb}/${arch}/${branch}/ports ${chroot}/a/ports + +mount_fs ${pb}/${arch}/${branch}/ports ${chroot}/a/ports ${master} ln -sf ../a/ports ${chroot}/usr/ports mkdir -p ${chroot}/usr/src ${chroot}/usr/opt/doc -mount -o nfsv3,intr -r ${master}:${pb}/${arch}/${branch}/src ${chroot}/usr/src -mount -o nfsv3,intr -r ${master}:${pb}/${arch}/${branch}/doc ${chroot}/usr/opt/doc +mount_fs ${pb}/${arch}/${branch}/src ${chroot}/usr/src ${master} +mount_fs ${pb}/${arch}/${branch}/doc ${chroot}/usr/opt/doc ${master} mount -t devfs foo ${chroot}/dev +umount -f ${chroot}/compat/linux/dev > /dev/null 2>&1 + # just in case... for dir in ${cleandirs}; do if ! rm -rf ${chroot}${dir} >/dev/null 2>&1; then @@ -235,7 +271,7 @@ fi if [ ${arch} = "i386" ]; then # JDK ports need linprocfs :( mkdir -p ${chroot}/compat/linux/proc - mount -t linprocfs linprocfs ${chroot}/compat/linux/proc + chroot ${chroot} mount -t linprocfs linprocfs /compat/linux/proc fi _ldconfig_dirs="/lib /usr/lib /usr/lib/compat" @@ -250,14 +286,12 @@ if [ ${arch} = "i386" ]; then chroot ${chroot} /sbin/ldconfig -aout /usr/lib/aout /usr/lib/compat/aout fi +set x $ED $FD $PD $BD $RD +shift 1 while [ $# -gt 0 ]; do - if [ -f ${packages}/All/$1 ]; then - if [ ! -f ${chroot}/tmp/depends/$1 ]; then - echo "copying package $1 for ${pkgname}" - cp -p ${packages}/All/$1 ${chroot}/tmp/depends - fi - else - echo "skipping package $1 for ${pkgname} since it is missing" + if [ ! -f ${chroot}/tmp/depends/$1 ]; then + echo "copying package $1 for ${pkgname}" + copypkg ${pb} ${master} $1 ${chroot}/tmp/depends "${http_proxy}" fi shift done @@ -266,8 +300,8 @@ cp -p ${pb}/scripts/buildscript ${chroot} cp -p ${pb}/scripts/pnohang.${arch} ${chroot}/pnohang # phase 1, make checksum -# Needs to be chroot so that port can be fetched -chroot ${chroot} /buildscript ${dirname} 1 2>&1 | tee -a ${chroot}/tmp/${pkgname}.log +# Needs to be chroot not jail so that port can be fetched +chroot ${chroot} /buildscript ${dirname} 1 "$ED" "$PD" "$FD" "$BD" "$RD" 2>&1 | tee -a ${chroot}/tmp/${pkgname}.log if [ -f ${chroot}/tmp/status ]; then error=$(cat ${chroot}/tmp/status) else @@ -276,47 +310,18 @@ fi if [ "${error}" = 0 ]; then # make checksum succeeded - ssh -a -x ${user}@$master mkdir -p ${pb}/${arch}/${branch}/distfiles/.pbtmp/${pkgname} - if [ "$nodistfiles" = "0" ]; then - tar -C ${chroot}/tmp/distfiles -cf - . | \ - ssh -a -x ${user}@$master tar --unlink -C ${pb}/${arch}/${branch}/distfiles/.pbtmp/${pkgname} -xvf - - ssh -a -x ${user}@$master touch ${pb}/${arch}/${branch}/distfiles/.pbtmp/${pkgname}/.done - fi - # phase 2, make package ln -sf ${pkgname}.log2 ${chroot}/tmp/make.log # ifconfig lo0 alias 10.${ip1}.${ip2}.${ip3}/32 # jail ${chroot} jail-${chroot} 10.${ip1}.${ip2}.${ip3} /usr/bin/nice -n $nice /buildscript ${dirname} 2 > ${chroot}/tmp/${pkgname}.log2 2>&1 # ifconfig lo0 delete 10.${ip1}.${ip2}.${ip3} - chroot ${chroot} /usr/bin/nice -n $nice /buildscript ${dirname} 2 > ${chroot}/tmp/${pkgname}.log2 2>&1 + chroot ${chroot} /usr/bin/nice -n $nice /buildscript ${dirname} 2 "$ED" "$PD" "$FD" "$BD" "$RD" > ${chroot}/tmp/${pkgname}.log2 2>&1 grep pnohang ${chroot}/tmp/${pkgname}.log2 cat ${chroot}/tmp/${pkgname}.log2 >> ${chroot}/tmp/${pkgname}.log rm ${chroot}/tmp/${pkgname}.log2 -### chroot ${chroot} /buildscript ${dirname} 2 2>&1 | tee -a ${chroot}/tmp/${pkgname}.log - scp ${chroot}/tmp/${pkgname}.log ${user}@${master}:${pb}/${arch}/${branch}/logs/${pkgname}.log error=$(cat ${chroot}/tmp/status) - - if [ -e ${chroot}/tmp/work.tbz ]; then - scp ${chroot}/tmp/work.tbz ${user}@${master}:${pb}/${arch}/${branch}/wrkdirs/${pkgname}.tbz - fi - - if [ "${error}" = 0 ]; then - tar -C ${chroot}/tmp -cf - packages | \ - ssh -a -x ${user}@$master tar --unlink -C ${pb}/${arch}/${branch} -xvf - - ssh -a -x ${user}@$master [ -f ${pb}/${arch}/${branch}/packages/All/${pkgname}${PKGSUFFIX} ] '&&' touch ${pb}/${arch}/${branch}/packages/All/${pkgname}${PKGSUFFIX} - ssh ${user}@$master rm -f ${pb}/${arch}/${branch}/errors/${pkgname}.log - ssh ${user}@$master lockf ${pb}/${arch}/${branch}/failure.lock ${pb}/scripts/buildsuccess ${arch} ${branch} ${pkgname} - else - scp ${chroot}/tmp/${pkgname}.log ${user}@${master}:${pb}/${arch}/${branch}/errors/${pkgname}.log - ssh ${user}@$master lockf ${pb}/${arch}/${branch}/failure.lock ${pb}/scripts/buildfailure ${arch} ${branch} ${pkgname} - fi - -else - scp ${chroot}/tmp/${pkgname}.log ${user}@${master}:${pb}/${arch}/${branch}/errors/${pkgname}.log - scp ${chroot}/tmp/${pkgname}.log ${user}@${master}:${pb}/${arch}/${branch}/logs/${pkgname}.log - ssh ${user}@$master lockf ${pb}/${arch}/${branch}/failure.lock ${pb}/scripts/buildfailure ${arch} ${branch} ${pkgname} fi -cleanup ${chroot} ${noclean} ${error} "${cleandirs}" ${pkgname} +exit $error |