From 98057a2f292478fd3526dd033c6d3b37a23bd71b Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Mon, 16 Dec 2019 15:19:46 -0800 Subject: CI: always check if the base image can be pulled from Docker Hub --- scripts/check_dockerfiles.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index c84c61f..c2a7d47 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -74,13 +74,17 @@ 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" -elif master_commit="$( +fi + +# Though base image hasn't changed, it's still needed to build the venv. +# Even if the venv hasn't changed, the dev venv image is still needed to run +# the linter and tests. Therefore, the base image is also always needed. +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 since master." echo "##vso[task.setvariable variable=BASE_PULL;isOutput=true]True" fi -- cgit v1.2.3 From 80985b144d0afb2c6e06de0b66e9e54fb9421410 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Mon, 16 Dec 2019 15:27:32 -0800 Subject: CI: add more logging in check_dockerfiles.sh --- scripts/check_dockerfiles.sh | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index c2a7d47..b1f0e28 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -68,12 +68,17 @@ if git diff --quiet "${prev_commit}" -- docker/base.Dockerfile; then echo "##vso[task.setvariable variable=BASE_CHANGED;isOutput=true]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" +else + echo \ + "Changes detected in docker/venv.Dockerfile or the Pipfiles;" \ + "the venv image will be built." fi # Though base image hasn't changed, it's still needed to build the venv. @@ -87,4 +92,8 @@ if master_commit="$( then echo "Can pull base image from Docker Hub; no changes made since master." echo "##vso[task.setvariable variable=BASE_PULL;isOutput=true]True" +else + echo \ + "Cannot pull base image from Docker Hub due to detected changes;" \ + "the base image will be built." fi -- cgit v1.2.3 From fde1bfc72388672588941c595fb768ddbfa76ac9 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Mon, 16 Dec 2019 15:34:49 -0800 Subject: CI: update agent to Ubuntu 18.04 * Use inherit_errexit in check_dockerfiles.sh --- azure-pipelines.yml | 2 +- scripts/check_dockerfiles.sh | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'scripts/check_dockerfiles.sh') diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3559031..c5f033d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -5,7 +5,7 @@ jobs: displayName: 'Lint & Test' pool: - vmImage: 'ubuntu-16.04' + vmImage: 'ubuntu-18.04' steps: - task: ShellScript@2 diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index b1f0e28..53842e2 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -euo pipefail +shopt -s inherit_errexit exec 3>&1 # New file descriptor to stdout BASE_URL="https://dev.azure.com/\ @@ -13,8 +14,6 @@ repositoryId=${BUILD_REPOSITORY_NAME}&\ api-version=5.0" get_build() { - set -e # Poor Ubuntu LTS doesn't have Bash 4.4's inherit_errexit - local branch="${1:?"get_build: argument 1 'branch' is unset"}" local url="${BASE_URL}&branchName=${branch}" -- cgit v1.2.3 From 034e9a062071affdec3ee9f54bbfddb04a2f4b5c Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Fri, 21 Feb 2020 17:48:47 -0800 Subject: CI: diff base against master only if venv changed --- scripts/check_dockerfiles.sh | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index 53842e2..b3b5fe2 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -78,21 +78,19 @@ else echo \ "Changes detected in docker/venv.Dockerfile or the Pipfiles;" \ "the venv image will be built." -fi -# Though base image hasn't changed, it's still needed to build the venv. -# Even if the venv hasn't changed, the dev venv image is still needed to run -# the linter and tests. Therefore, the base image is also always needed. -if master_commit="$( - get_build "refs/heads/master" \ - | jq -re '.value[0].sourceVersion' - )" \ - && git diff --quiet "${master_commit}" -- docker/base.Dockerfile -then - echo "Can pull base image from Docker Hub; no changes made since master." - echo "##vso[task.setvariable variable=BASE_PULL;isOutput=true]True" -else - echo \ - "Cannot pull base image from Docker Hub due to detected changes;" \ - "the base image will be built." + # Though base image hasn't changed, it's still needed to build the venv. + if master_commit="$( + get_build "refs/heads/master" \ + | jq -re '.value[0].sourceVersion' + )" \ + && git diff --quiet "${master_commit}" -- docker/base.Dockerfile + then + echo "Can pull base image from Docker Hub; no changes since master." + echo "##vso[task.setvariable variable=BASE_PULL;isOutput=true]True" + else + echo \ + "Cannot pull base image from Docker Hub due to detected changes;" \ + "the base image will be built." + fi fi -- cgit v1.2.3 From f1d428785c5948cfb634e8b8c4783f4a26bc7039 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Fri, 21 Feb 2020 18:32:15 -0800 Subject: CI: don't use output variables It was initially used to enable access to variables across jobs, but the jobs will eventually be consolidated into one so output variables will no longer be needed. --- ci/build.yml | 5 ++--- scripts/check_dockerfiles.sh | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) (limited to 'scripts/check_dockerfiles.sh') diff --git a/ci/build.yml b/ci/build.yml index aa08436..a076431 100644 --- a/ci/build.yml +++ b/ci/build.yml @@ -1,7 +1,6 @@ steps: - task: ShellScript@2 displayName: 'Check If Images Need to Be Built' - name: check inputs: scriptPath: scripts/check_dockerfiles.sh disableAutoCwd: true @@ -23,7 +22,7 @@ steps: -t pythondiscord/snekbox-base:latest \ . displayName: 'Build Base Image' - condition: and(succeeded(), ne(variables['check.BASE_PULL'], 'True')) + condition: and(succeeded(), ne(variables.BASE_PULL, 'True')) # Build the venv image if it's had changes. - script: | @@ -32,4 +31,4 @@ steps: -t pythondiscord/snekbox-venv:latest \ . displayName: 'Build Virtual Environment Image' - condition: and(succeeded(), ne(variables['check.VENV_CHANGED'], 'False')) + condition: and(succeeded(), ne(variables.VENV_CHANGED, 'False')) diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index b3b5fe2..a0294b1 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -64,7 +64,7 @@ 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." @@ -73,7 +73,7 @@ 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" + echo "##vso[task.setvariable variable=VENV_CHANGED]False" else echo \ "Changes detected in docker/venv.Dockerfile or the Pipfiles;" \ @@ -87,7 +87,7 @@ else && git diff --quiet "${master_commit}" -- docker/base.Dockerfile then echo "Can pull base image from Docker Hub; no changes since master." - echo "##vso[task.setvariable variable=BASE_PULL;isOutput=true]True" + echo "##vso[task.setvariable variable=BASE_PULL]True" else echo \ "Cannot pull base image from Docker Hub due to detected changes;" \ -- cgit v1.2.3 From ed43d568651fc6c68e7aebd95680486ee95bc6f4 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Fri, 21 Feb 2020 21:25:31 -0800 Subject: CI: create a function to check if an image can be pulled --- scripts/check_dockerfiles.sh | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index a0294b1..f2b8512 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -32,6 +32,31 @@ get_build() { 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="$( @@ -80,17 +105,5 @@ else "the venv image will be built." # Though base image hasn't changed, it's still needed to build the venv. - if master_commit="$( - get_build "refs/heads/master" \ - | jq -re '.value[0].sourceVersion' - )" \ - && git diff --quiet "${master_commit}" -- docker/base.Dockerfile - then - echo "Can pull base image from Docker Hub; no changes since master." - echo "##vso[task.setvariable variable=BASE_PULL]True" - else - echo \ - "Cannot pull base image from Docker Hub due to detected changes;" \ - "the base image will be built." - fi + can_pull base docker/base.Dockerfile fi -- cgit v1.2.3 From 9e0b6e6f98ce0bf728dc12a5157a7fa273c62e62 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Fri, 21 Feb 2020 21:55:37 -0800 Subject: CI: check if venv image can be pulled --- scripts/check_dockerfiles.sh | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index f2b8512..df6049e 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -99,6 +99,12 @@ 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]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;" \ -- cgit v1.2.3 From 57cf063c0dfa6935088e96549d224ff50f56011f Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Sat, 22 Feb 2020 20:16:53 -0800 Subject: CI: cache the response from Azure API The script may need to use the master commit several times. The easiest way to implement the cache was to just cache the response rather than the commit hash. --- scripts/check_dockerfiles.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index df6049e..1764017 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -13,8 +13,17 @@ repositoryType=${BUILD_REPOSITORY_PROVIDER}&\ repositoryId=${BUILD_REPOSITORY_NAME}&\ api-version=5.0" +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' "${build_cache[$branch]}" + return 0 + fi + local url="${BASE_URL}&branchName=${branch}" printf '%s\n' "Retrieving the latest successful build using ${url}" >&3 @@ -28,6 +37,8 @@ get_build() { then return 1 else + # Cache the response + build_cache["${branch}"]="${response}" printf '%s' "${response}" fi } -- cgit v1.2.3 From 9cf62966c410acaf6912a2ecca75e82f07ea6937 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Sat, 22 Feb 2020 20:49:17 -0800 Subject: CI: fix unbound variable error when checking cache The array shouldn't be expanded when testing with -v. --- scripts/check_dockerfiles.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index 1764017..a94ccb4 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -19,7 +19,7 @@ get_build() { local branch="${1:?"get_build: argument 1 'branch' is unset"}" # Attempt to use cached value - if [[ -v "${build_cache[$branch]}" ]]; then + if [[ -v build_cache["${branch}"] ]]; then printf '%s' "${build_cache[$branch]}" return 0 fi -- cgit v1.2.3 From 736f9b1587061bbbabacb4ee65dc3b4989887d75 Mon Sep 17 00:00:00 2001 From: MarkKoz Date: Sat, 22 Feb 2020 20:54:08 -0800 Subject: CI: log when the build cache is used --- scripts/check_dockerfiles.sh | 1 + 1 file changed, 1 insertion(+) (limited to 'scripts/check_dockerfiles.sh') diff --git a/scripts/check_dockerfiles.sh b/scripts/check_dockerfiles.sh index a94ccb4..95c18cb 100755 --- a/scripts/check_dockerfiles.sh +++ b/scripts/check_dockerfiles.sh @@ -20,6 +20,7 @@ get_build() { # 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 -- cgit v1.2.3