Skip to content

Commit 1ce3ea1

Browse files
committed
ci: verify canonical and compatibility image tags resolve to the same digest
1 parent 62e56bd commit 1ce3ea1

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

.github/workflows/build-publish-dev-images.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,39 @@ jobs:
8989
build-args: |
9090
CPU_ARCHITECTURE=${{ matrix.arch }}
9191
DOCKER_PLATFORM=${{ steps.meta.outputs.platform }}
92+
93+
- name: Verify Tag Aliases
94+
run: |
95+
CANONICAL_IMAGE="${{ steps.meta.outputs.repo }}:${{ steps.meta.outputs.tag }}"
96+
COMPAT_IMAGE="${{ steps.meta.outputs.repo }}:${{ steps.meta.outputs.compat_tag }}"
97+
TARGET_ARCH="${{ matrix.arch }}"
98+
99+
if [ "$TARGET_ARCH" = "x86_64" ]; then
100+
TARGET_ARCH="amd64"
101+
fi
102+
103+
resolve_digest() {
104+
IMAGE="$1"
105+
ARCH="$2"
106+
107+
docker manifest inspect "$IMAGE" | python3 -c "import json,sys; arch=sys.argv[1]; doc=json.load(sys.stdin); digest=doc.get('config', {}).get('digest', ''); manifests=doc.get('manifests', []); print(digest or next((m.get('digest', '') for m in manifests if m.get('platform', {}).get('os') == 'linux' and m.get('platform', {}).get('architecture') == arch), ''))" "$ARCH"
108+
}
109+
110+
CANONICAL_DIGEST=$(resolve_digest "$CANONICAL_IMAGE" "$TARGET_ARCH")
111+
COMPAT_DIGEST=$(resolve_digest "$COMPAT_IMAGE" "$TARGET_ARCH")
112+
113+
if [ -z "$CANONICAL_DIGEST" ] || [ -z "$COMPAT_DIGEST" ]; then
114+
echo "[FAIL] Unable to resolve digest for tag aliases"
115+
echo "canonical=$CANONICAL_IMAGE digest=$CANONICAL_DIGEST"
116+
echo "compat=$COMPAT_IMAGE digest=$COMPAT_DIGEST"
117+
exit 1
118+
fi
119+
120+
if [ "$CANONICAL_DIGEST" != "$COMPAT_DIGEST" ]; then
121+
echo "[FAIL] Tag aliases point to different images"
122+
echo "canonical=$CANONICAL_IMAGE digest=$CANONICAL_DIGEST"
123+
echo "compat=$COMPAT_IMAGE digest=$COMPAT_DIGEST"
124+
exit 1
125+
fi
126+
127+
echo "[OK] Tag aliases are in sync: $CANONICAL_DIGEST"

.github/workflows/build-publish-tag-images.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,42 @@ jobs:
8888
CPU_ARCHITECTURE=${{ matrix.arch }}
8989
DOCKER_PLATFORM=${{ steps.meta.outputs.platform }}
9090
91+
- name: Verify Tag Aliases
92+
run: |
93+
CANONICAL_IMAGE="${{ steps.meta.outputs.repo }}:${{ steps.meta.outputs.tag }}"
94+
COMPAT_IMAGE="${{ steps.meta.outputs.repo }}:${{ steps.meta.outputs.compat_tag }}"
95+
TARGET_ARCH="${{ matrix.arch }}"
96+
97+
if [ "$TARGET_ARCH" = "x86_64" ]; then
98+
TARGET_ARCH="amd64"
99+
fi
100+
101+
resolve_digest() {
102+
IMAGE="$1"
103+
ARCH="$2"
104+
105+
docker manifest inspect "$IMAGE" | python3 -c "import json,sys; arch=sys.argv[1]; doc=json.load(sys.stdin); digest=doc.get('config', {}).get('digest', ''); manifests=doc.get('manifests', []); print(digest or next((m.get('digest', '') for m in manifests if m.get('platform', {}).get('os') == 'linux' and m.get('platform', {}).get('architecture') == arch), ''))" "$ARCH"
106+
}
107+
108+
CANONICAL_DIGEST=$(resolve_digest "$CANONICAL_IMAGE" "$TARGET_ARCH")
109+
COMPAT_DIGEST=$(resolve_digest "$COMPAT_IMAGE" "$TARGET_ARCH")
110+
111+
if [ -z "$CANONICAL_DIGEST" ] || [ -z "$COMPAT_DIGEST" ]; then
112+
echo "[FAIL] Unable to resolve digest for tag aliases"
113+
echo "canonical=$CANONICAL_IMAGE digest=$CANONICAL_DIGEST"
114+
echo "compat=$COMPAT_IMAGE digest=$COMPAT_DIGEST"
115+
exit 1
116+
fi
117+
118+
if [ "$CANONICAL_DIGEST" != "$COMPAT_DIGEST" ]; then
119+
echo "[FAIL] Tag aliases point to different images"
120+
echo "canonical=$CANONICAL_IMAGE digest=$CANONICAL_DIGEST"
121+
echo "compat=$COMPAT_IMAGE digest=$COMPAT_DIGEST"
122+
exit 1
123+
fi
124+
125+
echo "[OK] Tag aliases are in sync: $CANONICAL_DIGEST"
126+
91127
- name: Export Layer ZIP
92128
run: |
93129
mkdir -p build

0 commit comments

Comments
 (0)