summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/reproducible_build.sh105
1 files changed, 44 insertions, 61 deletions
diff --git a/bin/reproducible_build.sh b/bin/reproducible_build.sh
index 9470a748..e394c04f 100755
--- a/bin/reproducible_build.sh
+++ b/bin/reproducible_build.sh
@@ -13,28 +13,6 @@ common_init "$@"
set -e
-log_info () {
- _log "I:"
-}
-
-log_error () {
- _log "E:"
-}
-
-log_warning () {
- _log "W:"
-}
-
-log_file () {
- cat $@ | tee -a $RBUILDLOG
-}
-
-_log () {
- local prefix="$1"
- shift 1
- echo -e "$(date -u) $prefix $*" | tee -a $RBUILDLOG
-}
-
exit_early_if_debian_is_broken() {
# debian is fine, thanks
if false && [ "$ARCH" = "armhf" ] ; then
@@ -57,11 +35,12 @@ create_results_dirs() {
}
handle_race_condition() {
+ echo | tee -a $RBUILDLOG
local RESULT=$(sqlite3 -init $INIT ${PACKAGES_DB} "SELECT job FROM schedule WHERE package_id='$SRCPKGID'")
- local msg="Package ${SRCPACKAGE} (id=$SRCPKGID) in ${SUITE} on ${ARCH} is probably already building at $RESULT, while this is $BUILD_URL.\n"
- log_warning "\n$msg"
+ local msg="Warning, package ${SRCPACKAGE} (id=$SRCPKGID) in ${SUITE} on ${ARCH} is probably already building at $RESULT, while this is $BUILD_URL.\n"
+ printf "$msg" | tee -a $RBUILDLOG
printf "$(date -u) - $msg" >> /var/log/jenkins/reproducible-race-conditions.log
- log_warning "Terminating this build quickly and nicely..."
+ echo "$(date -u) - Terminating this build quickly and nicely..." | tee -a $RBUILDLOG
if [ $SAVE_ARTIFACTS -eq 1 ] ; then
SAVE_ARTIFACTS=0
if [ ! -z "$NOTIFY" ] ; then NOTIFY="failure" ; fi
@@ -80,15 +59,17 @@ save_artifacts() {
local HEADER="$DEBIAN_BASE/$ARTIFACTS/.HEADER.html"
mkdir -p $DEBIAN_BASE/$ARTIFACTS
cp -r $TMPDIR/* $DEBIAN_BASE/$ARTIFACTS/
+ echo | tee -a ${RBUILDLOG}
local msg="Artifacts from this build have been preserved. They will be available for 24h only, so download them now.\n"
msg="${msg}WARNING: You shouldn't trust packages downloaded from this host, they can contain malware or the worst of your fears, packaged nicely in debian format.\n"
msg="${msg}If you are not afraid facing your fears while helping the world by investigating reproducible build issues, you can download the artifacts from the following location: $URL\n"
- log_info "\n$msg\n"
+ printf "$msg" | tee -a $RBUILDLOG
echo "<p>" > $HEADER
printf "$msg" | sed 's#$#<br />#g' >> $HEADER
echo "Package page: <a href=\"$DEBIAN_URL/${SUITE}/${ARCH}/${SRCPACKAGE}\">$DEBIAN_URL/${SUITE}/${ARCH}/${SRCPACKAGE}</a><br />" >> $HEADER
echo "</p>" >> $HEADER
chmod 644 $HEADER
+ echo | tee -a ${RBUILDLOG}
# irc message
if [ ! -z "$NOTIFY" ] ; then
local MESSAGE="Artifacts for ${SRCPACKAGE}, $STATUS in ${SUITE}/${ARCH}: $URL"
@@ -134,7 +115,7 @@ update_db_and_html() {
if [ "${OLD_STATUS}" = "reproducible" ] && [ "$STATUS" != "depwait" ] && \
( [ "$STATUS" = "unreproducible" ] || [ "$STATUS" = "FTBFS" ] ) ; then
MESSAGE="${DEBIAN_URL}/${SUITE}/${ARCH}/${SRCPACKAGE} : reproducible ➤ ${STATUS}"
- log_info "\n$MESSAGE\n"
+ echo -e "\n$MESSAGE" | tee -a ${RBUILDLOG}
irc_message debian-reproducible "$MESSAGE"
# disable ("regular") irc notification unless it's due to diffoscope problems
if [ ! -z "$NOTIFY" ] && [ "$NOTIFY" != "diffoscope" ] ; then
@@ -184,21 +165,21 @@ diff_copy_buildlogs() {
gzip -9cvn b2/build.log > $DEBIAN_BASE/logs/$SUITE/$ARCH/${SRCPACKAGE}_${EVERSION}.build2.log.gz
chmod 644 $DEBIAN_BASE/logs/$SUITE/$ARCH/${SRCPACKAGE}_${EVERSION}.build2.log.gz
elif [ $FTBFS -eq 0 ] ; then
- log_warning "No second build log, what happened?"
+ echo "Warning: No second build log, what happened?" | tee -a $RBUILDLOG
fi
set -x # # to debug diffoscope/schroot problems
echo "Compressing the 1st log..."
gzip -9cvn b1/build.log > $DEBIAN_BASE/logs/$SUITE/$ARCH/${SRCPACKAGE}_${EVERSION}.build1.log.gz
chmod 644 $DEBIAN_BASE/logs/$SUITE/$ARCH/${SRCPACKAGE}_${EVERSION}.build1.log.gz
else
- log_error "No first build log, not even looking for the second"
+ echo "Error: No first build log, not even looking for the second" | tee -a $RBUILDLOG
fi
}
handle_404() {
- log_warning "Download of ${SRCPACKAGE} sources from ${SUITE} failed."
- ls -l ${SRCPACKAGE}* | log_file -
- log_warning "Maybe there was a network problem, or ${SRCPACKAGE} is not a source package in ${SUITE}, or it was removed or renamed. Please investigate. Sleeping 30m as this should not happen."
+ echo "Warning: Download of ${SRCPACKAGE} sources from ${SUITE} failed." | tee -a ${RBUILDLOG}
+ ls -l ${SRCPACKAGE}* | tee -a ${RBUILDLOG}
+ echo "Warning: Maybe there was a network problem, or ${SRCPACKAGE} is not a source package in ${SUITE}, or it was removed or renamed. Please investigate. Sleeping 30m as this should not happen." | tee -a ${RBUILDLOG}
DURATION=''
EVERSION="None"
update_rbuildlog
@@ -210,9 +191,9 @@ handle_404() {
}
handle_depwait() {
- log_warning "Downloading the build dependencies failed"
- log_warning "Maybe there was a network problem, or the build dependencies are currently uninstallable; consider filing a bug in the last case."
- log_warning "Network problems are automatically rescheduled after some hours."
+ echo "Downloading the build dependencies failed" | tee -a "$RBUILDLOG"
+ echo "Maybe there was a network problem, or the build dependencies are currently uninstallable; consider filing a bug in the last case." | tee -a "$RBUILDLOG"
+ echo "Network problems are automatically rescheduled after some hours." | tee -a "$RBUILDLOG"
calculate_build_duration
update_db_and_html "depwait"
if [ $SAVE_ARTIFACTS -eq 1 ] ; then SAVE_ARTIFACTS=0 ; fi
@@ -221,7 +202,7 @@ handle_depwait() {
handle_not_for_us() {
# a list of valid architecture for this package should be passed to this function
- log_info "Package ${SRCPACKAGE} (${VERSION}) shall only be build on \"$(echo "$@" | xargs echo )\" and thus was skipped."
+ echo "Package ${SRCPACKAGE} (${VERSION}) shall only be build on \"$(echo "$@" | xargs echo )\" and thus was skipped." | tee -a ${RBUILDLOG}
DURATION=''
update_rbuildlog
update_db_and_html "not for us"
@@ -267,15 +248,16 @@ handle_ftbfs() {
handle_ftbr() {
# a ftbr explaination message could be passed
local FTBRmessage="$@"
- log_error "\n${SRCPACKAGE} failed to build reproducibly in ${SUITE} on ${ARCH}."
+ echo | tee -a ${RBUILDLOG}
+ echo "$(date -u) - ${SRCPACKAGE} failed to build reproducibly in ${SUITE} on ${ARCH}." | tee -a ${RBUILDLOG}
cp b1/${BUILDINFO} $DEBIAN_BASE/buildinfo/${SUITE}/${ARCH}/ > /dev/null 2>&1 || true # will fail if there is no .buildinfo
if [ ! -z "$FTRmessage" ] ; then
- log_error "${FTBRmessage}."
+ echo "$(date -u) - ${FTBRmessage}." | tee -a ${RBUILDLOG}
fi
if [ -f ./${DBDREPORT} ] ; then
mv ./${DBDREPORT} $DEBIAN_BASE/dbd/${SUITE}/${ARCH}/
else
- log_warning "$DIFFOSCOPE produced no output (which is strange)."
+ echo "$(date -u) - $DIFFOSCOPE produced no output (which is strange)." | tee -a $RBUILDLOG
fi
if [ -f ./$DBDTXT ] ; then
mv ./$DBDTXT $DEBIAN_BASE/dbdtxt/$SUITE/$ARCH/
@@ -289,15 +271,16 @@ handle_reproducible() {
if [ ! -f ./${DBDREPORT} ] && [ -f b1/${BUILDINFO} ] ; then
cp b1/${BUILDINFO} $DEBIAN_BASE/buildinfo/${SUITE}/${ARCH}/ > /dev/null 2>&1
figlet ${SRCPACKAGE}
- log_info "\n$DIFFOSCOPE found no differences in the changes files, and a .buildinfo file also exists."
- log_info "${SRCPACKAGE} from $SUITE built successfully and reproducibly on ${ARCH}."
+ echo | tee -a ${RBUILDLOG}
+ echo "$DIFFOSCOPE found no differences in the changes files, and a .buildinfo file also exists." | tee -a ${RBUILDLOG}
+ echo "${SRCPACKAGE} from $SUITE built successfully and reproducibly on ${ARCH}." | tee -a ${RBUILDLOG}
calculate_build_duration
update_db_and_html "reproducible"
elif [ -f ./$DBDREPORT ] ; then
- log_warning "Diffoscope claims the build is reproducible, but there is a diffoscope file. Please investigate."
+ echo "Diffoscope claims the build is reproducible, but there is a diffoscope file. Please investigate." | tee -a $RBUILDLOG
handle_ftbr
elif [ ! -f b1/$BUILDINFO ] ; then
- log_warning "Diffoscope claims the build is reproducible, but there is no .buildinfo file. Please investigate."
+ echo "Diffoscope claims the build is reproducible, but there is no .buildinfo file. Please investigate." | tee -a $RBUILDLOG
handle_ftbr
fi
}
@@ -352,6 +335,7 @@ dbd_timeout() {
call_diffoscope_on_buildinfo_files() {
local TMPLOG=$(mktemp --tmpdir=$TMPDIR)
+ echo | tee -a ${RBUILDLOG}
local TIMEOUT="120m"
DBDSUITE=$SUITE
if [ "$SUITE" = "experimental" ] ; then
@@ -368,7 +352,7 @@ call_diffoscope_on_buildinfo_files() {
sleep 2m
DIFFOSCOPE="$(schroot --directory $TMPDIR -c source:jenkins-reproducible-${DBDSUITE}-diffoscope diffoscope -- --version 2>&1 || echo 'diffoscope_version_not_available')"
fi
- log_info "\n$DIFFOSCOPE will be used to compare the two builds:"
+ echo "$(date -u) - $DIFFOSCOPE will be used to compare the two builds:" | tee -a ${RBUILDLOG}
set +e
set -x
# remember to also modify the retry diffoscope call 15 lines below
@@ -401,8 +385,9 @@ call_diffoscope_on_buildinfo_files() {
fi
if ! "$DEBUG" ; then set +x ; fi
set -e
- log_file $TMPLOG # print dbd output
+ cat $TMPLOG | tee -a $RBUILDLOG # print dbd output
rm $TMPLOG
+ echo | tee -a ${RBUILDLOG}
case $RESULT in
0)
handle_reproducible
@@ -495,8 +480,8 @@ choose_package() {
elif [ "$NOTIFY" = "0" ] ; then # the build script has a different idea of notify than the scheduler,
NOTIFY='' # the scheduler uses integers, build.sh uses strings.
fi
- log_info "starting to build ${SRCPACKAGE}/${SUITE}/${ARCH} on $(hostname -f) on '$DATE'"
- log_info "The jenkins build log is/was available at ${BUILD_URL}console"
+ echo "$(date -u ) - starting to build ${SRCPACKAGE}/${SUITE}/${ARCH} on $(hostname -f) on '$DATE'" | tee ${RBUILDLOG}
+ echo "The jenkins build log is/was available at ${BUILD_URL}console" | tee -a ${RBUILDLOG}
}
download_source() {
@@ -511,7 +496,7 @@ download_source() {
local ENGLISH_RESULT=$(egrep 'E: (Unable to find a source package for|Failed to fetch.*(Unable to connect to|Connection failed|Size mismatch|Cannot initiate the connection to|Bad Gateway|Service Unavailable))' ${TMPLOG})
local FRENCH_RESULT=$(egrep 'E: (Unable to find a source package for|impossible de récupérer.*(Unable to connect to|Échec de la connexion|Size mismatch|Cannot initiate the connection to|Bad Gateway|Service Unavailable))' ${TMPLOG})
PARSED_RESULT="${ENGLISH_RESULT}${FRENCH_RESULT}"
- log_file ${TMPLOG}
+ cat ${TMPLOG} >> ${RBUILDLOG}
rm ${TMPLOG}
set -e
}
@@ -520,9 +505,9 @@ download_again_if_needed() {
if [ "$(ls ${SRCPACKAGE}_*.dsc 2> /dev/null)" = "" ] || [ ! -z "$PARSED_RESULT" ] ; then
# sometimes apt-get cannot download a package for whatever reason.
# if so, wait some time and try again. only if that fails, give up.
- log_error "download of ${SRCPACKAGE} sources (for ${SUITE}) failed."
- ls -l ${SRCPACKAGE}* | log_file -
- log_error "sleeping 5m before re-trying..."
+ echo "$(date -u ) - download of ${SRCPACKAGE} sources (for ${SUITE}) failed." | tee -a ${RBUILDLOG}
+ ls -l ${SRCPACKAGE}* | tee -a ${RBUILDLOG}
+ echo "$(date -u ) - sleeping 5m before re-trying..." | tee -a ${RBUILDLOG}
sleep 5m
download_source
fi
@@ -602,12 +587,10 @@ EOF
--buildresult $TMPDIR/b1 \
--logfile b1/build.log \
${SRCPACKAGE}_${EVERSION}.dsc
- ) 2>&1 | log_file -
+ ) 2>&1 | tee -a $RBUILDLOG
PRESULT=${PIPESTATUS[0]}
if [ $PRESULT -eq 124 ] ; then
- msg="pbuilder was killed by timeout after 18h."
- log_error "$msg"
- echo "$(date -u) - $msg" | tee -a b1/build.log
+ echo "$(date -u) - pbuilder was killed by timeout after 18h." | tee -a b1/build.log $RBUILDLOG
fi
if ! "$DEBUG" ; then set +x ; fi
rm $TMPCFG
@@ -715,7 +698,7 @@ remote_build() {
rsync -e "ssh -o 'BatchMode = yes' -p $PORT" -r $NODE:$TMPDIR/b$BUILDNR $TMPDIR/
RESULT=$?
if [ $RESULT -ne 0 ] ; then
- log_warning "rsync from $NODE failed, sleeping 2m before re-trying..."
+ echo "$(date -u ) - rsync from $NODE failed, sleeping 2m before re-trying..." | tee -a ${RBUILDLOG}
sleep 2m
rsync -e "ssh -o 'BatchMode = yes' -p $PORT" -r $NODE:$TMPDIR/b$BUILDNR $TMPDIR/
RESULT=$?
@@ -727,7 +710,7 @@ remote_build() {
ssh -o "BatchMode = yes" -p $PORT $NODE "rm -r $TMPDIR"
set -e
if [ $BUILDNR -eq 1 ] ; then
- log_file $TMPDIR/b1/build.log
+ cat $TMPDIR/b1/build.log >> ${RBUILDLOG}
fi
}
@@ -766,7 +749,7 @@ build_rebuild() {
mkdir b1 b2
remote_build 1 $NODE1
if [ ! -f b1/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes ] && [ -f b1/${SRCPACKAGE}_*_${ARCH}.changes ] ; then
- log_error "Version mismatch between main node (${SRCPACKAGE}_${EVERSION}_${ARCH}.dsc expected) and first build node ($(ls b1/*dsc)) for $SUITE/$ARCH, aborting. Please upgrade the schroots..."
+ echo "Version mismatch between main node (${SRCPACKAGE}_${EVERSION}_${ARCH}.dsc expected) and first build node ($(ls b1/*dsc)) for $SUITE/$ARCH, aborting. Please upgrade the schroots..." | tee -a ${RBUILDLOG}
# reschedule the package for later and quit the build without saving anything
sqlite3 -init $INIT ${PACKAGES_DB} "UPDATE schedule SET date_build_started = NULL, job = NULL, date_scheduled='$(date -u +'%Y-%m-%d %H:%M')' WHERE package_id='$SRCPKGID'"
NOTIFY=""
@@ -777,9 +760,9 @@ build_rebuild() {
if [ -f b2/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes ] ; then
# both builds were fine, i.e., they did not FTBFS.
FTBFS=0
- log_file b1/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes
+ cat b1/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes | tee -a ${RBUILDLOG}
else
- log_error "the second build failed, even though the first build was successful."
+ echo "$(date -u) - the second build failed, even though the first build was successful." | tee -a ${RBUILDLOG}
fi
fi
}
@@ -848,7 +831,7 @@ delay_start
choose_package # defines SUITE, PKGID, SRCPACKAGE, SAVE_ARTIFACTS, NOTIFY
get_source_package
-log_file ${SRCPACKAGE}_${EVERSION}.dsc
+cat ${SRCPACKAGE}_${EVERSION}.dsc | tee -a ${RBUILDLOG}
check_suitability
build_rebuild # defines FTBFS redefines RBUILDLOG