The cirros image was rebuilt against the 3.13.0-83 kernel, drivers e1000e, igbvf...
[packages/trusty/cirros-testvm.git] / cirros-testvm / src-cirros / bin / build-release
diff --git a/cirros-testvm/src-cirros/bin/build-release b/cirros-testvm/src-cirros/bin/build-release
new file mode 100755 (executable)
index 0000000..24a25b3
--- /dev/null
@@ -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"