chiark / gitweb /
bin/mdw-sbuild-server: Run builds sequentially.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 22 Sep 2019 14:25:35 +0000 (15:25 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 22 Sep 2019 14:25:35 +0000 (15:25 +0100)
Otherwise they can interfere with each other, and cause test failures.
For example, TrIPE wants to use fixed port numbers in its fancier tests.

bin/mdw-sbuild-server

index 88e4ae792e429f95da0a3e5603baa88f110128a0..2bba42a2f008da6654746bc9a0a9f6d12592879a 100755 (executable)
@@ -33,7 +33,6 @@ do
 done
 : ${buildroot=$HOME/build}
 : ${default_targets="wheezy-amd64 wheezy-i386"}
-: ${parallel=-j3}
 : ${DEB_BUILD_OPTIONS=parallel=4}; export DEB_BUILD_OPTIONS
 
 ###--------------------------------------------------------------------------
@@ -57,10 +56,24 @@ want_1 () {
   echo "$1"
 }
 
+run () {
+  case $notreally in
+    t) echo "+ $*" ;;
+    nil) "$@" ;;
+  esac
+}
+
+decor () {
+  tag=$1 marker=$2
+  while IFS= read -r line; do
+    printf "%-21s %c %s\n" "$tag" "$marker" "$line"
+  done
+}
+
 ###--------------------------------------------------------------------------
 ### Parse options.
 
-bogusp=nil archp=nil indepp=nil makeopts=""
+bogusp=nil archp=nil indepp=nil keepon=nil notreally=nil
 unset targets
 
 while getopts "haint:" opt; do
@@ -73,6 +86,7 @@ Options:
        -h              Show this help text.
        -a              Build only architecture-dependent packages.
        -i              Build only architecture-neutral packages.
+       -k              Keep going even if one fails.
        -n              Don't actually do the build.
        -t TARGET       Build in TARGET build environment.
 
@@ -91,7 +105,8 @@ EOF
       ;;
     a) archp=t ;;
     i) indepp=t ;;
-    n) makeopts="${makeopts+$makeopts }-n" ;;
+    k) keepon=t ;;
+    n) notreally=t ;;
     t) targets="${targets+$targets }$OPTARG" ;;
     *) bogusp=nil ;;
   esac
@@ -261,46 +276,35 @@ case "$#,$1" in
       done
     done
 
-    ## Build a cheesy makefile to run these in parallel.
-    cat >build.mk <<EOF
-### -*-makefile-*-
-DSC = $dsc
-FIRST = $first
-REST = $rest
-sbuild-wrap = \\
-       t=\$@; \\
-       host=\$\${t\#\#*/} full=\$\${t%/*}; \\
-       suite=\$\${full%%-*} target=\$\${full\#*-}; \\
-       { echo started >build-status.\$\$full; \\
-         sbuild \\
-               --extra-package=pkgs.\$\$target/ \\
-               --dist=\$\$suite --build=\$\$host --host=\$\$target \\
-               --chroot=\$\$suite-\$\$host --verbose \$1 \$(DSC); \\
-         rc=\$\$?; case \$\$rc in \\
-           0) echo ok >build-status.\$\$full ;; \\
-           *) echo failed rc=\$\$rc >build-status.\$\$full ;; \\
-         esac; } | \\
-       while IFS= read -r line; do \\
-         printf "%-21s | %s\n" "\$\$full" "\$\$line"; \\
-       done; \\
-       read st _ <build-status.\$\$full && \\
-       case \$\$st in ok) exit 0 ;; *) exit 1 ;; esac
-all: \$(FIRST) \$(REST)
-\$(FIRST):; \$(call sbuild-wrap,$firstopt)
-\$(REST):; \$(call sbuild-wrap,--no-arch-all)
-EOF
-
-    ## Make some marker files to say things are in progress.
-    for i in $first $rest; do echo "starting" >build-status.${i%/*}; done
-
-    ## And we're ready to go.
-    mkfifo pipeout
-    cat pipeout& catpid=$!
-    set +e; make -fbuild.mk $parallel $makeopts -k all >pipeout
-    rc=$?; set -e
-    wait $!
-    rm build.mk pipeout build-status.*
-    find . -maxdepth 1 -type l -exec rm {} \;
+    ## Build the builds sequentially.  Tests can conflict with each other,
+    ## e.g., over port numbers.
+    rc=0 buildopt=$firstopt
+    for t in $first $rest; do
+      host=${t##*/} full=${t%/*}
+      suite=${full%%-*} target=${full#*-}
+
+      ## And we're ready to go.
+      exec 3>&1
+      thisrc=$(
+       { { { { set +e
+               run sbuild --extra-package=$pkgs.$target \
+                   --dist=$suite --build=$host --host=$target \
+                   --chroot=$suite-$host --verbose $buildopt $dsc \
+                   3>&- 4>&- 5>&-
+               echo $? >&5
+             } |
+               decor "$full" "|" >&4; } 2>&1 |
+             decor "$full" "*" >&4; } 4>&1 |
+           cat -u >&3; } 5>&1 </dev/null)
+      exec 3>&-
+      case $thisrc in 0) ;;
+       *)
+         echo failed rc=$thisrc >$stat; rc=$thisrc
+         case $keepon in nil) break ;; esac
+         ;;
+      esac
+      buildopt=--no-arch-all
+    done
     exit $rc
     ;;
   build,*)