Skip to content

Commit 511d4ea

Browse files
authored
Produce multi arch images (#3321)
On release, produce a manifest image + images for 3 architectures: * AMD64 * ARM64 * s390x Signed-off-by: Nahshon Unna-Tsameret <[email protected]>
1 parent 9f04193 commit 511d4ea

14 files changed

+144
-60
lines changed

.github/workflows/build-push-images.yaml

+5-8
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,16 @@ jobs:
2222
REGISTRY_NAMESPACE: kubevirt
2323
OPM_VERSION: v1.47.0
2424
steps:
25+
- name: Set up QEMU
26+
uses: docker/setup-qemu-action@v3
2527
- name: Checkout the latest code
2628
uses: actions/checkout@v4
2729
with:
2830
ref: ${{ github.ref }}
2931
- name: Setup Go
3032
uses: actions/setup-go@v5
3133
with:
32-
go-version: "1.22"
34+
go-version-file: go.mod
3335
- name: Get latest version
3436
run: |
3537
PACKAGE_DIR="./deploy/olm-catalog/community-kubevirt-hyperconverged"
@@ -42,17 +44,12 @@ jobs:
4244
echo "IMAGE_TAG=${CSV_VERSION}-unstable" >> $GITHUB_ENV
4345
echo "UNSTABLE=UNSTABLE" >> $GITHUB_ENV
4446
45-
- name: Build Applications Images
46-
env:
47-
IMAGE_TAG: ${{ env.IMAGE_TAG }}
48-
run: |
49-
IMAGE_TAG=${IMAGE_TAG} make container-build
50-
- name: Push Application Images
47+
- name: Build and Push Applications Images
5148
env:
5249
IMAGE_TAG: ${{ env.IMAGE_TAG }}
5350
run: |
5451
make quay-login
55-
IMAGE_TAG=${IMAGE_TAG} make container-push
52+
IMAGE_TAG=${IMAGE_TAG} make build-push-multi-arch-images
5653
- name: Build Digester
5754
run: |
5855
(cd tools/digester && go build .)

.github/workflows/pr-sanity.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030

3131
- uses: actions/setup-go@v5
3232
with:
33-
go-version: "1.22" # The Go version to download (if necessary) and use.
33+
go-version-file: go.mod # The Go version to download (if necessary) and use.
3434

3535
- name: Do sanity checks
3636
run: make sanity

.github/workflows/publish-community-operators.yaml

+7-15
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ jobs:
1515
REGISTRY_NAMESPACE: kubevirt
1616
OPM_VERSION: v1.47.0
1717
steps:
18+
- name: Set up QEMU
19+
uses: docker/setup-qemu-action@v3
1820
- name: resolve the correct branch of the tag
1921
run: |
2022
GIT_TAG=${{ github.ref }}
@@ -32,7 +34,7 @@ jobs:
3234
- name: Setup Go
3335
uses: actions/setup-go@v5
3436
with:
35-
go-version: '1.22'
37+
go-version-file: go.mod
3638
- name: Checkout the latest code of ${{ env.TARGET_BRANCH }} branch
3739
uses: actions/checkout@v4
3840
with:
@@ -44,17 +46,12 @@ jobs:
4446
CSV_VERSION=$(ls -d ${PACKAGE_DIR}/*/ | sort -rV | awk "NR==1" | cut -d '/' -f 5)
4547
echo "CSV_VERSION=${CSV_VERSION}" >> $GITHUB_ENV
4648
echo "PACKAGE_DIR=${PACKAGE_DIR}" >> $GITHUB_ENV
47-
- name: Build Applications Images
48-
env:
49-
IMAGE_TAG: ${{ env.CSV_VERSION }}
50-
run: |
51-
IMAGE_TAG=${CSV_VERSION} make container-build
52-
- name: Push Application Images
49+
- name: Build and Push Applications Images
5350
env:
5451
IMAGE_TAG: ${{ env.CSV_VERSION }}
5552
run: |
5653
make quay-login
57-
IMAGE_TAG=${IMAGE_TAG} make container-push
54+
IMAGE_TAG=${CSV_VERSION} make build-push-multi-arch-images
5855
- name: Build Digester
5956
run: |
6057
(cd tools/digester && go build .)
@@ -93,16 +90,11 @@ jobs:
9390
echo "NEW_VERSION=${NEW_VERSION}" >> $GITHUB_ENV
9491
echo "NEW_IMAGE_TAG=${NEW_IMAGE_TAG}" >> $GITHUB_ENV
9592
96-
- name: Build Applications next version Images
97-
env:
98-
NEW_IMAGE_TAG: ${{ env.NEW_IMAGE_TAG }}
99-
run: |
100-
IMAGE_TAG=${NEW_IMAGE_TAG} make container-build
101-
- name: Push next version Application Images
93+
- name: Build and Push Applications next version Images
10294
env:
10395
NEW_IMAGE_TAG: ${{ env.NEW_IMAGE_TAG }}
10496
run: |
105-
IMAGE_TAG=${NEW_IMAGE_TAG} make container-push
97+
IMAGE_TAG=${NEW_IMAGE_TAG} make build-push-multi-arch-images
10698
- name: run manifest for next version
10799
env:
108100
PACKAGE_DIR: ${{ env.PACKAGE_DIR }}

Makefile

+33-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,16 @@ VIRT_ARTIFACTS_SERVER ?= $(REGISTRY_NAMESPACE)/virt-artifacts-server
1313
LDFLAGS ?= -w -s
1414
GOLANDCI_LINT_VERSION ?= v1.57.0
1515
HCO_BUMP_LEVEL ?= minor
16+
UNAME_ARCH := $(shell uname -m)
17+
ifeq ($(UNAME_ARCH),x86_64)
18+
TEMP_ARCH = amd64
19+
else ifeq ($(UNAME_ARCH),aarch64)
20+
TEMP_ARCH = arm64
21+
else
22+
TEMP_ARCH := $(UNAME_ARCH)
23+
endif
1624

25+
ARCH ?= $(TEMP_ARCH)
1726

1827
# Prow doesn't have docker command
1928
DO=./hack/in-docker.sh
@@ -88,11 +97,19 @@ hack-clean: ## Run ./hack/clean.sh
8897

8998
container-build: container-build-operator container-build-webhook container-build-operator-courier container-build-functest container-build-artifacts-server
9099

100+
build-push-multi-arch-images: build-push-multi-arch-operator-image build-push-multi-arch-webhook-image build-push-multi-arch-functest-image build-push-multi-arch-artifacts-server
101+
91102
container-build-operator:
92-
. "hack/cri-bin.sh" && $$CRI_BIN build -f build/Dockerfile -t $(IMAGE_REGISTRY)/$(OPERATOR_IMAGE):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
103+
. "hack/cri-bin.sh" && $$CRI_BIN build --platform=linux/$(ARCH) -f build/Dockerfile -t $(IMAGE_REGISTRY)/$(OPERATOR_IMAGE):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
104+
105+
build-push-multi-arch-operator-image:
106+
IMAGE_NAME=$(IMAGE_REGISTRY)/$(OPERATOR_IMAGE):$(IMAGE_TAG) SHA=SHA DOCKER_FILE=build/Dockerfile ./hack/build-push-multi-arch-images.sh
93107

94108
container-build-webhook:
95-
. "hack/cri-bin.sh" && $$CRI_BIN build -f build/Dockerfile.webhook -t $(IMAGE_REGISTRY)/$(WEBHOOK_IMAGE):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
109+
. "hack/cri-bin.sh" && $$CRI_BIN build --platform=linux/$(ARCH) -f build/Dockerfile.webhook -t $(IMAGE_REGISTRY)/$(WEBHOOK_IMAGE):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
110+
111+
build-push-multi-arch-webhook-image:
112+
IMAGE_NAME=$(IMAGE_REGISTRY)/$(WEBHOOK_IMAGE):$(IMAGE_TAG) SHA=$(SHA) DOCKER_FILE="build/Dockerfile.webhook" ./hack/build-push-multi-arch-images.sh
96113

97114
container-build-operator-courier:
98115
podman build -f tools/operator-courier/Dockerfile -t hco-courier .
@@ -101,11 +118,17 @@ container-build-validate-bundles:
101118
podman build -f tools/operator-sdk-validate/Dockerfile -t operator-sdk-validate-hco .
102119

103120
container-build-functest:
104-
. "hack/cri-bin.sh" && $$CRI_BIN build -f build/Dockerfile.functest -t $(IMAGE_REGISTRY)/$(FUNC_TEST_IMAGE):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
121+
. "hack/cri-bin.sh" && $$CRI_BIN build --platform=linux/$(ARCH) -f build/Dockerfile.functest -t $(IMAGE_REGISTRY)/$(FUNC_TEST_IMAGE):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
122+
123+
build-push-multi-arch-functest-image:
124+
IMAGE_NAME=$(IMAGE_REGISTRY)/$(FUNC_TEST_IMAGE):$(IMAGE_TAG) SHA=$(SHA) DOCKER_FILE="build/Dockerfile.functest" ./hack/build-push-multi-arch-images.sh
105125

106126
container-build-artifacts-server:
107127
podman build -f build/Dockerfile.artifacts -t $(IMAGE_REGISTRY)/$(VIRT_ARTIFACTS_SERVER):$(IMAGE_TAG) --build-arg git_sha=$(SHA) .
108128

129+
build-push-multi-arch-artifacts-server:
130+
IMAGE_NAME=$(IMAGE_REGISTRY)/$(VIRT_ARTIFACTS_SERVER):$(IMAGE_TAG) SHA=$(SHA) DOCKER_FILE="build/Dockerfile.artifacts" ./hack/build-push-multi-arch-images.sh
131+
109132
container-push: container-push-operator container-push-webhook container-push-functest container-push-artifacts-server
110133

111134
quay-login:
@@ -121,7 +144,7 @@ container-push-functest:
121144
. "hack/cri-bin.sh" && $$CRI_BIN push $$CRI_INSECURE $(IMAGE_REGISTRY)/$(FUNC_TEST_IMAGE):$(IMAGE_TAG)
122145

123146
container-push-artifacts-server:
124-
podman push $(IMAGE_REGISTRY)/$(VIRT_ARTIFACTS_SERVER):$(IMAGE_TAG)
147+
. "hack/cri-bin.sh" && $$CRI_BIN manifest push $(IMAGE_REGISTRY)/$(VIRT_ARTIFACTS_SERVER):$(IMAGE_TAG)
125148

126149
cluster-up:
127150
./cluster/up.sh
@@ -292,4 +315,9 @@ bump-hco:
292315
lint-monitoring \
293316
sanity \
294317
goimport \
295-
bump-hco
318+
bump-hco \
319+
build-push-multi-arch-operator-image \
320+
build-push-multi-arch-webhook-image \
321+
build-push-multi-arch-functest-image \
322+
build-push-multi-arch-artifacts-server \
323+
build-push-multi-arch-images

automation/nightly/test-nightly-build.sh

+8-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ wget -q https://dl.google.com/go/go1.22.6.linux-amd64.tar.gz
2222
tar -C /usr/local -xf go*.tar.gz
2323
export PATH=/usr/local/go/bin:$PATH
2424

25+
# add qemu-user-static
26+
$CRI_BIN run --rm --privileged docker.io/multiarch/qemu-user-static --reset -p yes
27+
2528
# get latest KubeVirt commit
2629
latest_kubevirt=$(curl -sL https://storage.googleapis.com/kubevirt-prow/devel/nightly/release/kubevirt/kubevirt/latest)
2730
latest_kubevirt_image=$(curl -sL "https://storage.googleapis.com/kubevirt-prow/devel/nightly/release/kubevirt/kubevirt/${latest_kubevirt}/kubevirt-operator.yaml" | grep 'OPERATOR_IMAGE' -A1 | tail -n 1 | sed 's/.*value: //g')
@@ -60,11 +63,13 @@ export IMAGE_TAG="nb_${build_date}_$(git show -s --format=%h)"
6063
export IMAGE_PREFIX=kubevirtci
6164
TEMP_OPERATOR_IMAGE=${IMAGE_PREFIX}/hyperconverged-cluster-operator
6265
TEMP_WEBHOOK_IMAGE=${IMAGE_PREFIX}/hyperconverged-cluster-webhook
66+
TEMP_DOWNLOAD_IMAGE=${IMAGE_PREFIX}/virt-artifacts-server
6367
CSV_OPERATOR_IMAGE=${IMAGE_REGISTRY}/${TEMP_OPERATOR_IMAGE}
6468
CSV_WEBHOOK_IMAGE=${IMAGE_REGISTRY}/${TEMP_WEBHOOK_IMAGE}
69+
CSV_DOWNLOAD_IMAGE=${IMAGE_REGISTRY}/${TEMP_DOWNLOAD_IMAGE}
6570

6671
# Build HCO & HCO Webhook
67-
OPERATOR_IMAGE=${TEMP_OPERATOR_IMAGE} WEBHOOK_IMAGE=${TEMP_WEBHOOK_IMAGE} make container-build-operator container-push-operator container-build-webhook container-push-webhook
72+
OPERATOR_IMAGE=${TEMP_OPERATOR_IMAGE} WEBHOOK_IMAGE=${TEMP_WEBHOOK_IMAGE} make build-push-multi-arch-operator-image build-push-multi-arch-webhook-image build-push-multi-arch-artifacts-server
6873

6974
# Update image digests
7075
sed -i "s#quay.io/kubevirt/virt-#${kv_image/-*/-}#" deploy/images.csv
@@ -76,9 +81,10 @@ export HCO_VERSION="${IMAGE_TAG}"
7681

7782
HCO_OPERATOR_IMAGE_DIGEST=$(tools/digester/digester --image ${CSV_OPERATOR_IMAGE}:${IMAGE_TAG})
7883
HCO_WEBHOOK_IMAGE_DIGEST=$(tools/digester/digester --image ${CSV_WEBHOOK_IMAGE}:${IMAGE_TAG})
84+
HCO_DOWNLOAD_IMAGE_DIGEST=$(tools/digester/digester --image ${CSV_DOWNLOAD_IMAGE}:${IMAGE_TAG})
7985

8086
# Build the CSV
81-
HCO_OPERATOR_IMAGE=${HCO_OPERATOR_IMAGE_DIGEST} HCO_WEBHOOK_IMAGE=${HCO_WEBHOOK_IMAGE_DIGEST} ./hack/build-manifests.sh
87+
HCO_OPERATOR_IMAGE=${HCO_OPERATOR_IMAGE_DIGEST} HCO_WEBHOOK_IMAGE=${HCO_WEBHOOK_IMAGE_DIGEST} HCO_DOWNLOADS_IMAGE=${HCO_DOWNLOAD_IMAGE_DIGEST} ./hack/build-manifests.sh
8288

8389
# Download OPM
8490
OPM_VERSION=v1.47.0

build/Dockerfile

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
FROM docker.io/golang:1.22.11 AS builder
1+
FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.11 AS builder
22

33
WORKDIR /go/src/github.com/kubevirt/hyperconverged-cluster-operator/
44
COPY . .
5-
RUN make build-operator build-csv-merger
5+
ARG TARGETOS
6+
ARG TARGETARCH
7+
8+
RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} make build-operator build-csv-merger
9+
10+
FROM --platform=${TARGETPLATFORM} registry.access.redhat.com/ubi9/ubi-minimal
11+
ARG TARGETPLATFORM
612

