aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/check_dockerfiles.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/check_dockerfiles.sh')
-rwxr-xr-xscripts/check_dockerfiles.sh74
1 files changed, 55 insertions, 19 deletions
diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh
index d225267..95c18cb 100755
--- a/scripts/check_dockerfiles.sh
+++ b/scripts/check_dockerfiles.sh
@@ -1,6 +1,7 @@
#!/usr/bin/env bash
-set -euxo pipefail
+set -euo pipefail
+shopt -s inherit_errexit
exec 3>&1 # New file descriptor to stdout
BASE_URL="https://dev.azure.com/\
@@ -12,10 +13,18 @@ repositoryType=${BUILD_REPOSITORY_PROVIDER}&\
repositoryId=${BUILD_REPOSITORY_NAME}&\
api-version=5.0"
-get_build() {
- set -e # Poor Ubuntu LTS doesn't have Bash 4.4's inherit_errexit
+declare -A build_cache
+get_build() {
local branch="${1:?"get_build: argument 1 'branch' is unset"}"
+
+ # Attempt to use cached value
+ if [[ -v build_cache["${branch}"] ]]; then
+ printf '%s\n' "Retrieving build for ${branch} from cache." >&3
+ printf '%s' "${build_cache[$branch]}"
+ return 0
+ fi
+
local url="${BASE_URL}&branchName=${branch}"
printf '%s\n' "Retrieving the latest successful build using ${url}" >&3
@@ -29,10 +38,37 @@ get_build() {
then
return 1
else
+ # Cache the response
+ build_cache["${branch}"]="${response}"
printf '%s' "${response}"
fi
}
+can_pull() {
+ local image="${1:?"can_pull: argument 1 'image' is unset"}"
+
+ local master_commit
+ if master_commit="$(
+ get_build "refs/heads/master" \
+ | jq -re '.value[0].sourceVersion'
+ )" \
+ && git diff --quiet "${master_commit}" -- "${@:2}"
+ then
+ printf \
+ '%s\n' \
+ "Can pull ${image} image from Docker Hub; no changes since master."
+
+ printf '%s\n' "##vso[task.setvariable variable=${image^^}_PULL]True"
+ else
+ printf \
+ '%s\n' \
+ "Cannot pull ${image} image from Docker Hub due to detected " \
+ "changes; the ${image} image will be built."
+
+ return 1
+ fi
+}
+
# Get the previous commit
if [[ "${BUILD_REASON}" = "PullRequest" ]]; then
if ! prev_commit="$(
@@ -61,31 +97,31 @@ fi
# Compare diffs
head="$(git rev-parse HEAD)"
-printf \
- 'Comparing HEAD (%s) against %s (%s)\n' \
- "${head}" \
- "${prev_commit}" \
- "$(git rev-parse "${prev_commit}")"
+printf '%s\n' "Comparing HEAD (${head}) against ${prev_commit}."
if git diff --quiet "${prev_commit}" -- docker/base.Dockerfile; then
echo "No changes detected in docker/base.Dockerfile."
- echo "##vso[task.setvariable variable=BASE_CHANGED;isOutput=true]False"
+ echo "##vso[task.setvariable variable=BASE_CHANGED]False"
else
# Always rebuild the venv if the base changes.
+ echo "Changes detected in docker/base.Dockerfile; all images will be built."
exit 0
fi
if git diff --quiet "${prev_commit}" -- docker/venv.Dockerfile Pipfile*; then
echo "No changes detected in docker/venv.Dockerfile or the Pipfiles."
- echo "##vso[task.setvariable variable=VENV_CHANGED;isOutput=true]False"
- if master_commit="$(
- get_build "refs/heads/master" \
- | jq -re '.value[0].sourceVersion'
- )" \
- && git diff --quiet "${master_commit}" -- docker/base.Dockerfile
- then
- # Though base image hasn't changed, it's still needed to build the venv.
- echo "Can pull base image from Docker Hub; no changes made master."
- echo "##vso[task.setvariable variable=BASE_PULL;isOutput=true]True"
+ echo "##vso[task.setvariable variable=VENV_CHANGED]False"
+
+ if ! can_pull venv docker/venv.Dockerfile Pipfile*; then
+ # Venv image can't be pulled so it needs to be built.
+ # Therefore, the base image is needed too.
+ can_pull base docker/base.Dockerfile
fi
+else
+ echo \
+ "Changes detected in docker/venv.Dockerfile or the Pipfiles;" \
+ "the venv image will be built."
+
+ # Though base image hasn't changed, it's still needed to build the venv.
+ can_pull base docker/base.Dockerfile
fi