Skip to content

Commit 7cfe4de

Browse files
committed
add build label options
Signed-off-by: Jared Quick <jared.quick@salesforce.com>
1 parent 05ddf7d commit 7cfe4de

6 files changed

Lines changed: 120 additions & 19 deletions

File tree

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ Important: this only works when building a single service, an error will be gene
6464

6565
A list of KEY=VALUE that are passed through as build arguments when image is being built.
6666

67+
#### `labels` (build only, string or array)
68+
69+
A list of KEY=VALUE that are passed through as service labels when image is being built. These will be merged with any service labels defined in the compose file.
70+
6771
#### `env` or `environment` (run only, string or array)
6872

6973
A list of either KEY or KEY=VALUE that are passed through as environment variables to the container.
@@ -146,7 +150,7 @@ If set to `true` it will mount onto `/workdir`, unless `workdir` is set, in whic
146150

147151
Default: `false`
148152

149-
### `buildkit-inline-cache` (optional, build-only, boolean)
153+
#### `buildkit-inline-cache` (optional, build-only, boolean)
150154

151155
Whether to pass the `BUILDKIT_INLINE_CACHE=1` build arg when building an image. Can be safely used in combination with `args`.
152156

commands/build.sh

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,27 @@ for service_name in $(plugin_read_list BUILD) ; do
4343
image_name="" # no longer used here
4444

4545
cache_from=()
46-
cache_length=0
47-
4846
for cache_line in $(get_caches_for_service "$service_name"); do
4947
cache_from+=("$cache_line")
50-
cache_length=$((cache_length + 1))
5148
done
5249

53-
if [[ -n "${target}" ]] || [[ "${cache_length:-0}" -gt 0 ]]; then
54-
build_images+=("$service_name" "${image_name}" "${target}" "${cache_length}")
50+
labels=()
51+
while read -r label ; do
52+
[[ -n "${label:-}" ]] && labels+=("${label}")
53+
done <<< "$(plugin_read_list LABELS)"
5554

56-
if [[ "${cache_length:-0}" -gt 0 ]]; then
55+
if [[ -n "${target}" ]] || [[ "${#labels[@]}" -gt 0 ]] || [[ "${#cache_from[@]}" -gt 0 ]]; then
56+
build_images+=("$service_name" "${image_name}" "${target}")
57+
58+
build_images+=("${#cache_from[@]}")
59+
if [[ "${#cache_from[@]}" -gt 0 ]]; then
5760
build_images+=("${cache_from[@]}")
5861
fi
62+
63+
build_images+=("${#labels[@]}")
64+
if [[ "${#labels[@]}" -gt 0 ]]; then
65+
build_images+=("${labels[@]}")
66+
fi
5967
fi
6068
done
6169

commands/run.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ prebuilt_services=()
4343
for service_name in "${prebuilt_candidates[@]}" ; do
4444
if prebuilt_image=$(get_prebuilt_image "$service_name") ; then
4545
echo "~~~ :docker: Found a pre-built image for $service_name"
46-
prebuilt_service_overrides+=("$service_name" "$prebuilt_image" "" 0)
46+
prebuilt_service_overrides+=("$service_name" "$prebuilt_image" "" 0 0)
4747
prebuilt_services+=("$service_name")
4848

4949
# If it's prebuilt, we need to pull it down