7-
FROM registry.access.redhat.com/ubi9/ubi-minimal
813
ENV OPERATOR=/usr/local/bin/hyperconverged-cluster-operator \
914
CSV_MERGER=/usr/local/bin/csv-merger \
1015
USER_UID=1001 \
@@ -29,4 +34,5 @@ ARG git_sha=NONE
2934

3035
LABEL multi.GIT_URL=${git_url} \
3136
multi.GIT_SHA=${git_sha} \
32-
app=hyperconverged-cluster-operator
37+
app=hyperconverged-cluster-operator \
38+
golang.build.platform=${TARGETPLATFORM}

build/Dockerfile.artifacts

+18-12
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
FROM registry.access.redhat.com/ubi9/nginx-120
2-
3-
WORKDIR /opt/app-root/src
4-
5-
COPY hack/config /tmp/config
6-
7-
USER 0
8-
RUN dnf -y install zip file && \
9-
sed '/^\s*listen\s*\[::\]:8080/d' /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.ipv4 && \
10-
sed '/^\s*listen\s*8080/d' /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.ipv6
11-
USER 1001
1+
FROM --platform=${BUILDPLATFORM} quay.io/centos/centos:stream9 as downloader
122

133
ARG download_url=https://github.com/kubevirt/kubevirt/releases/download
144

