Skip to content

Commit 1af19fa

Browse files
committed
ci: move manifest create to script
Signed-off-by: Evan Wies <evan@neomantra.net>
1 parent d174e8d commit 1af19fa

3 files changed

Lines changed: 145 additions & 114 deletions

File tree

.github/workflows/docker-publish.yml

Lines changed: 2 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -335,85 +335,8 @@ jobs:
335335
password: ${{ secrets.DOCKER_PASSWORD }}
336336

337337
- name: Create and Push Manifest
338-
run: |
339-
# Define architectures for each flavor
340-
ARCHS="amd64 arm64"
341-
342-
# Add s390x for Ubuntu flavors
343-
if [[ "${{ matrix.flavor }}" == "bionic" || "${{ matrix.flavor }}" == "focal" || "${{ matrix.flavor }}" == "jammy" || "${{ matrix.flavor }}" == "noble" ]]; then
344-
ARCHS="$ARCHS s390x"
345-
fi
346-
347-
# Fedora only amd64
348-
if [[ "${{ matrix.flavor }}" == "fedora" ]]; then
349-
ARCHS="amd64"
350-
fi
351-
352-
# Construct source tags
353-
# We need to handle potential aliases (e.g. 1.2.3-1 -> 1.2.3)
354-
# The build job produces both tags for the images if the pattern matches.
355-
356-
declare -a PREFIXES=()
357-
if [[ "${{ github.ref_type }}" == "tag" ]]; then
358-
PREFIXES+=("${{ github.ref_name }}-")
359-
# Alias logic: Matches tags ending in single digit revision (e.g. -1)
360-
TAG_BASE=$(echo "${{ github.ref_name }}" | sed 's/-[0-9]$//')
361-
if [[ "$TAG_BASE" != "${{ github.ref_name }}" ]]; then
362-
PREFIXES+=("$TAG_BASE-")
363-
fi
364-
else
365-
# For master branch or other non-tags
366-
PREFIXES+=("")
367-
fi
338+
run: ./scripts/create-manifest.sh "${{ matrix.flavor }}" "${{ env.GHCR_IMAGE }}" "${{ env.DOCKERHUB_IMAGE }}" "${{ vars.ENABLE_DOCKERHUB_MIRROR }}"
368339

369-
for TAG_PREFIX in "${PREFIXES[@]}"; do
370-
SOURCES=""
371-
MIRROR_SOURCES=""
372-
373-
for ARCH in $ARCHS; do
374-
SOURCES="$SOURCES ${{ env.GHCR_IMAGE }}:${TAG_PREFIX}${{ matrix.flavor }}-$ARCH"
375-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
376-
MIRROR_SOURCES="$MIRROR_SOURCES ${{ env.DOCKERHUB_IMAGE }}:${TAG_PREFIX}${{ matrix.flavor }}-$ARCH"
377-
fi
378-
done
379-
380-
# Target Manifest Tag
381-
TARGET_TAG="${TAG_PREFIX}${{ matrix.flavor }}"
382-
383-
echo "Creating manifest $TARGET_TAG from $SOURCES"
384-
docker buildx imagetools create -t "${{ env.GHCR_IMAGE }}:$TARGET_TAG" $SOURCES
385-
386-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
387-
echo "Creating mirror manifest $TARGET_TAG"
388-
docker buildx imagetools create -t "${{ env.DOCKERHUB_IMAGE }}:$TARGET_TAG" $MIRROR_SOURCES
389-
fi
390-
391-
# Handle "latest" tag for bookworm on master
392-
if [[ "${{ matrix.flavor }}" == "bookworm" && "${{ github.ref }}" == "refs/heads/master" && "$TAG_PREFIX" == "" ]]; then
393-
echo "Tagging bookworm as latest"
394-
docker buildx imagetools create -t "${{ env.GHCR_IMAGE }}:latest" "${{ env.GHCR_IMAGE }}:bookworm"
395-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
396-
docker buildx imagetools create -t "${{ env.DOCKERHUB_IMAGE }}:latest" "${{ env.DOCKERHUB_IMAGE }}:bookworm"
397-
fi
398-
fi
399-
400-
# Create tag aliases (centos-rpm -> centos, fedora-rpm -> fedora)
401-
if [[ "${{ matrix.flavor }}" == "centos" ]]; then
402-
echo "Creating centos-rpm alias"
403-
docker buildx imagetools create -t "${{ env.GHCR_IMAGE }}:${TAG_PREFIX}centos-rpm" "${{ env.GHCR_IMAGE }}:$TARGET_TAG"
404-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
405-
docker buildx imagetools create -t "${{ env.DOCKERHUB_IMAGE }}:${TAG_PREFIX}centos-rpm" "${{ env.DOCKERHUB_IMAGE }}:$TARGET_TAG"
406-
fi
407-
fi
408-
409-
if [[ "${{ matrix.flavor }}" == "fedora" ]]; then
410-
echo "Creating fedora-rpm alias"
411-
docker buildx imagetools create -t "${{ env.GHCR_IMAGE }}:${TAG_PREFIX}fedora-rpm" "${{ env.GHCR_IMAGE }}:$TARGET_TAG"
412-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
413-
docker buildx imagetools create -t "${{ env.DOCKERHUB_IMAGE }}:${TAG_PREFIX}fedora-rpm" "${{ env.DOCKERHUB_IMAGE }}:$TARGET_TAG"
414-
fi
415-
fi
416-
done
417340

