reproducible_netbsd.sh 8.35 KB
Newer Older
1 2
#!/bin/bash

3
# Copyright 2014-2016 Holger Levsen <holger@layer-acht.org>
4 5
# released under the GPLv=2

6
DEBUG=false
7 8 9 10 11 12 13 14
. /srv/jenkins/bin/common-functions.sh
common_init "$@"

# common code defining db access
. /srv/jenkins/bin/reproducible_common.sh

set -e

15
# build for these architectures
16
MACHINES="sparc64 amd64"
17 18 19 20 21 22 23 24 25 26 27

cleanup_tmpdirs() {
	cd
	rm -r $TMPDIR
	rm -r $TMPBUILDDIR
}

create_results_dirs() {
	mkdir -p $BASE/netbsd/dbd
}

28
save_netbsd_results() {
29
	local RUN=$1
30 31 32
	local MACHINE=$2
	mkdir -p $TMPDIR/$RUN/${MACHINE}
	cp -pr obj/releasedir/${MACHINE} $TMPDIR/$RUN/
33
	find $TMPDIR/$RUN/ -name MD5 -o -name SHA512 | xargs -r rm -v
34 35 36 37 38
}

#
# main
#
39 40
TMPBUILDDIR=$(mktemp --tmpdir=/srv/workspace/chroots/ -d -t rbuild-netbsd-build-XXXXXXXX)  # used to build on tmpfs
TMPDIR=$(mktemp --tmpdir=/srv/reproducible-results -d -t rbuild-netbsd-results-XXXXXXXX)  # accessable in schroots, used to compare results
41 42 43 44 45 46
DATE=$(date -u +'%Y-%m-%d')
START=$(date +'%s')
trap cleanup_tmpdirs INT TERM EXIT

cd $TMPBUILDDIR
echo "============================================================================="
47
echo "$(date -u) - Cloning the NetBSD git repository (which is synced with the NetBSD CVS repository)"
48
echo "============================================================================="
49
git clone --depth 1 https://github.com/NetBSD/src.git
50
mv src netbsd
51 52 53 54 55 56 57
cd netbsd
NETBSD="$(git log -1)"
NETBSD_VERSION=$(git describe --always)
echo "This is netbsd $NETBSD_VERSION."
echo
git log -1

58 59 60 61
# from $src/share/mk/bsd.README:
# MKREPRO         If "yes", create reproducable builds. This enables
#                 different switches to make two builds from the same source tree
#                 result in the same build results.
62
# also see http://man.netbsd.org/HEAD/usr/share/man/html5/mk.conf.html
63
export MKREPRO="yes"
64
# MKREPRO_TIMESTAMP is set to SOURCE_DATE_EPOCH of netbsd.git
65
# see http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/BUILDING
66
SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
67
MKREPRO_TIMESTAMP=${SOURCE_DATE_EPOCH}
68

69
echo "============================================================================="
70
echo "$(date -u) - Building NetBSD ${NETBSD_VERSION} - first build run."
71 72 73
echo "============================================================================="
export TZ="/usr/share/zoneinfo/Etc/GMT+12"
# actually build everything
74
for MACHINE in $MACHINES ; do
75
	ionice -c 3 \
76
		./build.sh -j $NUM_CPU -V MKREPRO_TIMESTAMP=$MKREPRO_TIMESTAMP -U -u -m ${MACHINE} release
77
	# save results in b1
78
	save_netbsd_results b1 ${MACHINE}
79
	# cleanup and explicitly delete old tooldir to force re-creation for the next $MACHINE type
80
	./build.sh -U -m ${MACHINE} cleandir
81
	rm obj/tooldir.* -rf
82
	echo "${MACHINE} done, first time."
83
done
84

85
echo "============================================================================="
86
echo "$(date -u) - Building NetBSD ${NETBSD_VERSION} - cleaning up between builds."
87 88 89 90 91
echo "============================================================================="
rm obj/releasedir -r
rm obj/destdir.* -r
# we keep the toolchain(s)

92
echo "============================================================================="
93
echo "$(date -u) - Building NetBSD - second build run."
94 95 96 97 98 99 100 101 102
echo "============================================================================="
export TZ="/usr/share/zoneinfo/Etc/GMT-14"
export LANG="fr_CH.UTF-8"
export LC_ALL="fr_CH.UTF-8"
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path"
export CAPTURE_ENVIRONMENT="I capture the environment"
umask 0002
# use allmost all cores for second build
NEW_NUM_CPU=$(echo $NUM_CPU-1|bc)
103
for MACHINE in $MACHINES ; do
104
	ionice -c 3 \
105
		linux64 --uname-2.6 \
106
		./build.sh -j $NEW_NUM_CPU -V MKREPRO_TIMESTAMP=$MKREPRO_TIMESTAMP -U -u -m ${MACHINE} release
107
	# save results in b2
108
	save_netbsd_results b2 ${MACHINE}
109
	# cleanup and explicitly delete old tooldir to force re-creation for the next $MACHINE type
110
	./build.sh -U -m ${MACHINE} cleandir
111
	rm obj/tooldir.* -r
112
	echo "${MACHINE} done, second time."
113
done
114 115 116 117 118 119 120 121 122 123 124

# reset environment to default values again
export LANG="en_GB.UTF-8"
unset LC_ALL
export TZ="/usr/share/zoneinfo/UTC"
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:"
umask 0022

# clean up builddir to save space on tmpfs
rm -r $TMPBUILDDIR/netbsd

125 126 127
# temporarily enable more debug
set -x