5+
COPY hack/config /tmp/config
6+
RUN dnf -y install zip file
157
RUN eval $(cat /tmp/config |grep KUBEVIRT_VERSION=) && \
168
echo "KUBEVIRT_VERSION: $KUBEVIRT_VERSION" && \
179
for arch in amd64 arm64 s390x; do \
@@ -39,11 +31,25 @@ RUN eval $(cat /tmp/config |grep KUBEVIRT_VERSION=) && \
3931
printf "\n\n### Downloading ${url}\n"; \
4032
curl --fail -L -o virtctl${extension} "${url}" && \
4133
file virtctl${extension} && \
42-
mkdir -p ./${arch}/${l_os} && ${archive_command} ./${arch}/${l_os}/virtctl${archive_extension} virtctl${extension} && rm virtctl${extension}; \
34+
mkdir -p ./bin/${arch}/${l_os} && ${archive_command} ./bin/${arch}/${l_os}/virtctl${archive_extension} virtctl${extension} && rm virtctl${extension}; \
4335
fi; \
4436
done; \
4537
done
4638

39+
FROM --platform=${TARGETPLATFORM} registry.access.redhat.com/ubi9/nginx-124
40+
ARG TARGETPLATFORM
41+
42+
WORKDIR /opt/app-root/src
43+
44+
COPY --from=downloader ./bin/ ./
45+
46+
USER 0
47+
RUN sed -i -E '/^ +location.*$/a\ }\n\n location = /health {\n access_log off;\n return 200;' /etc/nginx/nginx.conf && \
48+
sed '/^\s*listen\s*\[::\]:8080/d' /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.ipv4 && \
49+
sed '/^\s*listen\s*8080/d' /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.ipv6
50+
51+
USER 1001
52+
4753
ARG git_url=https://github.com/kubevirt/hyperconverged-cluster-operator.git
4854
ARG git_sha=NONE
4955

