[Reproducible-builds] Patch V2 for build nodes pools
Vagrant Cascadian
vagrant at debian.org
Sat Dec 19 02:34:17 UTC 2015
On 2015-12-18, Holger Levsen wrote:
> Hi Vagrant,
>
> On Samstag, 19. Dezember 2015, Vagrant Cascadian wrote:
>> Patch below! No idea if it works, given that I don't have a spare
>> jenkins.debian.net or build network to test on, but hopefully it
>> demonstrates the idea, and is mostly there.
>
> as discussed on irc: thanks for your work on this! I like the idea, I very
> much like the idea of developing this as a 16th (or N+1th) build job and in
> general I'm willing to give it a try.
I didn't spend any time really figuring out which nodes to add to the
example 16th build job, so that might need some adjusting.
> Just please address those "FIXME"s first, and second the concerns I've
> raised so far on IRC, and third, future concerns ;-)
Ok, updated patch should address those concerns and a few obvious bugfixes:
- Split load estimating into it's own script, and add support for
available memory.
- Only set NODE* and PORT* from build_rebuild when called from
build_rebuild function.
- .debian.net on NODE1 and NODE2 in build_rebuild function.
- Call timeout so that the ssh processes don't take too long to complete.
diff --git a/bin/reproducible_build.sh b/bin/reproducible_build.sh
index 338c207..28dd8ed 100755
--- a/bin/reproducible_build.sh
+++ b/bin/reproducible_build.sh
@@ -688,9 +688,43 @@ check_buildinfo() {
rm -f $TMPFILE1 $TMPFILE2
}
+select_least_loaded_node() {
+ local pool_nodes
+ local node
+ local port
+ local load
+ local best_load
+ local selected
+ # default to the first node
+ selected="$1"
+ pool_nodes="$@"
+ if [ "$selected" = "$pool_nodes" ]; then
+ echo $selected
+ return 0
+ fi
+ load = 0
+ best_load = 0
+ for this_node in $pool_nodes ; do
+ node=$(echo $this_node | cut -d : -f 1)
+ port=$(echo $this_node | cut -d : -f 2)
+ load=$(timeout 10 ssh $node -p $port /srv/jenkins/bin/reproducible_build_node_load.sh)
+ if [ "$load" -gt "$best_load" ]; then
+ selected="$this_node"
+ best_load="$load"
+ fi
+ done
+ echo $selected
+}
+
build_rebuild() {
FTBFS=1
mkdir b1 b2
+ local selected_node
+ selected_node=$(select_least_loaded_node $NODE1_POOL)
+ NODE1=$(echo $selected_node | cut -d : -f 1).debian.net
+ PORT1=$(echo $selected_node | cut -d : -f 2)
+ # if no port is given, assume 22
+ if [ "$NODE1" = "${PORT1}.debian.net" ] ; then PORT1=22 ; fi
remote_build 1 $NODE1 $PORT1
if [ ! -f b1/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes ] && [ -f b1/${SRCPACKAGE}_*_${ARCH}.changes ] ; then
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}
@@ -700,6 +734,11 @@ build_rebuild() {
exit 0
elif [ -f b1/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes ] ; then
# the first build did not FTBFS, try rebuild it.
+ selected_node=$(select_least_loaded_node $NODE2_POOL)
+ NODE2=$(echo $selected_node | cut -d : -f 1).debian.net
+ PORT2=$(echo $selected_node | cut -d : -f 2)
+ # if no port is given, assume 22
+ if [ "$NODE2" = "${PORT2}.debian.net" ] ; then PORT2=22 ; fi
remote_build 2 $NODE2 $PORT2
if [ -f b2/${SRCPACKAGE}_${EVERSION}_${ARCH}.changes ] ; then
# both builds were fine, i.e., they did not FTBFS.
@@ -750,17 +789,12 @@ elif [ "$1" = "1" ] || [ "$1" = "2" ] ; then
exit 0
elif [ "$2" != "" ] ; then
MODE="master"
- NODE1="$(echo $1 | cut -d ':' -f1).debian.net"
- NODE2="$(echo $2 | cut -d ':' -f1).debian.net"
- PORT1="$(echo $1 | cut -d ':' -f2)"
- PORT2="$(echo $2 | cut -d ':' -f2)"
- # if no port is given, assume 22
- if [ "$NODE1" = "${PORT1}.debian.net" ] ; then PORT1=22 ; fi
- if [ "$NODE2" = "${PORT2}.debian.net" ] ; then PORT2=22 ; fi
+ NODE1_POOL="$1"
+ NODE2_POOL="$2"
# overwrite ARCH for remote builds
for i in $ARCHS ; do
# try to match ARCH in nodenames
- if [[ "$NODE1" =~ .*-$i.* ]] ; then
+ if [[ "$NODE1_POOL" =~ .*-$i.* ]] ; then
ARCH=$i
fi
done
diff --git a/bin/reproducible_node_load.sh b/bin/reproducible_node_load.sh
new file mode 100755
index 0000000..36bce84
--- /dev/null
+++ b/bin/reproducible_node_load.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# produce an estimated load based on the number of CPUs and RAM, minus
+# the load average.
+
+cpus=$(grep ^processor /proc/cpuinfo | wc -l)
+memory_available=$(awk '/^MemAvailable:/{print $2}' /proc/meminfo)
+loadavg=$(awk '{print $1}' /proc/loadavg)
+fudge=100
+
+# Calculation is basically, memory + cpus - loadavg, with some fudge
+# factor to try to ensure it's only a positive number.
+echo "$memory_available + ($cpus - $loadavg + $fudge) * 1000000" | \
+ bc | \
+ cut -d . -f 1
diff --git a/job-cfg/reproducible.yaml b/job-cfg/reproducible.yaml
index 97df606..5963206 100644
--- a/job-cfg/reproducible.yaml
+++ b/job-cfg/reproducible.yaml
@@ -481,7 +481,8 @@
- '13': { my_node1: 'cbxi4pro0-armhf-rb:2226', my_node2: 'rpi2b-armhf-rb:2230' }
- '14': { my_node1: 'rpi2b-armhf-rb:2230', my_node2: 'wbq0-armhf-rb:2225' }
- '15': { my_node1: 'wbd0-armhf-rb:2223', my_node2: 'hb0-armhf-rb:2224' }
- my_shell: '/srv/jenkins/bin/reproducible_build.sh {my_node1} {my_node2}'
+ - '16': { my_node1: 'wbd0-armhf-rb:2223 wbq0-armhf-r:2225', my_node2: 'bpi0-armhf-rb:2222 odxu4-armhf-rb:2229' }
+ my_shell: '/srv/jenkins/bin/reproducible_build.sh "{my_node1}" "{my_node2}"'
my_timed: '* * * * *'
my_hname: ''
> btw, there's jenkins-test-vm.debian.net now too, but currently it's mostly
> only suited for testing job configurations…
Ah well, someday... :)
live well,
vagrant
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/reproducible-builds/attachments/20151218/f92fb786/attachment.sig>
More information about the Reproducible-builds
mailing list