128
# run diffoscope on the results
129
TIMEOUT="30m"
130
DIFFOSCOPE="$(schroot --directory /tmp -c chroot:jenkins-reproducible-${DBDSUITE}-diffoscope diffoscope -- --version 2>&1)"
131
echo "============================================================================="
132
echo "$(date -u) - Running $DIFFOSCOPE on NetBSD build results..."
133 134
echo "============================================================================="
FILES_HTML=$(mktemp --tmpdir=$TMPDIR)
135 136 137 138
GOOD_FILES_HTML=$(mktemp --tmpdir=$TMPDIR)
BAD_FILES_HTML=$(mktemp --tmpdir=$TMPDIR)
GOOD_SECTION_HTML=$(mktemp --tmpdir=$TMPDIR)
BAD_SECTION_HTML=$(mktemp --tmpdir=$TMPDIR)
139 140
GOOD_FILES=0
ALL_FILES=0
141
SIZE=""
142 143 144 145 146 147 148
create_results_dirs
cd $TMPDIR/b1
tree .
for i in * ; do
	cd $i
	for j in $(find * -type f |sort -u ) ; do
		let ALL_FILES+=1
149
		call_diffoscope $i $j
150
		get_filesize $j
151
		if [ -f $TMPDIR/$i/$j.html ] ; then
152
			mkdir -p $BASE/netbsd/dbd/$i/$(dirname $j)
153
			mv $TMPDIR/$i/$j.html $BASE/netbsd/dbd/$i/$j.html
154
			echo "         <tr><td><a href=\"dbd/$i/$j.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $j</a> ($SIZE) is unreproducible.</td></tr>" >> $BAD_FILES_HTML
155 156
		else
			SHASUM=$(sha256sum $j|cut -d " " -f1)
157
			echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $j ($SHASUM, $SIZE) is reproducible.</td></tr>" >> $GOOD_FILES_HTML
158 159 160
			let GOOD_FILES+=1
			rm -f $BASE/netbsd/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed
		fi
161 162 163
		# for debugging #842250
		if [ "$(basename $TMPDIR/b1/$i/$j)" = "base.tgz" ] ; then
			for k in b1 b2 ; do
164
				mkdir -p $BASE/netbsd/artifacts/$k/$i/$(dirname $j)
165 166 167 168
				cp $TMPDIR/$k/$i/$j $BASE/netbsd/artifacts/$k/$i/$j
			done
			echo "artifacts published for debugging #842250 in https://tests.reproducible-builds.org/netbsd/artifacts/ - please dont forget to delete this directory later…"
		fi
169 170
	done
	cd ..
171 172 173 174 175 176 177 178 179 180 181 182
	if [ -s $GOOD_FILES_HTML ] ; then
		echo "       <table><tr><th>Reproducible artifacts for <code>$i</code></th></tr>" >> $GOOD_SECTION_HTML
		cat $GOOD_FILES_HTML >> $GOOD_SECTION_HTML
		echo "       </table>" >> $GOOD_SECTION_HTML
		rm $GOOD_FILES_HTML
	fi
	if [ -s $BAD_FILES_HTML ] ; then
		echo "       <table><tr><th>Unreproducible artifacts for <code>$i</code></th></tr>" >> $BAD_SECTION_HTML
		cat $BAD_FILES_HTML >> $BAD_SECTION_HTML
		echo "       </table>" >> $BAD_SECTION_HTML
		rm $BAD_FILES_HTML
	fi
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
done
GOOD_PERCENT=$(echo "scale=1 ; ($GOOD_FILES*100/$ALL_FILES)" | bc)
# are we there yet?
if [ "$GOOD_PERCENT" = "100.0" ] ; then
	MAGIC_SIGN="!"
else
	MAGIC_SIGN="?"
fi

#
#  finally create the webpage
#
cd $TMPDIR ; mkdir netbsd
PAGE=netbsd/netbsd.html
cat > $PAGE <<- EOF
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
203
    <title>Reproducible NetBSD $MAGIC_SIGN</title>
204
    <link rel='stylesheet' href='global.css' type='text/css' media='all' />
205 206
  </head>
  <body>
207 208
    <div id="logo">
      <img src="NetBSD-smaller.png" />
209
      <h1>Reproducible NetBSD $MAGIC_SIGN</h1>
210
    </div>
211 212 213 214
    <div class="content">
      <div class="page-content">
EOF
write_page_intro NetBSD
215
write_page "       <p>$GOOD_FILES ($GOOD_PERCENT%) out of $ALL_FILES built NetBSD files were reproducible in our test setup"
216 217 218
if [ "$GOOD_PERCENT" = "100.0" ] ; then
	write_page "!"
else
219
	write_page "."
220
fi
221
write_page "        These tests were last run on $DATE for version ${NETBSD_VERSION} with MKREPRO=yes and MKREPRO_TIMESTAMP=$MKREPRO_TIMESTAMP and were compared using ${DIFFOSCOPE}.</p>"
222
write_variation_table NetBSD
223 224
cat $BAD_SECTION_HTML >> $PAGE
cat $GOOD_SECTION_HTML >> $PAGE
225 226 227 228 229 230
write_page "     <p><pre>"
echo -n "$NETBSD" >> $PAGE
write_page "     </pre></p>"
write_page "    </div></div>"
write_page_footer NetBSD
publish_page
231
rm -f $FILES_HTML $GOOD_FILES_HTML $BAD_FILES_HTML $GOOD_SECTION_HTML $BAD_SECTION_HTML
232 233 234 235

# the end
calculate_build_duration
print_out_duration
236
irc_message reproducible-builds "$REPRODUCIBLE_URL/netbsd/ has been updated. ($GOOD_PERCENT% reproducible)"
237 238 239 240 241
echo "============================================================================="

# remove everything, we don't need it anymore...
cleanup_tmpdirs
trap - INT TERM EXIT