diff --git a/rebuild-image b/rebuild-image new file mode 100755 index 000000000..1842e572f --- /dev/null +++ b/rebuild-image @@ -0,0 +1,47 @@ +#!/bin/bash +# Rebuild a cached docker image if the input files have changed. +# Usage: ./rebuild-image + +set -eux + +IMAGENAME=$1 # no dashes in the name please! +IMAGEDIR=$2 +shift 2 + +INPUTFILES=$@ +CACHEDIR=$HOME/docker/ + +# Rebuild the image +rebuild() { + mkdir -p $CACHEDIR + rm $CACHEDIR/$IMAGENAME* || true + docker build -t $IMAGENAME $IMAGEDIR + docker save $IMAGENAME:latest > $CACHEDIR/image-$CIRCLE_SHA1 +} + +# Get the revision the cached image was build at +cached_image_rev() { + find $CACHEDIR -name '$IMAGENAME-*' -type f | sed 's/[^\-]*\-//' +} + +# Have there been any revision beween $1 and $2 +has_changes() { + local rev1=$1 + local rev2=$2 + local changes=$(git log --oneline $rev1..$rev2 -- $INPUTFILES | wc -l) + [ "$changes" -gt 0 ] +} + +cached_revision=$(cached_image_rev) +if [ -z "$cached_revision" ]; then + rebuild + exit 0 +fi + +if has_changes $cached_revision $CIRCLE_SHA1 ; then + rebuild + exit 0 +fi + +# we didn't rebuild; import cached version +docker load -i $CACHEDIR/$IMAGENAME-*