15960f01cd
Adds the ability to set $DIB_LOCAL_IMAGE to use as the base cloud image for a Fedora image build. There are many repetitve tasks that are done every image build. With this change you can build an image with the fedora and vm element and then reuse the resulting image as input to future image builds. This greatly reduces future image build times. For instance 99-up-to-date is already taking almost 2 minutes (even with rpm downloads already cached) for Fedora 20, and is only going to keep taking longer. By having a local up to date Fedora cloud image, this time can be saved on each image build. There is one minor change to support this in that /tmp/grub needs to get cleaned up at the end of image builds so that the image can be reused. Plus, there is no reason for it to stick around anyway. (didn't think this was worth a seperate commit). Change-Id: Ic74d138da922ecc99c38c27f105170d90009a84a
104 lines
3.8 KiB
Bash
Executable File
104 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -eu
|
|
|
|
[ -n "$ARCH" ]
|
|
[ -n "$TARGET_ROOT" ]
|
|
|
|
if [ 'amd64' = "$ARCH" ] ; then
|
|
ARCH="x86_64"
|
|
fi
|
|
|
|
DIB_LOCAL_IMAGE=${DIB_LOCAL_IMAGE:-""}
|
|
|
|
if [ -n "$DIB_LOCAL_IMAGE" ]; then
|
|
IMAGE_LOCATION=$DIB_LOCAL_IMAGE
|
|
# No need to copy a local image into the cache directory, so just specify
|
|
# the cached path as the original path.
|
|
CACHED_IMAGE=$IMAGE_LOCATION
|
|
BASE_IMAGE_FILE=`basename $DIB_LOCAL_IMAGE`
|
|
BASE_IMAGE_TAR=$BASE_IMAGE_FILE.tgz
|
|
else
|
|
DIB_RELEASE=${DIB_RELEASE:-20}
|
|
DIB_CLOUD_IMAGES=${DIB_CLOUD_IMAGES:-http://cloud.fedoraproject.org}
|
|
BASE_IMAGE_FILE=${BASE_IMAGE_FILE:-fedora-$DIB_RELEASE.$ARCH.qcow2}
|
|
BASE_IMAGE_TAR=$DIB_RELEASE-Cloud-$ARCH-$DIB_RELEASE.tgz
|
|
IMAGE_LOCATION=$DIB_CLOUD_IMAGES/$BASE_IMAGE_FILE
|
|
CACHED_IMAGE=$DIB_IMAGE_CACHE/$BASE_IMAGE_FILE
|
|
|
|
fi
|
|
|
|
CACHED_TAR=$DIB_IMAGE_CACHE/$BASE_IMAGE_TAR
|
|
|
|
if [ -n "$DIB_OFFLINE" -a -f "$CACHED_TAR" ] ; then
|
|
echo "Not checking freshness of cached $CACHED_TAR."
|
|
else
|
|
|
|
if [ -z "$DIB_LOCAL_IMAGE" ]; then
|
|
echo "Fetching Base Image"
|
|
|
|
# There seems to be some bad Fedora mirrors returning http 404's for the cloud image.
|
|
# If the image fails to download due to a 404 we retry once.
|
|
set +e
|
|
$TMP_HOOKS_PATH/bin/cache-url $IMAGE_LOCATION $CACHED_IMAGE
|
|
RV=$?
|
|
set -e
|
|
|
|
if [ "$RV" == "44" ] ; then
|
|
$TMP_HOOKS_PATH/bin/cache-url $IMAGE_LOCATION $CACHED_IMAGE
|
|
elif [ "$RV" != "0" ] ; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ ! -f $CACHED_TAR -o \
|
|
$CACHED_IMAGE -nt $CACHED_TAR ] ; then
|
|
echo "Repacking base image as tarball."
|
|
WORKING=$(mktemp -d)
|
|
EACTION="rm -r $WORKING"
|
|
trap "$EACTION" EXIT
|
|
echo "Working in $WORKING"
|
|
RAW_FILE=$(basename $BASE_IMAGE_FILE)
|
|
RAW_FILE=${RAW_FILE#.qcow2}.raw
|
|
qemu-img convert -f qcow2 -O raw $CACHED_IMAGE $WORKING/$RAW_FILE
|
|
# WARNING: The mattdm image has the root filesystem on the second
|
|
# partition (p2). If he changes the image the MAGIC_BIT
|
|
# might also need to change.
|
|
# UPDATE to above warning alluding to Fedora18:
|
|
# F19 images have the rootfs partition on p1
|
|
MAGIC_BIT=p1
|
|
# kpartx fails if no /dev/loop* exists, "losetup -f" prints first unused
|
|
# loop device and creates it if it doesn't exist
|
|
sudo losetup -f
|
|
# XXX: Parsing stdout is dangerous, would like a better way to discover
|
|
# the device used for the image.
|
|
# NOTE: On F17 (parted-3.0-10.fc17.x86_64), partprobe of
|
|
# /dev/loop0 does not create /dev/loop0p2, while kpartx at
|
|
# least creates /dev/mapper/loop0p2.
|
|
LOOPDEV=$(sudo kpartx -av $WORKING/$RAW_FILE | awk "/loop[0-9]+$MAGIC_BIT/ {print \$3}")
|
|
if ! timeout 5 sh -c "while ! [ -e /dev/mapper/$LOOPDEV ]; do sleep 1; done"; then
|
|
echo "Error: Could not find /dev/mapper/$LOOPDEV"
|
|
exit 1
|
|
fi
|
|
EACTION="sudo kpartx -d $WORKING/$RAW_FILE;$EACTION"
|
|
trap "$EACTION" EXIT
|
|
mkdir $WORKING/mnt
|
|
sudo mount /dev/mapper/$LOOPDEV $WORKING/mnt
|
|
EACTION="sudo umount -f $WORKING/mnt;$EACTION"
|
|
trap "$EACTION" EXIT
|
|
# Chroot in so that we get the correct uid/gid
|
|
sudo chroot $WORKING/mnt bin/tar -cz . > $WORKING/tmp.tar
|
|
mv $WORKING/tmp.tar $CACHED_TAR
|
|
else
|
|
echo "Using cached tar from $CACHED_TAR"
|
|
fi
|
|
|
|
fi
|
|
# Extract the base image (use --numeric-owner to avoid UID/GID mismatch between
|
|
# image tarball and host OS e.g. when building Fedora image on an openSUSE host)
|
|
echo "Extracting base root image from $CACHED_TAR"
|
|
sudo tar -C $TARGET_ROOT --numeric-owner -xzf $CACHED_TAR
|
|
if [ -e "$TARGET_ROOT/lost+found" ]; then
|
|
sudo rmdir $TARGET_ROOT/lost+found
|
|
fi
|