418341
build-fat:
419342
needs: manifest
@@ -546,39 +469,5 @@ jobs:
546469
password: ${{ secrets.DOCKER_PASSWORD }}
547470

548471
- name: Create and Push Manifest
549-
run: |
550-
ARCHS="amd64 arm64"
551-
552-
declare -a PREFIXES=()
553-
if [[ "${{ github.ref_type }}" == "tag" ]]; then
554-
PREFIXES+=("${{ github.ref_name }}-")
555-
# Alias logic: Matches tags ending in single digit revision (e.g. -1)
556-
TAG_BASE=$(echo "${{ github.ref_name }}" | sed 's/-[0-9]$//')
557-
if [[ "$TAG_BASE" != "${{ github.ref_name }}" ]]; then
558-
PREFIXES+=("$TAG_BASE-")
559-
fi
560-
else
561-
# For master branch or other non-tags
562-
PREFIXES+=("")
563-
fi
472+
run: ./scripts/create-manifest.sh "${{ matrix.flavor }}" "${{ env.GHCR_IMAGE }}" "${{ env.DOCKERHUB_IMAGE }}" "${{ vars.ENABLE_DOCKERHUB_MIRROR }}"
564473

565-
for TAG_PREFIX in "${PREFIXES[@]}"; do
566-
SOURCES=""
567-
MIRROR_SOURCES=""
568-
for ARCH in $ARCHS; do
569-
SOURCES="$SOURCES ${{ env.GHCR_IMAGE }}:${TAG_PREFIX}${{ matrix.flavor }}-$ARCH"
570-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
571-
MIRROR_SOURCES="$MIRROR_SOURCES ${{ env.DOCKERHUB_IMAGE }}:${TAG_PREFIX}${{ matrix.flavor }}-$ARCH"
572-
fi
573-
done
574-
575-
TARGET_TAG="${TAG_PREFIX}${{ matrix.flavor }}"
576-
577-
echo "Creating manifest $TARGET_TAG from $SOURCES"
578-
docker buildx imagetools create -t "${{ env.GHCR_IMAGE }}:$TARGET_TAG" $SOURCES
579-
580-
if [[ "${{ vars.ENABLE_DOCKERHUB_MIRROR }}" == "true" ]]; then
581-
echo "Creating mirror manifest $TARGET_TAG"
582-
docker buildx imagetools create -t "${{ env.DOCKERHUB_IMAGE }}:$TARGET_TAG" $MIRROR_SOURCES
583-
fi
584-
done

