-
Notifications
You must be signed in to change notification settings - Fork 16
/
pre-command
executable file
·93 lines (81 loc) · 3.19 KB
/
pre-command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env bash
set -euo pipefail
# shellcheck source=lib/stdlib.bash
source "$(dirname "${BASH_SOURCE[0]}")/lib/stdlib.bash" || exit 67
source "$(dirname "${BASH_SOURCE[0]}")/lib/${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_REGISTRY_PROVIDER:-"ecr"}-registry-provider.bash" ||
log_fatal "Failed to source registry-provider. BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_REGISTRY_PROVIDER must be set to one of [ecr, gcr]" 67
login
configure_registry_for_image_if_necessary
image="$(get_registry_url)"
if [ -n "${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_DOCKERFILE_INLINE:-}" ]
then
[ -n "${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_DOCKERFILE:-}" ] &&
log_fatal "Cannot specify both 'dockerfile' and 'dockerfile-inline'."
# Put the Dockerfile into a temporary directory to work around
# https://github.com/docker/cli/issues/2249
docker_file_dir="$(mktemp -d)"
docker_file="${docker_file_dir}/Dockerfile"
echo "$BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_DOCKERFILE_INLINE" > "$docker_file"
context_dir="."
else
docker_file="${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_DOCKERFILE:-"Dockerfile"}"
context_dir="$(dirname "${docker_file}")"
docker_file_dir="${context_dir}"
fi
target="${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_TARGET:-}"
export_env_variable="${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_EXPORT_ENV_VARIABLE:-"BUILDKITE_PLUGIN_DOCKER_IMAGE"}"
exec 3>&1
tag="$(compute_tag "${docker_file}" 2>&3)"
context="${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_CONTEXT:-"${context_dir}"}"
build_args=()
read_build_args
secrets_args=()
read_secrets
if [ "${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_SKIP_PULL_FROM_CACHE:-}" == "true" ] && image_exists "$tag"; then
echo "Image exists, skipping pull"
else
echo "--- Pulling image"
if ! docker pull "${image}:${tag}"; then
echo '--- Building image'
image_build_args=(
"build"
"--file=${docker_file}"
"--tag=${image}:${tag}"
)
if [[ -n "${target:-}" ]]; then
image_build_args+=(
"--target=${target}"
)
fi
if [[ "${#build_args[@]}" -gt 0 ]]; then
for ba in "${build_args[@]}"; do
image_build_args+=(
"${ba}"
)
done
fi
if [[ "${#secrets_args[@]}" -gt 0 ]]; then
export DOCKER_BUILDKIT=1
for sa in "${secrets_args[@]}"; do
image_build_args+=(
"${sa}"
)
done
fi
echo "Inside $(pwd), running \`docker ${image_build_args[*]} ${context}\`"
# We can't quote BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_ADDITIONAL_BUILD_ARGS, because it's passed here as a string instead of a bash array.
# shellcheck disable=SC2086
docker "${image_build_args[@]}" ${BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_ADDITIONAL_BUILD_ARGS:-} "${context}" ||
log_fatal "^^^ +++" 1
docker tag "${image}:${tag}" "${image}:latest"
echo "--- Pushing tag ${tag}"
docker push "${image}:${tag}"
echo "--- Pushing tag latest"
docker push "${image}:latest"
fi || echo "Not found"
fi
# Support using https://github.com/buildkite-plugins/docker-buildkite-plugin without an image by default
export ${export_env_variable}="${image}:${tag}"
# Support programmatic use of cache image and tag values
export BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_EXPORT_IMAGE="${image}"
export BUILDKITE_PLUGIN_DOCKER_ECR_CACHE_EXPORT_TAG="${tag}"