[Qa-jenkins-scm] [Git][qa/jenkins.debian.net][master] reproducible Archlinux: choose packages to build from SQL database

Holger Levsen gitlab at salsa.debian.org
Sat Sep 22 18:54:43 BST 2018


Holger Levsen pushed to branch master at Debian QA / jenkins.debian.net


Commits:
d3851dd6 by Holger Levsen at 2018-09-22T17:53:49Z
reproducible Archlinux: choose packages to build from SQL database

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -


3 changed files:

- TODO
- bin/reproducible_build_archlinux_pkg.sh
- bin/reproducible_maintenance.sh


Changes:

=====================================
TODO
=====================================
@@ -339,7 +339,8 @@ See link:https://jenkins.debian.net/userContent/about.html["about jenkins.debian
 **** once there are no more left, reschedule based on last build_date
 *** also delete unknown packages from db: sources and schedule, later results as well
 *** check/make sure that packages which are newer in trunk than repo are only scheduled once
-** make build.sh read & write db
+** make build.sh
+*** write db
 *** delete all pkg.needs_build files on disk
 *** drop all occurrances of pkg.needs_build from the code
 *** really share /var/log/jenkins/reproducible-stale-builds.log


=====================================
bin/reproducible_build_archlinux_pkg.sh
=====================================
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright 2015-2017 Holger Levsen <holger at layer-acht.org>
+# Copyright 2015-2018 Holger Levsen <holger at layer-acht.org>
 #                2017 kpcyrd <git at rxv.cc>
 # released under the GPLv=2
 
