From 270066ccae1e1f99e838e6da9895e8567239a42e Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Sat, 23 Jul 2016 02:16:26 +0200 Subject: add LEDE build script and job Signed-off-by: Holger Levsen --- bin/reproducible_lede.sh | 233 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100755 bin/reproducible_lede.sh (limited to 'bin/reproducible_lede.sh') diff --git a/bin/reproducible_lede.sh b/bin/reproducible_lede.sh new file mode 100755 index 00000000..712b488c --- /dev/null +++ b/bin/reproducible_lede.sh @@ -0,0 +1,233 @@ +#!/bin/bash + +# Copyright 2014-2015 Holger Levsen +# © 2015 Reiner Herrmann +# 2016 Alexander Couzens +# released under the GPLv=2 + +OPENWRT_GIT_REPO=https://git.lede-project.org/source.git +OPENWRT_GIT_BRANCH=master +DEBUG=true +. /srv/jenkins/bin/common-functions.sh +common_init "$@" + +# common code defining db access +. /srv/jenkins/bin/reproducible_common.sh +. /srv/jenkins/bin/reproducible_openwrt_common.sh +set -e + +# +# main +# +TMPBUILDDIR=$(mktemp --tmpdir=/srv/workspace/chroots/ -d -t rbuild-lede-build-XXXXXXXX) # used to build on tmpfs +TMPDIR=$(mktemp --tmpdir=/srv/reproducible-results -d -t rbuild-lede-results-XXXXXXXX) # accessable in schroots, used to compare results +BANNER_HTML=$(mktemp --tmpdir=$TMPDIR) +DATE=$(date -u +'%Y-%m-%d') +START=$(date +'%s') +trap cleanup_tmpdirs INT TERM EXIT + +cd $TMPBUILDDIR +echo "=============================================================================" +echo "$(date -u) - Cloning LEDE git repository." +echo "=============================================================================" +git clone --depth 1 -b $OPENWRT_GIT_BRANCH $OPENWRT_GIT_REPO lede +cd lede +OPENWRT="$(git log -1)" +OPENWRT_VERSION=$(git describe --always) +echo "This is lede $OPENWRT_VERSION." +echo +git log -1 + +# External feeds disabled for now as they break building (especially with CONFIG_ALL=y). +#echo "=============================================================================" +#echo "$(date -u) - Updating package feeds." +#echo "=============================================================================" +#./scripts/feeds update -a +#./scripts/feeds install -a + +build_two_times lede ar71xx_generic_ARCHERC7 "CONFIG_TARGET_ar71xx_generic=y\nCONFIG_TARGET_ar71xx_generic_ARCHERC7=y\n" + +# for now we only build one architecture until it's at most reproducible +#build_two_times x86_64 "CONFIG_TARGET_x86=y\nCONFIG_TARGET_x86_64=y\n" +#build_two_times ramips_rt288x_RTN15 "CONFIG_TARGET_ramips=y\nCONFIG_TARGET_ramips_rt288x=y\nCONFIG_TARGET_ramips_rt288x_RTN15=y\n" + +# +# create html about toolchain used +# +echo "=============================================================================" +echo "$(date -u) - Creating Documentation HTML" +echo "=============================================================================" +TOOLCHAIN_HTML=$(mktemp --tmpdir=$TMPDIR) +echo "" > $TOOLCHAIN_HTML +for i in $(ls -1d staging_dir/toolchain*|cut -d "-" -f2-|xargs echo) ; do + echo " " >> $TOOLCHAIN_HTML +done +echo "
Target toolchains built
$i
" >> $TOOLCHAIN_HTML +echo "" >> $TOOLCHAIN_HTML +for i in $(ls -1 build_dir/host/) ; do + echo " " >> $TOOLCHAIN_HTML +done +echo "
Contents of build_dir/host/
$i
" >> $TOOLCHAIN_HTML +echo "" >> $TOOLCHAIN_HTML +for i in $(ls -1 dl/) ; do + echo " " >> $TOOLCHAIN_HTML +done +echo "
Downloaded software
$i
" >> $TOOLCHAIN_HTML +echo "" >> $TOOLCHAIN_HTML +for i in gcc binutils bzip2 flex python perl make findutils grep diffutils unzip gawk util-linux zlib1g-dev libc6-dev git subversion ; do + echo " " >> $TOOLCHAIN_HTML +done +echo "
Debian $(cat /etc/debian_version) package on $(dpkg --print-architecture)installed version
$i" >> $TOOLCHAIN_HTML + dpkg -s $i|grep '^Version'|cut -d " " -f2 >> $TOOLCHAIN_HTML + echo "
" >> $TOOLCHAIN_HTML + +# clean up builddir to save space on tmpfs +rm -rf $TMPBUILDDIR/lede + +# run diffoscope on the results +# (this needs refactoring rather badly) +TIMEOUT="30m" +DIFFOSCOPE="$(schroot --directory /tmp -c source:jenkins-reproducible-${DBDSUITE}-diffoscope diffoscope -- --version 2>&1)" +echo "=============================================================================" +echo "$(date -u) - Running $DIFFOSCOPE on LEDE images and packages." +echo "=============================================================================" +DBD_HTML=$(mktemp --tmpdir=$TMPDIR) +DBD_GOOD_PKGS_HTML=$(mktemp --tmpdir=$TMPDIR) +DBD_BAD_PKGS_HTML=$(mktemp --tmpdir=$TMPDIR) +# run diffoscope on the images +GOOD_IMAGES=0 +ALL_IMAGES=0 +SIZE="" +create_results_dirs lede +cd $TMPDIR/b1 +tree . +for i in * ; do + cd $i + + # search images in both paths to find non-existing ones + IMGS1=$(find * -type f -name "*.bin" -o -name "*.squashfs" | sort -u ) + pushd $TMPDIR/b2/$i + IMGS2=$(find * -type f -name "*.bin" -o -name "*.squashfs" | sort -u ) + popd + + echo " " >> $DBD_HTML + for j in $(printf "$IMGS1\n$IMGS2" | sort -u ) ; do + let ALL_IMAGES+=1 + if [ ! -f $TMPDIR/b1/$i/$j -o ! -f $TMPDIR/b2/$i/$j ] ; then + echo " " >> $DBD_HTML + rm -f $BASE/lede/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed + continue + fi + call_diffoscope $i $j + get_filesize $j + if [ -f $TMPDIR/$i/$j.html ] ; then + mkdir -p $BASE/lede/dbd/$i + mv $TMPDIR/$i/$j.html $BASE/lede/dbd/$i/$j.html + echo " " >> $DBD_HTML + else + SHASUM=$(sha256sum $j|cut -d " " -f1) + echo " " >> $DBD_HTML + let GOOD_IMAGES+=1 + rm -f $BASE/lede/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed + fi + done + cd .. + echo "
Images for $i
\"ftbfs $j (${SIZE}) failed to build.
\"unreproducible $j (${SIZE}) is unreproducible.
\"reproducible $j ($SHASUM, $SIZE) is reproducible.
" >> $DBD_HTML +done +GOOD_PERCENT_IMAGES=$(echo "scale=1 ; ($GOOD_IMAGES*100/$ALL_IMAGES)" | bc) +# run diffoscope on the packages +GOOD_PACKAGES=0 +ALL_PACKAGES=0 +create_results_dirs +cd $TMPDIR/b1 +for i in * ; do + cd $i + + # search packages in both paths to find non-existing ones + PKGS1=$(find * -type f -name "*.ipk" | sort -u ) + pushd $TMPDIR/b2/$i + PKGS2=$(find * -type f -name "*.ipk" | sort -u ) + popd + + for j in $(printf "$PKGS1\n$PKGS2" | sort -u ) ; do + let ALL_PACKAGES+=1 + if [ ! -f $TMPDIR/b1/$i/$j -o ! -f $TMPDIR/b2/$i/$j ] ; then + echo " \"ftbfs $j (${SIZE}) failed to build." >> $DBD_BAD_PKGS_HTML + rm -f $BASE/lede/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed + continue + fi + call_diffoscope $i $j + get_filesize $j + if [ -f $TMPDIR/$i/$j.html ] ; then + mkdir -p $BASE/lede/dbd/$i/$(dirname $j) + mv $TMPDIR/$i/$j.html $BASE/lede/dbd/$i/$j.html + echo " \"unreproducible $j ($SIZE) is unreproducible." >> $DBD_BAD_PKGS_HTML + else + SHASUM=$(sha256sum $j|cut -d " " -f1) + echo " \"reproducible $j ($SHASUM, $SIZE) is reproducible." >> $DBD_GOOD_PKGS_HTML + let GOOD_PACKAGES+=1 + rm -f $BASE/lede/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed + fi + done + cd .. +done +echo " " >> $DBD_HTML +cat $DBD_BAD_PKGS_HTML >> $DBD_HTML +echo "
Unreproducible and otherwise broken packages
" >> $DBD_HTML +echo " " >> $DBD_HTML +cat $DBD_GOOD_PKGS_HTML >> $DBD_HTML +echo "
Reproducible packages
" >> $DBD_HTML +GOOD_PERCENT_PACKAGES=$(echo "scale=1 ; ($GOOD_PACKAGES*100/$ALL_PACKAGES)" | bc) +# are we there yet? +if [ "$GOOD_PERCENT_IMAGES" = "100.0" ] || [ "$GOOD_PERCENT_PACKAGES" = "100.0" ]; then + MAGIC_SIGN="!" +else + MAGIC_SIGN="?" +fi + +# +# finally create the webpage +# +cd $TMPDIR ; mkdir lede +PAGE=lede/lede.html +cat > $PAGE <<- EOF + + + + + + Reproducible LEDE ? + + + +
" +write_page "

