From b2f83fcc9cfbbc57a296a93378bd5b6ec6cabc9c Mon Sep 17 00:00:00 2001 From: gdm85 Date: Tue, 13 Jan 2015 16:00:34 +0100 Subject: [PATCH] Do not support AUFS Some permissions fixes --- docker/gitian-host/bin/build-base-vms.sh | 34 ++++++++++++++++++------ docker/scripts/bitcoin-gitian-build.sh | 17 ++++++++++-- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/docker/gitian-host/bin/build-base-vms.sh b/docker/gitian-host/bin/build-base-vms.sh index 59387e3..fda3dd9 100755 --- a/docker/gitian-host/bin/build-base-vms.sh +++ b/docker/gitian-host/bin/build-base-vms.sh @@ -25,21 +25,39 @@ for TYPE in "$@"; do echo -e "MIRROR_HOST=$GITIAN_HOST_IP bin/make-base-vm --lxc --arch $TYPE --suite $SUITE" done | parallel -j$# || exit $? +function retry_remove() { + local RETRIES="$1" + local LOOP="$2" + while ! sudo losetup -d "/dev/loop${LOOP}" 2>/dev/null; do + let RETRIES-=1 + if [ $RETRIES -eq 0 ]; then + echo "Failed removing /dev/loop${LOOP}" 1>&2 + return 1 + fi + sleep 1 + done + sudo unlink /dev/mapper/loop${LOOP}p1 2>/dev/null +} + ## this function corresponds to part removed from gbuild via custom patch function ext_partition() { + local loop local OUT=$1 - echo "Extracting $OUT partition for lxc" && \ + echo "Converting $OUT to raw format..." && \ qemu-img convert $OUT.qcow2 $OUT.raw && \ - loop=`sudo kpartx -av $OUT.raw|sed -n '/loop.p1/{s/.*loop\(.\)p1.*/\1/;p}'` || return $? + echo -n "Identifying partition..." && \ + set -o pipefail && \ + loop=`sudo kpartx -av $OUT.raw | sed -n '/loop.p1/{s/.*loop\(.\)p1.*/\1/;p}'` && \ + echo ": $loop" && \ + echo "Copying partition to $OUT..." && \ sudo cp --sparse=always /dev/mapper/loop${loop}p1 $OUT && \ sudo chown $USER $OUT || return $? - ## following 2 lines are a sloppy hack to an unknown problem with kpartx - sudo sync && \ - sleep 5 || return $? ## these are silenced because if former fails, second doesn't and viceversa - sudo kpartx -d /dev/loop$loop 2>/dev/null && \ - sudo rm /dev/mapper/loop${loop}p1 2>/dev/null && \ - rm -f $OUT.raw + echo "Removing partition loop mount..." && \ + retry_remove 5 "$loop" && \ + echo "Removing raw image..." && \ + rm -f "$OUT.raw" && \ + echo "$OUT correctly extracted" } for TYPE in "$@"; do diff --git a/docker/scripts/bitcoin-gitian-build.sh b/docker/scripts/bitcoin-gitian-build.sh index c2cfb34..d6d8b56 100755 --- a/docker/scripts/bitcoin-gitian-build.sh +++ b/docker/scripts/bitcoin-gitian-build.sh @@ -17,6 +17,11 @@ if [ $# -lt 1 ]; then exit 1 fi +if docker info 2>/dev/null | grep ^Storage | grep aufs$ >/dev/null; then + echo "You are using AUFS as Docker storage drive, which is terribly broken and not supported by this script." 1>&2 + exit 1 +fi + ## identify a CLI tool to run commands in parallel ## coshell is preferred PARALLEL="" @@ -35,12 +40,17 @@ fi set -o pipefail && \ MOSTRECENT="$(curl -s https://api.github.com/repos/bitcoin/bitcoin/tags | jq -r '.[0].name' | awk '{ print substr($0, 2) }')" || exit $? +## volumes inside container +SRCV="/home/debian/gitian-builder/cache/common" +DSTV="/home/debian/gitian-build/build/out" + ## run all necessary containers, detached ## setup proper volumes for input/output collection function run_all() { local OS - local SRCV="/home/debian/gitian-build/inputs" - local DSTV="/home/debian/gitian-build/build/out" + + mkdir -p "$SCRIPTS/cache" "$SCRIPTS/built" && \ + chown 1000.1000 "$SCRIPTS/cache" "$SCRIPTS/built" || return $? for OS in "$@"; do mkdir -p "$SCRIPTS/cache/${OS}-inputs" "$SCRIPTS/built/${OS}" && \ @@ -60,6 +70,9 @@ function build_all() { local I=0 for CID in $CREATED; do OS=${OSES[$I]} + + ## first, fix rights of mounted volumes +# echo -n "docker exec $CID chown -R debian.debian '$SRCV' '$DSTV' && " && \ echo "docker exec $CID su -c 'cd /home/debian && source .bash_profile && ./build-bitcoin.sh $MOSTRECENT ${OS}' debian" let I+=1 done | $PARALLEL