build/Dockerfile.functest

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
FROM docker.io/golang:1.22.11 AS builder
1+
FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.11 AS builder
22

33
WORKDIR /go/src/github.com/kubevirt/hyperconverged-cluster-operator/
44
COPY . .
5-
RUN make build-functest
65

7-
FROM registry.access.redhat.com/ubi9/ubi-minimal
6+
ARG TARGETARCH
7+
8+
RUN ARCH=${TARGETARCH} make build-functest
9+
10+
FROM --platform=${TARGETPLATFORM} registry.access.redhat.com/ubi9/ubi-minimal
11+
ARG TARGETPLATFORM
812

913
ENV USER_UID=1001 \
1014
TEST_OUT_PATH=/test
@@ -30,4 +34,5 @@ ARG git_sha=NONE
3034

3135
LABEL multi.GIT_URL=${git_url} \
3236
multi.GIT_SHA=${git_sha} \
33-
app=hyperconverged-cluster-functest
37+
app=hyperconverged-cluster-functest \
38+
golang.build.platform=${TARGETPLATFORM}

build/Dockerfile.webhook

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
FROM docker.io/golang:1.22.11 AS builder
1+
FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.11 AS builder
22

33
WORKDIR /go/src/github.com/kubevirt/hyperconverged-cluster-operator/
44
COPY . .
5-
RUN make build-webhook
65

