Skip to content

Commit 10c8305

Browse files
committed
fix(ci): load pinned dependency digests into kind
1 parent 29909e9 commit 10c8305

4 files changed

Lines changed: 114 additions & 10 deletions

File tree

scripts/ci/ci_assets_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,21 @@ func TestKindDependencyImageHelperPinsDigestReferences(t *testing.T) {
179179
}
180180
}
181181

182+
func TestKindDependencyImageHelperExposesLocalRuntimeTags(t *testing.T) {
183+
contents := string(readFile(t, repoPath("scripts", "ci", "dependency-images.sh")))
184+
185+
for _, want := range []string{
186+
`kind_runtime_image_ref()`,
187+
`DEFAULT_KIND_DATAPLANE_IMAGE="$(kind_runtime_image_ref "$DEFAULT_DATAPLANE_IMAGE")"`,
188+
`DEFAULT_KIND_DASHBOARD_IMAGE="$(kind_runtime_image_ref "$DEFAULT_DASHBOARD_IMAGE")"`,
189+
`:kind-`,
190+
} {
191+
if !strings.Contains(contents, want) {
192+
t.Fatalf("dependency image helper missing %q", want)
193+
}
194+
}
195+
}
196+
182197
func TestKindValidationEntrypointsResolvePinnedDependencyImages(t *testing.T) {
183198
for _, path := range []string{
184199
repoPath("scripts", "ci", "load-kind-images.sh"),
@@ -211,6 +226,34 @@ func TestKindValidationEntrypointsResolvePinnedDependencyImages(t *testing.T) {
211226
}
212227
}
213228

229+
func TestKindLoadHelpersResolveLocalRuntimeTags(t *testing.T) {
230+
loadContents := string(readFile(t, repoPath("scripts", "ci", "load-kind-images.sh")))
231+
for _, want := range []string{
232+
`KIND_DATAPLANE_IMAGE="${KIND_DATAPLANE_IMAGE:-$(kind_runtime_image_ref "$DATAPLANE_IMAGE")}"`,
233+
`KIND_DASHBOARD_IMAGE="${KIND_DASHBOARD_IMAGE:-$(kind_runtime_image_ref "$DASHBOARD_IMAGE")}"`,
234+
`docker tag "$dataplane_image_id" "$KIND_DATAPLANE_IMAGE"`,
235+
`docker tag "$dashboard_image_id" "$KIND_DASHBOARD_IMAGE"`,
236+
`kind load docker-image "$KIND_DATAPLANE_IMAGE" --name "$CLUSTER_NAME"`,
237+
`kind load docker-image "$KIND_DASHBOARD_IMAGE" --name "$CLUSTER_NAME"`,
238+
} {
239+
if !strings.Contains(loadContents, want) {
240+
t.Fatalf("load-kind-images.sh missing %q", want)
241+
}
242+
}
243+
244+
deployContents := string(readFile(t, repoPath("scripts", "ci", "deploy-kind-conformance.sh")))
245+
for _, want := range []string{
246+
`KIND_DATAPLANE_IMAGE="${KIND_DATAPLANE_IMAGE:-$(kind_runtime_image_ref "$DATAPLANE_IMAGE")}"`,
247+
`KIND_DASHBOARD_IMAGE="${KIND_DASHBOARD_IMAGE:-$(kind_runtime_image_ref "$DASHBOARD_IMAGE")}"`,
248+
`kustomize edit set image "nantian-dataplane=$KIND_DATAPLANE_IMAGE"`,
249+
`kustomize edit set image "nantian-gw-dashboard=$KIND_DASHBOARD_IMAGE"`,
250+
} {
251+
if !strings.Contains(deployContents, want) {
252+
t.Fatalf("deploy-kind-conformance.sh missing %q", want)
253+
}
254+
}
255+
}
256+
214257
func TestReleaseWorkflowUsesCurrentCIEntrypoints(t *testing.T) {
215258
contents := string(readFile(t, repoPath(".github", "workflows", "release.yml")))
216259

scripts/ci/dependency-images.sh

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,37 @@
44
# These digests currently back the shared v2026.06.0-rc1 dependency release.
55
DEFAULT_DATAPLANE_IMAGE="ghcr.io/nantian-gw/dataplane@sha256:162a5c1b2166653b79684eb8ce25b0063c5d959d95e94e608f13eb04855c605f"
66
DEFAULT_DASHBOARD_IMAGE="ghcr.io/nantian-gw/dashboard@sha256:f913109dd5c964a48877de15797e1a2e9f08008e978c5ede53fc2ca9be8c601a"
7+
8+
sanitize_kind_tag_part() {
9+
local raw="${1:?tag component is required}"
10+
11+
raw="${raw//\//-}"
12+
raw="${raw//:/-}"
13+
raw="${raw//[^[:alnum:]_.-]/-}"
14+
15+
printf '%s' "$raw"
16+
}
17+
18+
kind_runtime_image_ref() {
19+
local image_ref="${1:?image reference is required}"
20+
local repository
21+
local suffix
22+
23+
if [[ "$image_ref" == *"@sha256:"* ]]; then
24+
repository="${image_ref%@sha256:*}"
25+
suffix="${image_ref##*@sha256:}"
26+
suffix="${suffix:0:12}"
27+
else
28+
repository="${image_ref%:*}"
29+
if [[ "$repository" == "$image_ref" ]]; then
30+
echo "image reference must include a tag or digest: $image_ref" >&2
31+
return 1
32+
fi
33+
suffix="$(sanitize_kind_tag_part "${image_ref##*:}")"
34+
fi
35+
36+
printf '%s:kind-%s\n' "$repository" "$suffix"
37+
}
38+
39+
DEFAULT_KIND_DATAPLANE_IMAGE="$(kind_runtime_image_ref "$DEFAULT_DATAPLANE_IMAGE")"
40+
DEFAULT_KIND_DASHBOARD_IMAGE="$(kind_runtime_image_ref "$DEFAULT_DASHBOARD_IMAGE")"

scripts/ci/deploy-kind-conformance.sh

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ source "$SCRIPT_DIR/dependency-images.sh"
88
CONTROLPLANE_IMAGE="${CONTROLPLANE_IMAGE:?CONTROLPLANE_IMAGE is required}"
99
DATAPLANE_IMAGE="${DATAPLANE_IMAGE:-$DEFAULT_DATAPLANE_IMAGE}"
1010
DASHBOARD_IMAGE="${DASHBOARD_IMAGE:-$DEFAULT_DASHBOARD_IMAGE}"
11+
KIND_DATAPLANE_IMAGE="${KIND_DATAPLANE_IMAGE:-$(kind_runtime_image_ref "$DATAPLANE_IMAGE")}"
12+
KIND_DASHBOARD_IMAGE="${KIND_DASHBOARD_IMAGE:-$(kind_runtime_image_ref "$DASHBOARD_IMAGE")}"
1113
CONFORMANCE_EXPERIMENTAL="${CONFORMANCE_EXPERIMENTAL:-${ALL_FEATURES:-false}}"
1214
TIMEOUT="${TIMEOUT:-300s}"
1315

@@ -34,8 +36,8 @@ rendered="$tmpdir/kind-conformance.yaml"
3436
(
3537
cd "$overlay"
3638
kustomize edit set image "nantian-controlplane=$CONTROLPLANE_IMAGE"
37-
kustomize edit set image "nantian-dataplane=$DATAPLANE_IMAGE"
38-
kustomize edit set image "nantian-gw-dashboard=$DASHBOARD_IMAGE"
39+
kustomize edit set image "nantian-dataplane=$KIND_DATAPLANE_IMAGE"
40+
kustomize edit set image "nantian-gw-dashboard=$KIND_DASHBOARD_IMAGE"
3941
)
4042

4143
if [[ "$CONFORMANCE_EXPERIMENTAL" == "true" ]]; then
@@ -58,10 +60,16 @@ if [[ "$CONFORMANCE_EXPERIMENTAL" == "true" ]]; then
5860
fi
5961

6062
kustomize build "$overlay" --load-restrictor LoadRestrictionsNone >"$rendered"
61-
if ! grep -F "image: $CONTROLPLANE_IMAGE" "$rendered" >/dev/null; then
62-
echo "rendered manifests do not use expected control-plane image: $CONTROLPLANE_IMAGE" >&2
63-
exit 1
64-
fi
63+
64+
for expected in \
65+
"image: $CONTROLPLANE_IMAGE" \
66+
"image: $KIND_DATAPLANE_IMAGE" \
67+
"image: $KIND_DASHBOARD_IMAGE"; do
68+
if ! grep -F "$expected" "$rendered" >/dev/null; then
69+
echo "rendered manifests do not use expected image: $expected" >&2
70+
exit 1
71+
fi
72+
done
6573

6674
kubectl apply -f "$rendered"
6775
kubectl wait --for=condition=ready pod --all -n nantian-gw --timeout="$TIMEOUT"

scripts/ci/load-kind-images.sh

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,34 @@ CLUSTER_NAME="${CLUSTER_NAME:?CLUSTER_NAME is required}"
99
CONTROLPLANE_IMAGE="${CONTROLPLANE_IMAGE:?CONTROLPLANE_IMAGE is required}"
1010
DATAPLANE_IMAGE="${DATAPLANE_IMAGE:-$DEFAULT_DATAPLANE_IMAGE}"
1111
DASHBOARD_IMAGE="${DASHBOARD_IMAGE:-$DEFAULT_DASHBOARD_IMAGE}"
12+
KIND_DATAPLANE_IMAGE="${KIND_DATAPLANE_IMAGE:-$(kind_runtime_image_ref "$DATAPLANE_IMAGE")}"
13+
KIND_DASHBOARD_IMAGE="${KIND_DASHBOARD_IMAGE:-$(kind_runtime_image_ref "$DASHBOARD_IMAGE")}"
1214

1315
docker pull "$DATAPLANE_IMAGE"
1416
docker pull "$DASHBOARD_IMAGE"
1517

18+
dataplane_image_id="$(docker image inspect --format '{{.Id}}' "$DATAPLANE_IMAGE")"
19+
dashboard_image_id="$(docker image inspect --format '{{.Id}}' "$DASHBOARD_IMAGE")"
20+
21+
# kind does not preserve digest-only refs as runnable names inside the node, so
22+
# retag pinned content to deterministic local refs before loading it.
23+
docker tag "$dataplane_image_id" "$KIND_DATAPLANE_IMAGE"
24+
docker tag "$dashboard_image_id" "$KIND_DASHBOARD_IMAGE"
25+
1626
kind load docker-image "$CONTROLPLANE_IMAGE" --name "$CLUSTER_NAME"
17-
kind load docker-image "$DATAPLANE_IMAGE" --name "$CLUSTER_NAME"
18-
kind load docker-image "$DASHBOARD_IMAGE" --name "$CLUSTER_NAME"
27+
kind load docker-image "$KIND_DATAPLANE_IMAGE" --name "$CLUSTER_NAME"
28+
kind load docker-image "$KIND_DASHBOARD_IMAGE" --name "$CLUSTER_NAME"
29+
30+
if [[ -n "${GITHUB_ENV:-}" ]]; then
31+
{
32+
echo "KIND_DATAPLANE_IMAGE=$KIND_DATAPLANE_IMAGE"
33+
echo "KIND_DASHBOARD_IMAGE=$KIND_DASHBOARD_IMAGE"
34+
} >>"$GITHUB_ENV"
35+
fi
1936

2037
echo "Loaded images into kind cluster $CLUSTER_NAME:"
2138
echo " controlplane: $CONTROLPLANE_IMAGE"
22-
echo " dataplane: $DATAPLANE_IMAGE"
23-
echo " dashboard: $DASHBOARD_IMAGE"
39+
echo " dataplane source: $DATAPLANE_IMAGE"
40+
echo " dataplane kind: $KIND_DATAPLANE_IMAGE"
41+
echo " dashboard source: $DASHBOARD_IMAGE"
42+
echo " dashboard kind: $KIND_DASHBOARD_IMAGE"

0 commit comments

Comments
 (0)