LEDE - reproducible wireless freedom$MAGIC_SIGN

" +write_page_intro LEDE +write_page "

$GOOD_IMAGES ($GOOD_PERCENT_IMAGES%) out of $ALL_IMAGES built images and $GOOD_PACKAGES ($GOOD_PERCENT_PACKAGES%) out of $ALL_PACKAGES built packages were reproducible in our test setup." +write_page " These tests were last run on $DATE for version ${OPENWRT_VERSION} using ${DIFFOSCOPE}.

" +write_variation_table LEDE +cat $DBD_HTML >> $PAGE +write_page "
git commit built
" +echo -n "$OPENWRT" >> $PAGE +write_page "
" +cat $TOOLCHAIN_HTML >> $PAGE +write_page "
" +write_page_footer LEDE +publish_page +rm -f $DBD_HTML $DBD_GOOD_PKGS_HTML $DBD_BAD_PKGS_HTML $TOOLCHAIN_HTML $BANNER_HTML + +# the end +calculate_build_duration +print_out_duration +irc_message reproducible-builds "$REPRODUCIBLE_URL/lede/ has been updated. ($GOOD_PERCENT_IMAGES% images and $GOOD_PERCENT_PACKAGES% packages reproducible)" +echo "=============================================================================" + +# remove everything, we don't need it anymore... +cleanup_tmpdirs +trap - INT TERM EXIT -- cgit v1.2.3-54-g00ecf