7-
FROM registry.access.redhat.com/ubi9/ubi-minimal
6+
ARG TARGETOS
7+
ARG TARGETARCH
8+
9+
RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} make build-webhook
10+
11+
FROM --platform=${TARGETPLATFORM} registry.access.redhat.com/ubi9/ubi-minimal
12+
ARG TARGETPLATFORM
13+
814
ENV WEBHOOK=/usr/local/bin/hyperconverged-cluster-webhook \
915
USER_UID=1001 \
1016
USER_NAME=hyperconverged-cluster-webhook \
@@ -27,4 +33,5 @@ ARG git_sha=NONE
2733

2834
LABEL multi.GIT_URL=${git_url} \
2935
multi.GIT_SHA=${git_sha} \
30-
app=hyperconverged-cluster-webhook
36+
app=hyperconverged-cluster-webhook \
37+
golang.build.platform=${TARGETPLATFORM}

hack/build-index-image.sh

+10-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ BUNDLE_REGISTRY_IMAGE_NAME=${BUNDLE_REGISTRY_IMAGE_NAME:-hyperconverged-cluster-
2323
INDEX_REGISTRY_IMAGE_NAME=${INDEX_REGISTRY_IMAGE_NAME:-hyperconverged-cluster-index}
2424
OPM=${OPM:-opm}
2525
UNSTABLE=$2
26+
ARCHITECTURES="amd64 arm64 s390x"
2627

2728

2829
function create_index_image() {
@@ -48,8 +49,6 @@ function create_index_image() {
4849
BUNDLE_IMAGE_NAME=$("${PROJECT_ROOT}/tools/digester/digester" --image "${BUNDLE_IMAGE_NAME}")
4950

5051
create_file_based_catalog "${INITIAL_VERSION}" "${BUNDLE_IMAGE_NAME}" "${UNSTABLE}"
51-
52-
podman push "${INDEX_IMAGE_NAME}"
5352
}
5453

5554
function create_file_based_catalog() {
@@ -82,7 +81,15 @@ function create_file_based_catalog() {
8281
${OPM} validate fbc-catalog
8382
rm -f fbc-catalog.Dockerfile
8483
${OPM} generate dockerfile fbc-catalog
85-
podman build -t "${INDEX_IMAGE_NAME}" -f fbc-catalog.Dockerfile
84+
85+
IMAGES=
86+
for arch in ${ARCHITECTURES}; do
87+
podman build --platform="linux/${arch}" -t "${INDEX_IMAGE_NAME}-${arch}" -f fbc-catalog.Dockerfile
88+
IMAGES="${IMAGES} ${INDEX_IMAGE_NAME}-${arch}"
89+
done
90+
91+
podman manifest create "${INDEX_IMAGE_NAME}" ${IMAGES}
92+
podman manifest push "${INDEX_IMAGE_NAME}"
8693
}
8794

8895
function create_all_versions() {

0 commit comments

Comments
 (0)