@@ -42,72 +42,52 @@ handle_remote_error() {
 
 choose_package() {
 	echo "$(date -u ) - choosing package to be build."
-	local REPO
-	local PKG
-	for REPO in $(echo $ARCHLINUX_REPOS | sed -s "s# #\n#g" | sort -R | xargs echo ); do
-		# try to find packages which have been triggered
-		for PKG in $(cat ${ARCHLINUX_PKGS}_$REPO | cut -d ' ' -f1 | sort -R | xargs echo ) ; do
-			# ignore blacklisted packages (should be noted in the web pages later)
-			for i in $ARCHLINUX_BLACKLISTED ; do
-				if [ "$PKG" = "$i" ] ; then
-					continue
-				fi
-			done
-			# if triggered...
-			if [ -f $BASE/archlinux/$REPO/$PKG/pkg.needs_build ] ; then
-				REPOSITORY=$REPO
-				SRCPACKAGE=$PKG
-				# break out of the loop (and then out of the next loop too...)
-				break
-			fi
-		done
-		if [ ! -z "$SRCPACKAGE" ] ; then
-			break
-		fi
-	done
-	if [ -z "$SRCPACKAGE" ] ; then
-		for REPO in $(echo $ARCHLINUX_REPOS | sed -s "s# #\n#g" | sort -R | xargs echo ); do
-			# trz to find packages which never been built before
-			for PKG in $(cat ${ARCHLINUX_PKGS}_$REPO | cut -d ' ' -f1 | sort -R | xargs echo ) ; do
-				# ignore blacklisted packages (should be noted in the web pages later)
-				for i in $ARCHLINUX_BLACKLISTED ; do
-					if [ "$PKG" = "$i" ] ; then
-						continue
-					fi
-				done
-				# if new...
-				if [ ! -d $BASE/archlinux/$REPO/$PKG ] ; then
-					REPOSITORY=$REPO
-					SRCPACKAGE=$PKG
-					# break out of the loop (and then out of the next loop too...)
-					break
-				fi
-			done
-			# again, if we broke out of the previous loop we have choosen a package
-			if [ ! -z "$SRCPACKAGE" ] ; then
-				break
-			fi
-		done
-	fi
-	if [ -z $SRCPACKAGE ] ; then
-		echo "$(date -u ) - no package found to be build, sleeping 3h."
-		for i in $(seq 1 6) ; do
-			sleep 30m
-			echo "$(date -u ) - still sleeping..."
-		done
-		echo "$(date -u ) - exiting cleanly now."
+	ARCH="x86_64"
+	local RESULT=$(query_db "
+		SELECT s.suite, s.id, s.name, s.version
+		FROM schedule AS sch JOIN sources AS s ON sch.package_id=s.id
+		WHERE sch.date_build_started is NULL
+		AND s.architecture='$ARCH'
+		ORDER BY date_scheduled LIMIT 5"|sort -R|head -1)
+	if [ -z "$RESULT" ] ; then
+		echo "No packages scheduled, sleeping 30m."
+		sleep 30m
 		exit 0
 	fi
-	mkdir -p $BASE/archlinux/$REPOSITORY/$SRCPACKAGE
-	# very simple locking…
-	if [ -f $BASE/archlinux/$REPO/$SRCPACKAGE/pkg.needs_build ] ; then
-		rm $BASE/archlinux/$REPO/$SRCPACKAGE/pkg.needs_build
-		# prevent the package from being scheduled again while its already building (which can take several hours...)
-		touch $BASE/archlinux/$REPO/$SRCPACKAGE/build1.log
+	SUITE=$(echo $RESULT|cut -d "|" -f1)
+	REPOSITORY=$(echo $SUITE | cut -d "_" -f2)
+	SRCPKGID=$(echo $RESULT|cut -d "|" -f2)
+	SRCPACKAGE=$(echo $RESULT|cut -d "|" -f3)
+	VERSION=$(echo $RESULT|cut -d "|" -f4)
+	# remove previous build attempts which didnt finish correctly:
+	JOB_PREFIX="${JOB_NAME#reproducible_builder_}/"
+	BAD_BUILDS=$(mktemp --tmpdir=$TMPDIR)
+	query_db "SELECT package_id, date_build_started, job FROM schedule WHERE job LIKE '${JOB_PREFIX}%'" > $BAD_BUILDS
+	if [ -s "$BAD_BUILDS" ] ; then
+		local STALELOG=/var/log/jenkins/reproducible-archlinux-stale-builds.log
+		# reproducible-archlinux-stale-builds.log is mailed once a day by reproducible_maintenance.sh
+		echo -n "$(date -u) - stale builds found, cleaning db from these: " | tee -a $STALELOG
+		cat $BAD_BUILDS | tee -a $STALELOG
+		query_db "UPDATE schedule SET date_build_started = NULL, job = NULL WHERE job LIKE '${JOB_PREFIX}%'"
+	fi
+	rm -f $BAD_BUILDS
+	# mark build attempt, first test if none else marked a build attempt recently
+	echo "ok, let's check if $SRCPACKAGE is building anywhere yet…"
+	RESULT=$(query_db "SELECT date_build_started FROM schedule WHERE package_id='$SRCPKGID'")
+	if [ -z "$RESULT" ] ; then
+		echo "ok, $SRCPACKAGE is not building anywhere…"
+		# try to update the schedule with our build attempt, then check no else did it, if so, abort
+		query_db "UPDATE schedule SET date_build_started='$DATE', job='$JOB' WHERE package_id='$SRCPKGID' AND date_build_started IS NULL"
+		RESULT=$(query_db "SELECT date_build_started FROM schedule WHERE package_id='$SRCPKGID' AND date_build_started='$DATE' AND job='$JOB'")
+		if [ -z "$RESULT" ] ; then
+			echo "hm, seems $SRCPACKAGE is building somewhere… failed to update the schedule table with our build ($SRCPKGID, $DATE, $JOB)."
+			handle_race_condition
+		fi
 	else
-		echo "$(date -u ) - $BASE/archlinux/$REPO/$SRCPACKAGE/pkg.needs_build does not exist?!?"
-		exit 1
+		echo "hm, seems $SRCPACKAGE is building somewhere… schedule table now listed it as building somewhere else."
+		handle_race_condition
 	fi
+
 	echo "$(date -u ) - building package $SRCPACKAGE from '$REPOSITORY' now..."
 }
 
@@ -370,6 +350,7 @@ REPOSITORY=""
 SRCPACKAGE=""
 VERSION=""
 choose_package
+mkdir -p $BASE/archlinux/$REPOSITORY/$SRCPACKAGE
 # build package twice
 mkdir b1 b2
 # currently there are two Arch Linux build nodes… let's keep things simple
@@ -384,8 +365,18 @@ else
 	NODE1=$N2
 	NODE2=$N1
 fi
+echo "============================================================================="
+echo "Initialising reproducibly build of ${SRCPACKAGE} in ${REPOSITORY} on ${ARCH} now."
+echo "1st build will be done on $NODE1."
+echo "2nd build will be done on $NODE2."
+echo "============================================================================="
+#
+# do 1st build
+#
 remote_build 1 ${NODE1}
+#
 # only do the 2nd build if the 1st produced results
+#
 if [ ! -z "$(ls $TMPDIR/b1/$SRCPACKAGE/*.pkg.tar.xz 2>/dev/null|| true)" ] ; then
 	remote_build 2 ${NODE2}
 	cd $TMPDIR/b1/$SRCPACKAGE


=====================================
bin/reproducible_maintenance.sh
=====================================
@@ -563,6 +563,7 @@ if [ "$HOSTNAME" = "$MAINNODE" ] && [ $(date -u +%H) -eq 0 ]  ; then
 	files_to_mail=(
 		/var/log/jenkins/reproducible-builder-errors.log
 		/var/log/jenkins/reproducible-stale-builds.log
+		/var/log/jenkins/reproducible-archlinux-stale-builds.log
 		/var/log/jenkins/reproducible-race-conditions.log
 		/var/log/jenkins/reproducible-diskspace-issues.log
 		/var/log/jenkins/reproducible-remote-error.log



View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/commit/d3851dd6ee0cc447ff201bd2d0e4a1587dc74f69

-- 
View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/commit/d3851dd6ee0cc447ff201bd2d0e4a1587dc74f69
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/qa-jenkins-scm/attachments/20180922/835daf63/attachment-0001.html>


More information about the Qa-jenkins-scm mailing list