diff options
author | 2020-02-22 21:59:15 -0800 | |
---|---|---|
committer | 2020-02-22 21:59:15 -0800 | |
commit | 0b5a6dd2f8d816b5b01caf848cb72692dc7978ed (patch) | |
tree | bce66c7562d8112da0f6191e18b8f0d563d51ebb /scripts/check_dockerfiles.sh | |
parent | Revert "Make lint errors on purpose" (diff) | |
parent | CI: output flake8 to stdout (resolve #37) (diff) |
Merge branch 'ci-improvements' into research
Diffstat (limited to 'scripts/check_dockerfiles.sh')
-rwxr-xr-x | scripts/check_dockerfiles.sh | 74 |
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 |