X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=cirros-testvm%2Fsrc-cirros%2Fbin%2Fbuild-release;fp=cirros-testvm%2Fsrc-cirros%2Fbin%2Fbuild-release;h=24a25b38a39d762e78e92496077fc9a74c787b70;hb=b0a0f15dfaa205161a7fcb20cf1b8cd4948c2ef3;hp=0000000000000000000000000000000000000000;hpb=c6ac3cd55ee2da956195eee393b0882105dfad4e;p=packages%2Ftrusty%2Fcirros-testvm.git diff --git a/cirros-testvm/src-cirros/bin/build-release b/cirros-testvm/src-cirros/bin/build-release new file mode 100755 index 0000000..24a25b3 --- /dev/null +++ b/cirros-testvm/src-cirros/bin/build-release @@ -0,0 +1,184 @@ +#!/bin/bash + +[ $# -eq 1 ] || { echo "must give version"; exit 1; } + +VER=$1 +daily=false +if [ "$1" = "daily" ]; then + VER="d$(date +%y%m%d)" + daily=true +fi +pre=cirros-$VER +BR_VER="2015.05" +ARCHES="${ARCHES:-i386 x86_64 arm powerpc aarch64 ppc64 ppc64le}" +KVER="3.19.0-20.20~14.04.1" +ME=$(readlink -f "$0") +MY_D=${ME%/*} +PATH=${MY_D}:$PATH + +dl() { + local url="$1" target="$2" tfile="" t="" + [ -f "$target" ] && return + t=$(dirname "$target") + tfile=$(mktemp "$t/.${0##*/}.XXXXXX") || return + wget "$url" -O "$tfile" && + mv "$tfile" "$target" || + { t=$?; rm -f "$tfile"; return $t; } +} +msg() { + echo "$@" >> "$LOGFILE" + echo "$@" +} +logevent() { + # logevent(msg, [from]) + # log the message in $1 and time since $2, defaulting to last call. + local up delta msg="$1" ref="$2" + up=${SECONDS} + if [ "$ref" = "-" ]; then + ref="" + elif [ "$ref" = "" ]; then + ref="${_LAST_UP}" + fi + if [ -n "$ref" ]; then + delta="$(($up-$ref))" + fi + msg "$(date -R)" "$msg" "${delta:+[${delta}s]}" + _LAST_UP=$up + _RET=${_LAST_UP} +} + +error() { echo "$@" 1>&2; } +fail() { [ $# -eq 0 ] || error "$@"; exit 1; } + +set -e +set -o pipefail + +out="$PWD/../build-$VER" +LOGFILE="$out/date.txt" +export TMPDIR="$out/tmp" +mkdir -p "$out" "$TMPDIR" + +# really just here to check that VER is a tag +# or source code checkout would fail +if ! $daily; then + revno=$(bzr tags -r "tag:$VER") || fail "$VER: not a tag in $PWD." + revno=$(echo "$revno" | awk '{print $2}') +fi + +logevent "begin" - +tstart=${_RET} + +logevent "start download" - +rm -f download +mkdir -p ../download +ln -snf ../download download +brtgz="buildroot-${BR_VER}.tar.gz" +dl "http://buildroot.uclibc.org/downloads/$brtgz" "download/$brtgz" +logevent "end download" + +logevent "start unpack" - +rm -Rf "buildroot-${BR_VER}" +rm -f buildroot +tar -xvf download/buildroot-${BR_VER}.tar.gz +ln -snf buildroot-${BR_VER} buildroot + +# we do not do this here, so that we're not dependent on the +# cvs working (which wont work through http_proxy) and also +# to have revision controlled information in that file. +#./bin/mkcabundle > src/etc/ssl/certs/ca-certificates.crt + +( cd buildroot && QUILT_PATCHES="$PWD/../patches-buildroot" quilt push -a ) + +echo "$VER" > "src/etc/cirros/version" +logevent "end unpack" + +logevent "start br-source" - +make ARCH=i386 br-source +logevent "end br-source" + +logevent "start kernel download" - +grab-kernels "$KVER" ${ARCHES} +logevent "end kernel download" + +for arch in ${ARCHES}; do + logevent "start $arch" - + time make ARCH=$arch "OUT_D=$out/build/$arch" \ + ${CCACHE_D:+"BR2_CCACHE_DIR=${CCACHE_D}/$arch"} 2>&1 | + tee "$out/build-$arch.log"; + ret=$? + logevent "finish $arch [ret=$ret]" +done; + +for arch in ${ARCHES}; do + mkdir -p "$out/stage/$arch" +done + +logevent "start bundling" - +for arch in ${ARCHES}; do + case "$arch" in + powerpc|ppc*|aarch64) size=64M;; + *) size="";; + esac + sudo ./bin/bundle -v ${size:+--size=$size} --arch="$arch" \ + "$out/build/$arch/rootfs.tar" \ + ./download/kernel-$arch.deb "$out/stage/$arch"; +done +logevent "finish bundling" + +sudo chown -R $USER:$USER "$out/stage" + +mkdir -p "$out/release" + +#srctgz="$out/release/cirros-$VER-source.tar.gz" +#bzr export -r "tag:$VER" --format=tgz --root="cirros-$VER" "$srctgz" +#echo "wrote source tgz: $srctgz" +if ! $daily; then + ( srcd="$PWD" && tmpd=$(mktemp -d) && cd "$tmpd" && + bzr branch "$srcd" -r tag:$VER cirros-$VER && + rm -Rf cirros-$VER/.bzr && + echo "$VER" > "cirros-$VER/src/etc/cirros/version" && + tar cvzf - cirros-$VER ) > "$out/release/cirros-$VER-source.tar.gz" +fi + +rm -f "$out/stage"/*/"$pre"* +for arch in ${ARCHES}; do + p=$pre-$arch + ( cd "$out/stage/$arch" && + ln kernel $p-vmlinuz && ln kernel $p-kernel && + ln initramfs $p-initrd && ln initramfs $p-initramfs && + ln part.img $p-rootfs.img && + ln blank.img $p-blank.img && + ln disk.img $p-disk.img && + ln filesys.tar.gz $p-lxc.tar.gz && + true + ); done + +logevent "start populating release" - +for arch in ${ARCHES}; do + p=$pre-$arch + ( cd "$out/stage/$arch" && + cp $p-kernel $p-initramfs $p-lxc.tar.gz "$out/release/" && + gzip -9 -c $p-rootfs.img > $out/release/$p-rootfs.img.gz ) && + ( cd "$out/stage/$arch" && + tar cvzf - $p-blank.img $p-vmlinuz $p-initrd ) > \ + "$out/release/$p-uec.tar.gz" + [ "$arch" = "arm" ] || + cp "$out/stage/$arch/$p-disk.img" "$out/release/$p-disk.img" +done + +mkdir -p "$out/release/buildroot_rootfs" +for arch in ${ARCHES}; do + t="$out/release/buildroot_rootfs/buildroot-$VER-$arch.tar" + cp "$out/build/$arch/rootfs.tar" "$t" && gzip --force -9 "$t" +done + +chmod u+rwX,go+rX -R "$out/release/"* + +sumfiles=$(cd "$out/release" && for f in *; do + [ -f "$f" -a "$f" != MD5SUMS ] && echo "$f"; done) +( cd "$out/release" && md5sum $sumfiles > MD5SUMS ) + +logevent "finish populate release" - +msg "output in $out/release" +msg "entire process took $SECONDS seconds" +logevent "finished" "$tstart"