24a25b38a39d762e78e92496077fc9a74c787b70
[packages/trusty/cirros-testvm.git] / cirros-testvm / src-cirros / bin / build-release
1 #!/bin/bash
2
3 [ $# -eq 1 ] || { echo "must give version"; exit 1; }
4
5 VER=$1
6 daily=false
7 if [ "$1" = "daily" ]; then
8    VER="d$(date +%y%m%d)"
9    daily=true
10 fi
11 pre=cirros-$VER
12 BR_VER="2015.05"
13 ARCHES="${ARCHES:-i386 x86_64 arm powerpc aarch64 ppc64 ppc64le}"
14 KVER="3.19.0-20.20~14.04.1"
15 ME=$(readlink -f "$0")
16 MY_D=${ME%/*}
17 PATH=${MY_D}:$PATH
18
19 dl() {
20    local url="$1" target="$2" tfile="" t=""
21    [ -f "$target" ] && return
22    t=$(dirname "$target")
23    tfile=$(mktemp "$t/.${0##*/}.XXXXXX") || return
24    wget "$url" -O "$tfile" &&
25       mv "$tfile" "$target" ||
26       { t=$?; rm -f "$tfile"; return $t; }
27 }
28 msg() {
29    echo "$@" >> "$LOGFILE"
30    echo "$@"
31 }
32 logevent() {
33    # logevent(msg, [from])
34    # log the message in $1 and time since $2, defaulting to last call.
35    local up delta msg="$1" ref="$2"
36    up=${SECONDS}
37    if [ "$ref" = "-" ]; then
38       ref=""
39    elif [ "$ref" = "" ]; then
40       ref="${_LAST_UP}"
41    fi
42    if [ -n "$ref" ]; then
43       delta="$(($up-$ref))"
44    fi
45    msg "$(date -R)" "$msg" "${delta:+[${delta}s]}"
46    _LAST_UP=$up
47    _RET=${_LAST_UP}
48 }
49
50 error() { echo "$@" 1>&2; }
51 fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
52
53 set -e
54 set -o pipefail
55
56 out="$PWD/../build-$VER"
57 LOGFILE="$out/date.txt"
58 export TMPDIR="$out/tmp"
59 mkdir -p "$out" "$TMPDIR"
60
61 # really just here to check that VER is a tag
62 # or source code checkout would fail
63 if ! $daily; then
64     revno=$(bzr tags -r "tag:$VER") || fail "$VER: not a tag in $PWD."
65     revno=$(echo "$revno" | awk '{print $2}')
66 fi
67
68 logevent "begin" -
69 tstart=${_RET}
70
71 logevent "start download" -
72 rm -f download
73 mkdir -p ../download
74 ln -snf ../download download
75 brtgz="buildroot-${BR_VER}.tar.gz"
76 dl "http://buildroot.uclibc.org/downloads/$brtgz" "download/$brtgz"
77 logevent "end download"
78
79 logevent "start unpack" -
80 rm -Rf "buildroot-${BR_VER}"
81 rm -f buildroot
82 tar -xvf download/buildroot-${BR_VER}.tar.gz
83 ln -snf buildroot-${BR_VER} buildroot
84
85 # we do not do this here, so that we're not dependent on the
86 # cvs working (which wont work through http_proxy) and also
87 # to have revision controlled information in that file.
88 #./bin/mkcabundle > src/etc/ssl/certs/ca-certificates.crt
89
90 ( cd buildroot && QUILT_PATCHES="$PWD/../patches-buildroot" quilt push -a )
91
92 echo "$VER" > "src/etc/cirros/version"
93 logevent "end unpack"
94
95 logevent "start br-source" -
96 make ARCH=i386 br-source
97 logevent "end br-source"
98
99 logevent "start kernel download" -
100 grab-kernels "$KVER" ${ARCHES}
101 logevent "end kernel download"
102
103 for arch in ${ARCHES}; do
104   logevent "start $arch" -
105   time make ARCH=$arch "OUT_D=$out/build/$arch" \
106     ${CCACHE_D:+"BR2_CCACHE_DIR=${CCACHE_D}/$arch"} 2>&1 |
107      tee "$out/build-$arch.log";
108   ret=$?
109   logevent "finish $arch [ret=$ret]"
110 done;
111
112 for arch in ${ARCHES}; do
113   mkdir -p "$out/stage/$arch"
114 done
115
116 logevent "start bundling" -
117 for arch in ${ARCHES}; do
118   case "$arch" in
119      powerpc|ppc*|aarch64) size=64M;;
120      *) size="";;
121   esac
122   sudo ./bin/bundle -v ${size:+--size=$size} --arch="$arch" \
123      "$out/build/$arch/rootfs.tar" \
124      ./download/kernel-$arch.deb "$out/stage/$arch";
125 done
126 logevent "finish bundling"
127
128 sudo chown -R $USER:$USER "$out/stage"
129
130 mkdir -p "$out/release"
131
132 #srctgz="$out/release/cirros-$VER-source.tar.gz"
133 #bzr export -r "tag:$VER" --format=tgz --root="cirros-$VER" "$srctgz"
134 #echo "wrote source tgz: $srctgz"
135 if ! $daily; then
136   ( srcd="$PWD" && tmpd=$(mktemp -d) && cd "$tmpd" &&
137     bzr branch "$srcd" -r tag:$VER cirros-$VER &&
138     rm -Rf cirros-$VER/.bzr &&
139     echo "$VER" > "cirros-$VER/src/etc/cirros/version" &&
140     tar cvzf - cirros-$VER ) > "$out/release/cirros-$VER-source.tar.gz"
141 fi
142
143 rm -f "$out/stage"/*/"$pre"*
144 for arch in ${ARCHES}; do
145   p=$pre-$arch
146   ( cd "$out/stage/$arch" &&
147     ln kernel $p-vmlinuz && ln kernel $p-kernel &&
148     ln initramfs $p-initrd && ln initramfs $p-initramfs &&
149     ln part.img $p-rootfs.img &&
150     ln blank.img $p-blank.img &&
151     ln disk.img $p-disk.img &&
152     ln filesys.tar.gz $p-lxc.tar.gz &&
153     true
154   ); done
155
156 logevent "start populating release" -
157 for arch in ${ARCHES}; do
158   p=$pre-$arch
159   ( cd "$out/stage/$arch" &&
160     cp $p-kernel $p-initramfs $p-lxc.tar.gz "$out/release/" &&
161     gzip -9 -c $p-rootfs.img > $out/release/$p-rootfs.img.gz ) &&
162   ( cd "$out/stage/$arch" &&
163     tar cvzf - $p-blank.img $p-vmlinuz $p-initrd ) > \
164     "$out/release/$p-uec.tar.gz"
165   [ "$arch" = "arm" ] ||
166      cp "$out/stage/$arch/$p-disk.img" "$out/release/$p-disk.img"
167 done
168
169 mkdir -p "$out/release/buildroot_rootfs"
170 for arch in ${ARCHES}; do
171   t="$out/release/buildroot_rootfs/buildroot-$VER-$arch.tar"
172   cp "$out/build/$arch/rootfs.tar" "$t" && gzip --force -9 "$t"
173 done
174
175 chmod u+rwX,go+rX -R "$out/release/"* 
176
177 sumfiles=$(cd "$out/release" && for f in *; do
178    [ -f "$f" -a "$f" != MD5SUMS ] && echo "$f"; done)
179 ( cd "$out/release" && md5sum $sumfiles > MD5SUMS )
180
181 logevent "finish populate release" -
182 msg "output in $out/release"
183 msg "entire process took $SECONDS seconds"
184 logevent "finished" "$tstart"