BUILDING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,5 +242,5 @@ The GitHub Actions to build is located in the [`.github/workflows/docker-publish
242242
End-To-End Tests
243243
================
244244

245-
The script [`./e2e/run-test.sh`](./e2e/run-test.sh) will stand up two local container registries and attempt to build all the images.
245+
The script [`./tests/e2e/run-test.sh`](./tests/e2e/run-test.sh) will stand up two local container registries and attempt to build all the images.
246246

scripts/create-manifest.sh

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# Usage: ./create-manifest.sh <flavor> <registry_image> <mirror_image> <mirror_enable_bool>
5+
# Example: ./create-manifest.sh alpine ghcr.io/owner/repo docker.io/owner/repo true
6+
7+
FLAVOR="$1"
8+
REGISTRY_IMAGE="$2"
9+
MIRROR_IMAGE="$3"
10+
ENABLE_MIRROR="$4"
11+
12+
# Validate inputs
13+
if [[ -z "$FLAVOR" ]]; then
14+
echo "Error: Flavor argument is missing."
15+
exit 1
16+
fi
17+
18+
if [[ -z "$REGISTRY_IMAGE" ]]; then
19+
echo "Error: Registry image argument is missing."
20+
exit 1
21+
fi
22+
23+
# Define architectures for each flavor
24+
# Default to amd64 and arm64
25+
ARCHS="amd64 arm64"
26+
27+
# Add s390x for Ubuntu flavors
28+
if [[ "$FLAVOR" == "bionic" || "$FLAVOR" == "focal" || "$FLAVOR" == "jammy" || "$FLAVOR" == "noble" ]]; then
29+
ARCHS="$ARCHS s390x"
30+
fi
31+
32+
# Fedora only supports amd64 in this setup
33+
if [[ "$FLAVOR" == "fedora" ]]; then
34+
ARCHS="amd64"
35+
fi
36+
37+
echo "Creating manifest for flavor: $FLAVOR (Architectures: $ARCHS)"
38+
39+
# Construct tag prefixes (handling git tags and aliases)
40+
declare -a PREFIXES=()
41+
if [[ "$GITHUB_REF_TYPE" == "tag" ]]; then
42+
TAG_NAME="$GITHUB_REF_NAME"
43+
PREFIXES+=("${TAG_NAME}-")
44+
45+
# Aliasing logic: Matches tags ending in single digit revision (e.g. 1.2.1-1 -> 1.2.1)
46+
# If the tag matches the pattern (.*)-[0-9]$, we creates an alias for the base (group 1)
47+
if [[ "$TAG_NAME" =~ ^(.*)-[0-9]$ ]]; then
48+
TAG_BASE="${BASH_REMATCH[1]}"
49+
if [[ "$TAG_BASE" != "$TAG_NAME" ]]; then
50+
PREFIXES+=("${TAG_BASE}-")
51+
fi
52+
fi
53+
else
54+
# For master branch or other non-tags, we use an empty prefix to just tag as "flavor"
55+
PREFIXES+=("")
56+
fi
57+
58+
# Loop through each calculated tag prefix and create manifests
59+
for TAG_PREFIX in "${PREFIXES[@]}"; do
60+
SOURCES=""
61+
MIRROR_SOURCES=""
62+
63+
# Collect source images for all architectures
64+
for ARCH in $ARCHS; do
65+
SOURCES="$SOURCES ${REGISTRY_IMAGE}:${TAG_PREFIX}${FLAVOR}-${ARCH}"
66+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
67+
MIRROR_SOURCES="$MIRROR_SOURCES ${MIRROR_IMAGE}:${TAG_PREFIX}${FLAVOR}-${ARCH}"
68+
fi
69+
done
70+
71+
# Target Manifest Tag
72+
TARGET_TAG="${TAG_PREFIX}${FLAVOR}"
73+
74+
# 1. Create GHCR Manifest
75+
echo "Creating manifest ${REGISTRY_IMAGE}:$TARGET_TAG"
76+
# Note: docker buildx imagetools create automatically pushes the manifest to the registry.
77+
docker buildx imagetools create -t "${REGISTRY_IMAGE}:$TARGET_TAG" $SOURCES
78+
79+
# 2. Create Mirror Manifest (if enabled)
80+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
81+
echo "Creating mirror manifest ${MIRROR_IMAGE}:$TARGET_TAG"
82+
if [[ "$DRY_RUN" != "true" ]]; then
83+
docker buildx imagetools create -t "${MIRROR_IMAGE}:$TARGET_TAG" $MIRROR_SOURCES
84+
else
85+
echo "DRY RUN: docker buildx imagetools create -t \"${MIRROR_IMAGE}:$TARGET_TAG\" $MIRROR_SOURCES"
86+
fi
87+
fi
88+
89+
# 3. Handle specific "latest" tag logic for bookworm on master
90+
if [[ "$FLAVOR" == "bookworm" && "$GITHUB_REF" == "refs/heads/master" && "$TAG_PREFIX" == "" ]]; then
91+
echo "Tagging bookworm as latest"
92+
if [[ "$DRY_RUN" != "true" ]]; then
93+
docker buildx imagetools create -t "${REGISTRY_IMAGE}:latest" "${REGISTRY_IMAGE}:bookworm"
94+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
95+
docker buildx imagetools create -t "${MIRROR_IMAGE}:latest" "${MIRROR_IMAGE}:bookworm"
96+
fi
97+
else
98+
echo "DRY RUN: docker buildx imagetools create -t \"${REGISTRY_IMAGE}:latest\" \"${REGISTRY_IMAGE}:bookworm\""
99+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
100+
echo "DRY RUN: docker buildx imagetools create -t \"${MIRROR_IMAGE}:latest\" \"${MIRROR_IMAGE}:bookworm\""
101+
fi
102+
fi
103+
fi
104+
105+
# 4. Create compatibility aliases (centos-rpm -> centos, etc.)
106+
# Note: Logic slightly adjusted from YAML to be generic if needed,
107+
# but sticking to specific requested aliases for now.
108+
109+
if [[ "$FLAVOR" == "centos" ]]; then
110+
ALIAS_TAG="${TAG_PREFIX}centos-rpm"
111+
echo "Creating alias $ALIAS_TAG -> $TARGET_TAG"
112+
if [[ "$DRY_RUN" != "true" ]]; then
113+
docker buildx imagetools create -t "${REGISTRY_IMAGE}:$ALIAS_TAG" "${REGISTRY_IMAGE}:$TARGET_TAG"
114+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
115+
docker buildx imagetools create -t "${MIRROR_IMAGE}:$ALIAS_TAG" "${MIRROR_IMAGE}:$TARGET_TAG"
116+
fi
117+
else
118+
echo "DRY RUN: docker buildx imagetools create -t \"${REGISTRY_IMAGE}:$ALIAS_TAG\" \"${REGISTRY_IMAGE}:$TARGET_TAG\""
119+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
120+
echo "DRY RUN: docker buildx imagetools create -t \"${MIRROR_IMAGE}:$ALIAS_TAG\" \"${MIRROR_IMAGE}:$TARGET_TAG\""
121+
fi
122+
fi
123+
fi
124+
125+
if [[ "$FLAVOR" == "fedora" ]]; then
126+
ALIAS_TAG="${TAG_PREFIX}fedora-rpm"
127+
echo "Creating alias $ALIAS_TAG -> $TARGET_TAG"
128+
if [[ "$DRY_RUN" != "true" ]]; then
129+
docker buildx imagetools create -t "${REGISTRY_IMAGE}:$ALIAS_TAG" "${REGISTRY_IMAGE}:$TARGET_TAG"
130+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
131+
docker buildx imagetools create -t "${MIRROR_IMAGE}:$ALIAS_TAG" "${MIRROR_IMAGE}:$TARGET_TAG"
132+
fi
133+
else
134+
echo "DRY RUN: docker buildx imagetools create -t \"${REGISTRY_IMAGE}:$ALIAS_TAG\" \"${REGISTRY_IMAGE}:$TARGET_TAG\""
135+
if [[ "$ENABLE_MIRROR" == "true" ]]; then
136+
echo "DRY RUN: docker buildx imagetools create -t \"${MIRROR_IMAGE}:$ALIAS_TAG\" \"${MIRROR_IMAGE}:$TARGET_TAG\""
137+
fi
138+
fi
139+
fi
140+
done
141+
142+
echo "Manifest creation complete for $FLAVOR"

0 commit comments

Comments
 (0)