#!/bin/bash INPUT=/home/steve/build-list LOGDIR=/chroot/rebuildd/logs PBUILD_CACHE=/var/cache/pbuilder PBUILD_OUT=/chroot/rebuildd/out HOSTNAME=$(hostname) BUILDS_DONE=0 MAX_BUILDS=0 JACK_SCRIPT=/home/build/bin/build-client if [ "$1"x != ""x ]; then MAX_BUILDS=$1 fi cd /chroot/rebuildd # Make sure we're building in our temp space, not in /var/lib mkdir -p /chroot/rebuildd/schroot/unpack /chroot/rebuildd/sbuild/build mount | grep -q /var/lib/schroot/unpack if [ $? -ne 0 ]; then mount --bind /chroot/rebuildd/schroot/unpack /var/lib/schroot/unpack fi mount | grep -q /var/lib/sbuild/build if [ $? -ne 0 ]; then mount --bind /chroot/rebuildd/sbuild/build /var/lib/sbuild/build fi attempt_update () { rsync -a build@jack:build-config/ /etc/ install -m 755 -o root -g root /etc/schroot/local-chroot.d/* /etc/schroot/chroot.d/ rsync -a --delete build@jack:chroots/ /chroot/rebuildd/chroots/ apt-get update > /dev/null 2>&1 MY_MD5=$(md5sum $0 | awk '{print $1}') JACK_MD5=$(ssh build@jack md5sum $JACK_SCRIPT | awk '{print $1}') if [ "$MY_MD5" = "$JACK_MD5" ]; then return 0 fi if [ x"$JACK_MD5" == x"" ]; then return 0 fi # Different. Assumg that the one on jack is correct! DATE=$(date) echo "$DATE: Grabbing a new build-client script from jack" echo "Old MD5 $MY_MD5, new MD5 $JACK_MD5" # Remove myself, so I can copy a new file in place rm -f $0 rsync build@jack:$JACK_SCRIPT $0 # Now re-exec the new script exec $0 $@ } grab_and_build () { BNUM=$1 PKG=$2 VER=$3 ARCH=$4 local error DATE=$(date) echo "$DATE: starting ${BNUM}: build of ${PKG} version ${VER} arch ${ARCH} on $HOSTNAME" echo "Running apt-get -q --download-only --only-source source ${PKG}=${VER}" apt-get -q --download-only --only-source source ${PKG}=${VER} error=$? ls -l if [ $error -ne 0 ]; then echo "Status: given-back" return 1 fi echo 1 > /proc/sys/abi/swp || true echo 1 > /proc/sys/abi/cp15_barrier || true sudo -u sbuild sbuild \ --host=$ARCH --build=$ARCH -A -d sid \ --apt-update --apt-distupgrade -n \ *.dsc mv -f * /chroot/rebuildd/out-$PKG return 0 } NO_JOBS_SLOW_SLEEP=20 SLEEP_NO_JOB_DEFAULT=10 SLEEP_NO_JOB_SLOW=600 SLEEP_TIME=$SLEEP_NO_JOB_DEFAULT START_TIME=$(date +'%s') # How many times in a row have we asked for a job and not got # anything? If this gets high, back off NO_JOBS_COUNT=0 while true; do if [ -f /chroot/rebuildd/EXIT ]; then echo "Found EXIT file, stopping here" exit 0 fi # Should we update ourselves? attempt_update SCRIPT_TIME=$(stat -c %Y $0) if [ $SCRIPT_TIME -gt $START_TIME ]; then echo "$0 updated under me, need to restart" exec $0 $@ fi # Ask jack for a package to build BNUM_PKG_VER_ARCH=$(ssh build@jack ./bin/get_package $HOSTNAME) BNUM=$(echo $BNUM_PKG_VER_ARCH | cut -d " " -f1) PKG_VER_ARCH=$(echo $BNUM_PKG_VER_ARCH | cut -d " " -f2) # If we didn't get a job, sleep for a while if [ "$PKG_VER_ARCH" = "NOPACKAGE" ]; then DATE=$(date) NO_JOBS_COUNT=$(($NO_JOBS_COUNT + 1)) echo "$DATE: Nothing to do ($NO_JOBS_COUNT times), wait..." if [ $NO_JOBS_COUNT -eq $NO_JOBS_SLOW_SLEEP ]; then echo "$DATE: No work for $NO_JOBS_SLOW_SLEEP, slowing down" SLEEP_TIME=$SLEEP_NO_JOB_SLOW # Back off fi sleep $SLEEP_TIME continue else NO_JOBS_COUNT=0 SLEEP_TIME=$SLEEP_NO_JOB_DEFAULT fi PKG=$(echo $PKG_VER_ARCH | cut -d _ -f1) VER=$(echo $PKG_VER_ARCH | cut -d _ -f2) ARCH=$(echo $PKG_VER_ARCH | cut -d _ -f3) DATE=$(date) echo "$DATE: starting build $BNUM: ${PKG} version ${VER} for ${ARCH}" BUILDDIR="build-$PKG-$ARCH" OUTDIR="out-$PKG-$ARCH" rm -rf $BUILDDIR $OUTDIR mkdir $BUILDDIR $OUTDIR chown -R sbuild: $BUILDDIR $OUTDIR cd $BUILDDIR (grab_and_build $BNUM $PKG $VER $ARCH >${LOGDIR}/${PKG_VER_ARCH}.log 2>&1) RESULT=$(tail -10 ${LOGDIR}/${PKG_VER_ARCH}.log | awk '/^Status:/ {print $2}') DATE=$(date) echo " $DATE: returned $RESULT" cd .. rm -rf $BUILDDIR case $RESULT in successful) rsync ${LOGDIR}/${PKG_VER_ARCH}.log build@jack:logs/${ARCH}/PASS/${PKG_VER_ARCH}.log ;; *) rsync ${LOGDIR}/${PKG_VER_ARCH}.log build@jack:logs/${ARCH}/FAIL/${PKG_VER_ARCH}.log ;; esac rm ${LOGDIR}/${PKG_VER_ARCH}.log rsync -a /chroot/rebuildd/$OUTDIR/ build@jack:out/ rm -rf /chroot/rebuildd/$OUTDIR/ ssh build@jack ./bin/report_build_result $HOSTNAME $BNUM $PKG_VER_ARCH $RESULT BUILDS_DONE=$(($BUILDS_DONE + 1)) if [ $MAX_BUILDS -gt 0 ] && [ $BUILDS_DONE -ge $MAX_BUILDS ]; then echo "Reached build limit of $MAX_BUILDS, stopping" exit 0 fi done