Commit 9a094dae authored by kpcyrd's avatar kpcyrd Committed by Holger Levsen

reproducible alpine: generate alpine html

Signed-off-by: Holger Levsen's avatarHolger Levsen <holger@layer-acht.org>
parent 3ded1857
......@@ -464,7 +464,7 @@ echo "$(date -u) - $REPRODUCIBLE_URL/alpine/$REPOSITORY/$SRCPACKAGE/ updated."
# force update of HTML snipplet in reproducible_html_alpine.sh
[ ! -f $BASE/alpine/$REPOSITORY/$SRCPACKAGE/pkg.state ] || rm $BASE/alpine/$REPOSITORY/$SRCPACKAGE/pkg.state
HTML_BUFFER=''
create_pkg_html
create_alpine_pkg_html
update_pkg_in_db
cd
......
......@@ -1166,3 +1166,180 @@ create_pkg_html() {
chmod 644 $ARCHLINUX_PKG_PATH/pkg.html
echo $STATE > $ARCHLINUX_PKG_PATH/pkg.state
}
create_alpine_pkg_html() {
local ALPINE_PKG_PATH=$ALPINE_BASE/$REPOSITORY/$SRCPACKAGE
local HTML_BUFFER=$(mktemp -t alpinerb-html-XXXXXXXX)
local buffer_message
local STATE
# clear files from previous builds
cd "$ALPINE_PKG_PATH"
for file in build1.log build2.log build1.version build2.version *BUILDINFO.txt *.html; do
if [ -f $file ] && [ pkg.build_duration -nt $file ] ; then
rm $file
echo "$ALPINE_PKG_PATH/$file older than $ALPINE_PKG_PATH/pkg.build_duration, thus deleting it."
fi
done
echo " <tr>" >> $HTML_BUFFER
echo " <td>$REPOSITORY</td>" >> $HTML_BUFFER
echo " <td>$SRCPACKAGE</td>" >> $HTML_BUFFER
echo " <td>$VERSION</td>" >> $HTML_BUFFER
echo " <td>" >> $HTML_BUFFER
#
#
if [ -z "$(cd $ALPINE_PKG_PATH/ ; ls *.apk.html 2>/dev/null)" ] ; then
# this horrible if elif elif elif elif... monster should be replaced
# by using pacman's exit code which is possible since sometime in 2018
# check different states and figure out what the page should look like
if find_in_buildlogs '^error: failed to prepare transaction \(conflicting dependencies\)'; then
STATE=DEPWAIT_0
buffer_message='could not resolve dependencies as there are conflicts'
elif find_in_buildlogs '==> ERROR: (Could not resolve all dependencies|.pacman. failed to install missing dependencies)'; then
if find_in_buildlogs 'error: failed to init transaction \(unable to lock database\)'; then
STATE=DEPWAIT_2
buffer_message='pacman could not lock database'
else
STATE=DEPWAIT_1
buffer_message='could not resolve dependencies'
fi
elif find_in_buildlogs '^error: unknown package: '; then
STATE=404_0
buffer_message='unknown package'
elif find_in_buildlogs '(==> ERROR: Failure while downloading|==> ERROR: One or more PGP signatures could not be verified|==> ERROR: One or more files did not pass the validity check|==> ERROR: Integrity checks \(.*\) differ in size from the source array|==> ERROR: Failure while branching|==> ERROR: Failure while creating working copy|Failed to source PKGBUILD.*PKGBUILD)'; then
REASON="download failed"
EXTRA_REASON=""
STATE=404_0
if find_in_buildlogs 'FAILED \(unknown public key'; then
STATE=404_6
EXTRA_REASON="to verify source with PGP due to unknown public key"
elif find_in_buildlogs 'The requested URL returned error: 403'; then
STATE=404_2
EXTRA_REASON="with 403 - forbidden"
elif find_in_buildlogs 'The requested URL returned error: 500'; then
STATE=404_4
EXTRA_REASON="with 500 - internal server error"
elif find_in_buildlogs 'The requested URL returned error: 503'; then
STATE=404_5
EXTRA_REASON="with 503 - service unavailable"
elif find_in_buildlogs '==> ERROR: One or more PGP signatures could not be verified'; then
STATE=404_7
EXTRA_REASON="to verify source with PGP signatures"
elif find_in_buildlogs '(SSL certificate problem: unable to get local issuer certificate|^bzr: ERROR: .SSL: CERTIFICATE_VERIFY_FAILED)'; then
STATE=404_1
EXTRA_REASON="with SSL problem"
elif find_in_buildlogs '==> ERROR: One or more files did not pass the validity check'; then
STATE=404_8
REASON="downloaded ok but failed to verify source"
elif find_in_buildlogs '==> ERROR: Integrity checks \(.*\) differ in size from the source array'; then
STATE=404_9
REASON="Integrity checks differ in size from the source array"
elif find_in_buildlogs 'The requested URL returned error: 404'; then
STATE=404_3
EXTRA_REASON="with 404 - file not found"
elif find_in_buildlogs 'fatal: the remote end hung up unexpectedly'; then
STATE=404_A
EXTRA_REASON="could not clone git repository"
elif find_in_buildlogs 'The requested URL returned error: 504'; then
STATE=404_B
EXTRA_REASON="with 504 - gateway timeout"
elif find_in_buildlogs '==> ERROR: Failure while downloading .* git repo'; then
STATE=404_C
EXTRA_REASON="from git repo"
fi
buffer_message="$REASON $EXTRA_REASON"
elif find_in_buildlogs '==> ERROR: (install file .* does not exist or is not a regular file|The download program wget is not installed)'; then
STATE=FTBFS_0
buffer_message='failed to build, requirements not met'
elif find_in_buildlogs '==> ERROR: A failure occurred in check'; then
STATE=FTBFS_1
buffer_message='failed to build while running tests'
elif find_in_buildlogs '==> ERROR: (An unknown error has occurred|A failure occurred in (build|package|prepare))'; then
STATE=FTBFS_2
buffer_message='failed to build'
elif find_in_buildlogs 'makepkg was killed by timeout after'; then
STATE=FTBFS_3
buffer_message='failed to build, killed by timeout'
elif find_in_buildlogs '==> ERROR: .* contains invalid characters:'; then
STATE=FTBFS_4
buffer_message='failed to build, pkg relations contain invalid characters'
else
STATE=$(query_db "SELECT r.status FROM results AS r
JOIN sources as s on s.id=r.package_id
WHERE s.architecture='x86_64'
AND s.name='$SRCPACKAGE'
AND s.suite='alpine_$REPOSITORY';")
if [ "$STATE" = "BLACKLISTED" ] ; then
buffer_message='blacklisted'
else
STATE=UNKNOWN
buffer_message='probably failed to build from source, please investigate'
fi
fi
# print build failures
if [ "$STATE" = "UNKNOWN" ]; then
echo " $buffer_message" >> $HTML_BUFFER
else
include_icon $STATE "$buffer_message"
fi
else
local STATE=GOOD
local SOME_GOOD=false
for ARTIFACT in $(cd $ALPINE_PKG_PATH/ ; ls *.apk.html) ; do
if [ -z "$(echo $ARTIFACT | grep $VERSION)" ] ; then
echo "deleting $ARTIFACT as version is not $VERSION"
rm -f $ARTIFACT
continue
elif [ ! -z "$(grep 'build reproducible in our test framework' $ALPINE_PKG_PATH/$ARTIFACT)" ] ; then
SOME_GOOD=true
include_icon $STATE "<a href=\"/alpine/$REPOSITORY/$SRCPACKAGE/$ARTIFACT\">${ARTIFACT:0:-5}</a> is reproducible in our current test framework<br />"
else
# change $STATE unless we have found .buildinfo differences already...
if [ "$STATE" != "FTBR_0" ] ; then
STATE=FTBR_1
fi
# this shouldnt happen, but (for now) it does, so lets mark them…
EXTRA_REASON=""
if [ ! -z "$(grep 'class="source">.BUILDINFO' $ALPINE_PKG_PATH/$ARTIFACT)" ] ; then
STATE=FTBR_0
EXTRA_REASON=" with variations in .BUILDINFO"
fi
include_icon $STATE "<a href=\"/alpine/$REPOSITORY/$SRCPACKAGE/$ARTIFACT\">${ARTIFACT:0:-5}</a> is unreproducible$EXTRA_REASON<br />"
fi
done
# we only count source packages…
if [[ $STATE = FTBR_1 && $SOME_GOOD = true ]]; then
STATE=FTBR_2
fi
fi
echo " </td>" >> $HTML_BUFFER
echo " <td>$DATE" >> $HTML_BUFFER
local DURATION=$(cat $ALPINE_PKG_PATH/pkg.build_duration 2>/dev/null || true)
if [ -n "$DURATION" ]; then
local HOUR=$(echo "$DURATION/3600"|bc)
local MIN=$(echo "($DURATION-$HOUR*3600)/60"|bc)
local SEC=$(echo "$DURATION-$HOUR*3600-$MIN*60"|bc)
BUILD_DURATION="<br />${HOUR}h:${MIN}m:${SEC}s"
else
BUILD_DURATION=" "
fi
echo " $BUILD_DURATION</td>" >> $HTML_BUFFER
echo " <td>" >> $HTML_BUFFER
for LOG in build1.log build2.log ; do
if [ -f $ALPINE_PKG_PATH/$LOG ] ; then
if [ "$LOG" = "build2.log" ] ; then
echo " <br />" >> $HTML_BUFFER
fi
get_filesize $ALPINE_PKG_PATH/$LOG
echo " <a href=\"/alpine/$REPOSITORY/$SRCPACKAGE/$LOG\">$LOG</a> ($SIZE)" >> $HTML_BUFFER
fi
done
echo " </td>" >> $HTML_BUFFER
echo " </tr>" >> $HTML_BUFFER
mv $HTML_BUFFER $ALPINE_PKG_PATH/pkg.html
chmod 644 $ALPINE_PKG_PATH/pkg.html
echo $STATE > $ALPINE_PKG_PATH/pkg.state
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment