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

reproducible alpine: generate alpine html

parent 3ded1857
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+177 −0
Original line number Diff line number Diff line
@@ -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
}