lib/shared.bash

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,29 @@ function build_image_override_file_with_version() {
164164
service_name=$1
165165
image_name=$2
166166
target=$3
167-
cache_from_amt=$4
168-
shift 4
167+
shift 3
168+
169+
# load cache_from array
170+
cache_from=()
171+
if (( $# > 0 )); then
172+
cache_from_amt=$1
173+
shift
174+
while (( cache_from_amt-- > 0 )) ; do
175+
cache_from+=( "$1" ); shift
176+
done
177+
fi
178+
179+
# load labels array
180+
labels=()
181+
if (( $# > 0 )); then
182+
labels_amt=$1
183+
shift
184+
while (( labels_amt-- > 0 )) ; do
185+
labels+=( "$1" ); shift
186+
done
187+
fi
169188

170-
if [[ -z "$image_name" ]] && [[ -z "$target" ]] && [[ "$cache_from_amt" -eq 0 ]]; then
189+
if [[ -z "$image_name" ]] && [[ -z "$target" ]] && [[ "${#cache_from[@]}" -eq 0 ]] && [[ "${#labels[@]}" -eq 0 ]]; then
171190
# should not print out an empty service
172191
continue
173192
fi
@@ -178,15 +197,15 @@ function build_image_override_file_with_version() {
178197
printf " image: %s\\n" "$image_name"
179198
fi
180199

181-
if [[ "$cache_from_amt" -gt 0 ]] || [[ -n "$target" ]]; then
200+
if [[ "${#cache_from[@]}" -gt 0 ]] || [[ -n "$target" ]] || [[ "${#labels[@]}" -gt 0 ]]; then
182201
printf " build:\\n"
183202
fi
184203

185204
if [[ -n "$target" ]]; then
186205
printf " target: %s\\n" "$target"
187206
fi
188207

189-
if [[ "$cache_from_amt" -gt 0 ]] ; then
208+
if [[ "${#cache_from[@]}" -gt 0 ]] ; then
190209
if ! docker_compose_supports_cache_from "$version" ; then
191210
echo "Unsupported Docker Compose config file version: $version"
192211
echo "The 'cache_from' option can only be used with Compose file versions 2.2 or 3.2 and above."
@@ -196,10 +215,16 @@ function build_image_override_file_with_version() {
196215
fi
197216

198217
printf " cache_from:\\n"
199-
for cache_from_i in $(seq 1 "$cache_from_amt"); do
200-
printf " - %s\\n" "${!cache_from_i}"
218+
for cache_from_i in "${cache_from[@]}"; do
219+
printf " - %s\\n" "${cache_from_i}"
220+
done
221+
fi
222+
223+
if [[ "${#labels[@]}" -gt 0 ]] ; then
224+
printf " labels:\\n"
225+
for label in "${labels[@]}"; do
226+
printf " - %s\\n" "${label}"
201227
done
202-
shift "$cache_from_amt"
203228
fi
204229
done
205230
}
@@ -277,4 +302,4 @@ function validate_tag {
277302
else
278303
return 1
279304
fi
280-
}
305+
}

plugin.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ configuration:
6363
type: boolean
6464
graceful-shutdown:
6565
type: boolean
66+
labels:
67+
type: [ string, array ]
68+
minimum: 1
6669
leave-volumes:
6770
type: boolean
6871
mount-buildkite-agent:
@@ -150,6 +153,7 @@ configuration:
150153
environment: [ run ]
151154
expand-volume-vars: [ volumes ]
152155
graceful-shutdown: [ run ]
156+
labels: [ build ]
153157
leave-volumes: [ run ]
154158
mount-buildkite-agent: [ run ]
155159
mount-checkout: [ run ]

tests/image-override-file.bats

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ EOF
2929
)
3030

3131
run build_image_override_file_with_version "2.1" \
32-
"myservice1" "newimage1:1.0.0" "" 0 \
33-
"myservice2" "newimage2:1.0.0" "" 0
32+
"myservice1" "newimage1:1.0.0" "" 0 0 \
33+
"myservice2" "newimage2:1.0.0" "" 0 0
3434

3535
assert_success
3636
assert_output "$myservice_override_file2"
@@ -73,6 +73,66 @@ EOF
7373
assert_output "$myservice_override_file4"
7474
}
7575

76+
@test "Build a docker-compose file with labels" {
77+
myservice_override_file3=$(cat <<-EOF
78+
version: '3.2'
79+
services:
80+
myservice:
81+
image: newimage:1.0.0
82+
build:
83+
labels:
84+
- com.buildkite.test=test
85+
EOF
86+
)
87+
88+
run build_image_override_file_with_version "3.2" "myservice" "newimage:1.0.0" "" 0 1 "com.buildkite.test=test"
89+
90+
assert_success
91+
assert_output "$myservice_override_file3"
92+
}
93+
94+
@test "Build a docker-compose file with multiple labels" {
95+
myservice_override_file3=$(cat <<-EOF
96+
version: '3.2'
97+
services:
98+
myservice:
99+
image: newimage:1.0.0
100+
build:
101+
labels:
102+
- com.buildkite.test=test
103+
- com.buildkite.test2=test2
104+
EOF
105+
)
106+
107+
run build_image_override_file_with_version "3.2" "myservice" "newimage:1.0.0" "" 0 2 "com.buildkite.test=test" "com.buildkite.test2=test2"
108+
109+
assert_success
110+
assert_output "$myservice_override_file3"
111+
}
112+
113+
@test "Build a docker-compose file with multiple cache-from and multiple labels" {
114+
myservice_override_file3=$(cat <<-EOF
115+
version: '3.2'
116+
services:
117+
myservice:
118+
image: newimage:1.0.0
119+
build:
120+
cache_from:
121+
- my.repository/myservice:latest
122+
- my.repository/myservice:target
123+
labels:
124+
- com.buildkite.test=test
125+
- com.buildkite.test2=test2
126+
EOF
127+
)
128+
129+
run build_image_override_file_with_version "3.2" "myservice" "newimage:1.0.0" "" 2 "my.repository/myservice:latest" "my.repository/myservice:target" 2 "com.buildkite.test=test" "com.buildkite.test2=test2"
130+
131+
assert_success
132+
assert_output "$myservice_override_file3"
133+
}
134+
135+
76136
@test "Build a docker-compose file with cache-from and compose-file version 2" {
77137
run build_image_override_file_with_version "2" "myservice" "newimage:1.0.0" "" 1 "my.repository/myservice:latest"
78138

0 commit comments

Comments
 (0)