Bug 1319449 - Set -o pipefail and other robustness improvements for image_builder. r=dustin
authorJonas Finnemann Jensen <jopsen@gmail.com>
Tue, 22 Nov 2016 14:13:15 -0800
changeset 324018 18a7e57308ae6d6465d8bae3f9616720990ede75
parent 324017 e1b2579a01f370225f9e162528f29fe72658c764
child 324019 7ea3ad1ce937274bcd96a4490fc43120530ffd7f
push id24
push usermaklebus@msu.edu
push dateTue, 20 Dec 2016 03:11:33 +0000
reviewersdustin
bugs1319449
milestone53.0a1
Bug 1319449 - Set -o pipefail and other robustness improvements for image_builder. r=dustin MozReview-Commit-ID: 5oIdvcrScRt
testing/docker/image_builder/VERSION
testing/docker/image_builder/build-image.sh
--- a/testing/docker/image_builder/VERSION
+++ b/testing/docker/image_builder/VERSION
@@ -1,1 +1,1 @@
-1.1.0
+1.2.0
--- a/testing/docker/image_builder/build-image.sh
+++ b/testing/docker/image_builder/build-image.sh
@@ -1,15 +1,15 @@
 #!/bin/bash -vex
 
 # Set bash options to exit immediately if a pipeline exists non-zero, expand
 # print a trace of commands, and make output verbose (print shell input as it's
 # read)
 # See https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
-set -x -e -v
+set -x -e -v -o pipefail
 
 # Prefix errors with taskcluster error prefix so that they are parsed by Treeherder
 raise_error() {
   echo
   echo "[taskcluster-image-build:error] $1"
   exit 1
 }
 
@@ -45,19 +45,35 @@ curl -s --fail \
   | tee /tmp/docker-build.log \
   | jq -jr '(.status + .progress, .error | select(. != null) + "\n"), .stream | select(. != null)'
 
 # Exit non-zero if there is error entries in the log
 if cat /tmp/docker-build.log | jq -se 'add | .error' > /dev/null; then
   raise_error "Image build failed: `cat /tmp/docker-build.log | jq -rse 'add | .error'`";
 fi
 
+# Sanity check that image was built successfully
+if ! cat /tmp/docker-build.log | tail -n 1 | jq -r '.stream' | grep '^Successfully built' > /dev/null; then
+  echo 'docker-build.log for debugging:';
+  cat /tmp/docker-build.log | tail -n 50;
+  raise_error "Image build log didn't with 'Successfully built'";
+fi
+
 # Get image from docker daemon (try up to 10 times)
 # This interacts directly with the docker remote API, see:
 # https://docs.docker.com/engine/reference/api/docker_remote_api_v1.18/
+IMAGE_FILE=/home/worker/workspace/image.tar
 count=0
 while ! curl -s --fail -X GET  \
              --unix-socket /var/run/docker.sock "http:/images/$IMAGE_NAME:$HASH/get" \
-             | zstd -3 -c -o /home/worker/workspace/artifacts/image.tar.zst; do
+             -o "$IMAGE_FILE"; do
   ((c++)) && ((c==10)) && echo 'Failed to get image from docker' && exit 1;
   echo 'Waiting for image to be ready';
   sleep 5;
 done
+
+# Test that image was exported
+if [ ! -s "$IMAGE_FILE" ]; then
+  raise_error "Failed to export docker image";
+fi
+
+# Compress image with zst
+zstd -3 -c -o /home/worker/workspace/artifacts/image.tar.zst "$IMAGE_FILE"