Skip to content

Commit d9cb12f

Browse files
committed
chore: refactor the build workflow for operators
1 parent 26d779f commit d9cb12f

File tree

7 files changed

+249
-83
lines changed

7 files changed

+249
-83
lines changed

config/retired_files.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@
33
# This is uncommented as I had issues with everything being deleted when this was just present as an empty key.
44
# May be something to investigate.
55
retired_files:
6-
- .github/ISSUE_TEMPLATE/bug_report.yml
76
- .readme/static/borrowed/sdp_overview.png
8-
- bors.toml
7+
- .github/workflows/build.yml

config/versions.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@ python_version: 3.14
3030
# Usually the latest version should just work and as such the version here can
3131
# be bumped without any constraints.
3232
nix_pkg_manager_version: 2.30.0
33+
34+
jinja2_cli_version: 0.8.2
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
# =============
2+
# This file is automatically generated from the templates in stackabletech/operator-templating
3+
# DON'T MANUALLY EDIT THIS FILE
4+
# =============
5+
---
6+
name: Build {[ operator.name }] Artifacts
7+
8+
permissions: {}
9+
10+
on:
11+
push:
12+
branches:
13+
- main
14+
tags:
15+
- '[0-9][0-9].[0-9]+.[0-9]+-rc[0-9]+'
16+
- '[0-9][0-9].[0-9]+.[0-9]+'
17+
schedule:
18+
# Run every Saturday morning: https://crontab.guru/#15_3_*_*_6
19+
- cron: '15 3 * * 6'
20+
pull_request:
21+
paths:
22+
- '.github/workflows/build.yaml'
23+
- 'rust-toolchain.toml'
24+
- '.dockerignore'
25+
- 'deploy/**'
26+
- '.cargo/**'
27+
- 'docker/**'
28+
- 'Cargo.*'
29+
- '*.rs'
30+
31+
env:
32+
OPERATOR_NAME: "{[ operator.name }]"
33+
RUST_NIGHTLY_TOOLCHAIN_VERSION: "{[ rust_nightly_version }]"
34+
NIX_PKG_MANAGER_VERSION: "{[ nix_pkg_manager_version }]"
35+
RUST_TOOLCHAIN_VERSION: "{[ rust_version }]"
36+
HADOLINT_VERSION: "{[ hadolint_version }]"
37+
PYTHON_VERSION: "{[ python_version }]"
38+
CARGO_TERM_COLOR: always
39+
40+
jobs:
41+
cargo-udeps:
42+
name: Run cargo-udeps
43+
runs-on: ubuntu-latest
44+
env:
45+
RUSTC_BOOTSTRAP: 1
46+
steps:
47+
- name: Install host dependencies
48+
uses: awalsh128/cache-apt-pkgs-action@2c09a5e66da6c8016428a2172bd76e5e4f14bb17 # v1.5.3
49+
with:
50+
packages: protobuf-compiler krb5-user libkrb5-dev libclang-dev liblzma-dev libssl-dev pkg-config apt-transport-https
51+
version: ubuntu-latest
52+
53+
- name: Checkout Repository
54+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
55+
with:
56+
persist-credentials: false
57+
submodules: recursive
58+
59+
- name: Install Rust ${{ env.RUST_TOOLCHAIN_VERSION }} toolchain
60+
uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b
61+
with:
62+
toolchain: ${{ env.RUST_TOOLCHAIN_VERSION }}
63+
64+
- name: Setup Rust Cache
65+
uses: Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0 # v2.8.0
66+
with:
67+
cache-all-crates: "true"
68+
key: udeps
69+
70+
- name: Install cargo-udeps
71+
uses: stackabletech/cargo-install-action@8f7dbbcd2ebe22717efc132d0dd61e80841994b9 # cargo-udeps
72+
73+
- name: Run cargo-udeps
74+
run: cargo udeps --workspace --all-targets
75+
76+
build-container-image:
77+
name: Build/Publish ${{ matrix.runner.arch }} Image
78+
needs:
79+
- cargo-udeps
80+
permissions:
81+
id-token: write
82+
strategy:
83+
fail-fast: false
84+
matrix:
85+
runner:
86+
- { name: "ubuntu-latest", arch: "amd64" }
87+
- { name: "ubicloud-standard-8-arm", arch: "arm64" }
88+
runs-on: ${{ matrix.runner.name }}
89+
outputs:
90+
operator-version: ${{ steps.version.outputs.OPERATOR_VERSION }}
91+
steps:
92+
- name: Install host dependencies
93+
uses: awalsh128/cache-apt-pkgs-action@2c09a5e66da6c8016428a2172bd76e5e4f14bb17 # v1.5.3
94+
with:
95+
packages: protobuf-compiler krb5-user libkrb5-dev libclang-dev liblzma-dev libssl-dev pkg-config apt-transport-https
96+
version: ${{ matrix.runner.name }}
97+
98+
- name: Checkout Repository
99+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
100+
with:
101+
persist-credentials: false
102+
submodules: recursive
103+
104+
- name: Update/Extract Operator Version
105+
id: version
106+
if: github.event_name == 'pull_request'
107+
env:
108+
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
109+
PR_NUMBER: ${{ github.event.pull_request.number }}
110+
GITHUB_DEBUG: ${{ runner.debug }}
111+
shell: bash
112+
run: |
113+
set -euo pipefail
114+
[ -n "$GITHUB_DEBUG" ] && set -x
115+
CURRENT_VERSION=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[0].version')
116+
if [ "$PR_BASE_REF" == 'main' ]; then
117+
NEW_VERSION="0.0.0-pr$PR_NUMBER"
118+
else
119+
NEW_VERSION="$CURRENT_VERSION-pr$PR_NUMBER"
120+
fi
121+
sed -i "s/version = \"${CURRENT_VERSION}\"/version = \"${NEW_VERSION}\"/" Cargo.toml
122+
echo "OPERATOR_VERSION=$NEW_VERSION" | tee -a "$GITHUB_OUTPUT"
123+
- name: Install Nix
124+
uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
125+
126+
- name: Install Rust ${{ env.RUST_TOOLCHAIN_VERSION }} Toolchain
127+
uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b
128+
with:
129+
toolchain: ${{ env.RUST_TOOLCHAIN_VERSION }}
130+
131+
- name: Build Container Image
132+
id: build
133+
uses: stackabletech/actions/build-container-image@976e8c293cb59f391dbf8563ab28e965e79ca36d # v0.10.4
134+
with:
135+
image-name: ${{ env.OPERATOR_NAME }}
136+
image-index-manifest-tag: ${{ steps.version.outputs.OPERATOR_VERSION }}
137+
build-arguments: VERSION=${{ steps.version.outputs.OPERATOR_VERSION }}
138+
container-file: docker/Dockerfile
139+
140+
- name: Publish Container Image
141+
uses: stackabletech/actions/publish-image@976e8c293cb59f391dbf8563ab28e965e79ca36d # v0.10.4
142+
with:
143+
image-registry-uri: oci.stackable.tech
144+
image-registry-username: robot$sdp+github-action-build
145+
image-registry-password: ${{ secrets.HARBOR_ROBOT_SDP_GITHUB_ACTION_BUILD_SECRET }}
146+
image-repository: sdp/${{ env.OPERATOR_NAME }}
147+
image-manifest-tag: ${{ steps.build.outputs.image-manifest-tag }}
148+
source-image-uri: ${{ steps.build.outputs.image-manifest-uri }}
149+
150+
publish-index-manifest:
151+
name: Publish/Sign ${{ needs.build-container-image.outputs.operator-version }} Index
152+
needs:
153+
- build-container-image
154+
permissions:
155+
id-token: write
156+
runs-on: ubuntu-latest
157+
steps:
158+
- name: Checkout Repository
159+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
160+
with:
161+
persist-credentials: false
162+
163+
- name: Publish and Sign Image Index
164+
uses: stackabletech/actions/publish-image-index-manifest@976e8c293cb59f391dbf8563ab28e965e79ca36d # v0.10.4
165+
with:
166+
image-registry-uri: oci.stackable.tech
167+
image-registry-username: robot$sdp+github-action-build
168+
image-registry-password: ${{ secrets.HARBOR_ROBOT_SDP_GITHUB_ACTION_BUILD_SECRET }}
169+
image-repository: sdp/${{ env.OPERATOR_NAME }}
170+
image-index-manifest-tag: ${{ needs.build-container-image.outputs.operator-version }}
171+
172+
publish-helm-chart:
173+
name: Package/Publish ${{ needs.build-container-image.outputs.operator-version }} Helm Chart
174+
needs:
175+
- build-container-image
176+
permissions:
177+
id-token: write
178+
runs-on: ubuntu-latest
179+
steps:
180+
- name: Checkout Repository
181+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
182+
with:
183+
persist-credentials: false
184+
submodules: recursive
185+
186+
- name: Package, Publish, and Sign Helm Chart
187+
uses: stackabletech/actions/publish-helm-chart@976e8c293cb59f391dbf8563ab28e965e79ca36d # v0.10.4
188+
with:
189+
chart-registry-uri: oci.stackable.tech
190+
chart-registry-username: robot$sdp-charts+github-action-build
191+
chart-registry-password: ${{ secrets.HARBOR_ROBOT_SDP_CHARTS_GITHUB_ACTION_BUILD_SECRET }}
192+
chart-repository: sdp-charts
193+
chart-directory: deploy/helm/${{ env.OPERATOR_NAME }}
194+
chart-version: ${{ needs.build-container-image.outputs.operator-version }}
195+
app-version: ${{ needs.build-container-image.outputs.operator-version }}
196+
197+
openshift-preflight-check:
198+
name: Run OpenShift Preflight Check for ${{ needs.build-container-image.outputs.operator-version }}-${{ matrix.arch }}
199+
needs:
200+
- build-container-image
201+
- publish-index-manifest
202+
strategy:
203+
fail-fast: false
204+
matrix:
205+
arch:
206+
- amd64
207+
- arm64
208+
runs-on: ubuntu-latest
209+
steps:
210+
- name: Run OpenShift Preflight Check
211+
uses: stackabletech/actions/run-openshift-preflight@976e8c293cb59f391dbf8563ab28e965e79ca36d # v0.10.4
212+
with:
213+
image-index-uri: oci.stackable.tech/sdp/${{ env.OPERATOR_NAME }}:${{ needs.build-container-image.outputs.operator-version }}
214+
image-architecture: ${{ matrix.arch }}
215+
216+
notify:
217+
name: Failure Notification
218+
needs:
219+
- build-container-image
220+
- publish-index-manifest
221+
- publish-helm-chart
222+
runs-on: ubuntu-latest
223+
if: failure() || github.run_attempt > 1
224+
steps:
225+
- name: Checkout Repository
226+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
227+
with:
228+
persist-credentials: false
229+
230+
- name: Send Notification
231+
uses: stackabletech/actions/send-slack-notification@976e8c293cb59f391dbf8563ab28e965e79ca36d # v0.10.4
232+
with:
233+
publish-helm-chart-result: ${{ needs.publish-helm-chart.result }}
234+
publish-manifests-result: ${{ needs.publish-index-manifest.result }}
235+
build-result: ${{ needs.build-container-image.result }}
236+
slack-token: ${{ secrets.SLACK_CONTAINER_IMAGE_TOKEN }}
237+
channel-id: C07UG6JH44F # notifications-container-images
238+
type: container-image-build

template/.github/workflows/pr_pre-commit.yaml.j2

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ env:
1111
RUST_TOOLCHAIN_VERSION: "{[ rust_nightly_version }]"
1212
HADOLINT_VERSION: "{[ hadolint_version }]"
1313
PYTHON_VERSION: "{[ python_version }]"
14+
JINJA2_CLI_VERSION: "{[ jinja2_cli_version }]"
1415

1516
jobs:
1617
pre-commit:
@@ -33,3 +34,4 @@ jobs:
3334
hadolint: ${{ env.HADOLINT_VERSION }}
3435
nix: ${{ env.NIX_PKG_MANAGER_VERSION }}
3536
nix-github-token: ${{ secrets.GITHUB_TOKEN }}
37+
jinja2-cli: ${{ env.JINJA2_CLI_VERSION }}

template/.yamllint.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ rules:
1313
indentation:
1414
indent-sequences: consistent
1515
comments-indentation: disable # This is generally useless and interferes with commented example values
16+
braces:
17+
max-spaces-inside: 1
18+
max-spaces-inside-empty: 0

template/Makefile.j2

Lines changed: 1 addition & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,11 @@
99

1010
.PHONY: build publish
1111

12-
TAG := $(shell git rev-parse --short HEAD)
1312
OPERATOR_NAME := {[ operator.name }]
1413
VERSION := $(shell cargo metadata --format-version 1 | jq -r '.packages[] | select(.name=="stackable-${OPERATOR_NAME}") | .version')
15-
ARCH := $(shell uname -m | sed -e 's#x86_64#amd64#' | sed -e 's#aarch64#arm64#')
1614

1715
OCI_REGISTRY_HOSTNAME := oci.stackable.tech
1816
OCI_REGISTRY_PROJECT_IMAGES := sdp
19-
OCI_REGISTRY_PROJECT_CHARTS := sdp-charts
20-
# This will be overwritten by an environmental variable if called from the github action
21-
HELM_CHART_NAME := ${OPERATOR_NAME}
22-
HELM_CHART_ARTIFACT := target/helm/${OPERATOR_NAME}-${VERSION}.tgz
2317

2418
SHELL=/usr/bin/env bash -euo pipefail
2519

@@ -33,73 +27,6 @@ render-docs:
3327
docker-build:
3428
docker build --force-rm --build-arg VERSION=${VERSION} -t "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-${ARCH}" -f docker/Dockerfile .
3529

36-
docker-publish:
37-
# Push to Harbor
38-
# We need to use "value" here to prevent the variable from being recursively expanded by make (username contains a dollar sign, since it's a Harbor bot)
39-
docker login --username '${value OCI_REGISTRY_SDP_USERNAME}' --password '${OCI_REGISTRY_SDP_PASSWORD}' '${OCI_REGISTRY_HOSTNAME}'
40-
DOCKER_OUTPUT=$$(docker push --all-tags '${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}');\
41-
# Obtain the digest of the pushed image from the output of `docker push`, because signing by tag is deprecated and will be removed from cosign in the future\
42-
REPO_DIGEST_OF_IMAGE=$$(echo "$$DOCKER_OUTPUT" | awk '/^${VERSION}-${ARCH}: digest: sha256:[0-9a-f]{64} size: [0-9]+$$/ { print $$3 }');\
43-
if [ -z "$$REPO_DIGEST_OF_IMAGE" ]; then\
44-
echo 'Could not find repo digest for container image: ${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-${ARCH}';\
45-
exit 1;\
46-
fi;\
47-
# This generates a signature and publishes it to the registry, next to the image\
48-
# Uses the keyless signing flow with Github Actions as identity provider\
49-
cosign sign -y "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}@$$REPO_DIGEST_OF_IMAGE";\
50-
# Generate the SBOM for the operator image, this leverages the already generated SBOM for the operator binary by cargo-cyclonedx\
51-
syft scan --output [email protected]=sbom.json --select-catalogers "-cargo-auditable-binary-cataloger,+sbom-cataloger" --scope all-layers --source-name "${OPERATOR_NAME}" --source-version "${VERSION}-${ARCH}" "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}@$$REPO_DIGEST_OF_IMAGE";\
52-
# Determine the PURL for the container image\
53-
URLENCODED_REPO_DIGEST_OF_IMAGE=$$(echo "$$REPO_DIGEST_OF_IMAGE" | sed 's/:/%3A/g');\
54-
PURL="pkg:oci/${OPERATOR_NAME}@$$URLENCODED_REPO_DIGEST_OF_IMAGE?arch=${ARCH}&repository_url=${OCI_REGISTRY_HOSTNAME}%2F${OCI_REGISTRY_PROJECT_IMAGES}%2F${OPERATOR_NAME}";\
55-
# Get metadata from the image\
56-
IMAGE_DESCRIPTION=$$(docker inspect --format='{{.Config.Labels.description}}' "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-${ARCH}");\
57-
IMAGE_NAME=$$(docker inspect --format='{{.Config.Labels.name}}' "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-${ARCH}");\
58-
# Merge the SBOM with the metadata for the operator\
59-
jq -s '{"metadata":{"component":{"description":"'"$$IMAGE_NAME. $$IMAGE_DESCRIPTION"'","supplier":{"name":"Stackable GmbH","url":["https://stackable.tech/"]},"author":"Stackable GmbH","purl":"'"$$PURL"'","publisher":"Stackable GmbH"}}} * .[0]' sbom.json > sbom.merged.json;\
60-
# Attest the SBOM to the image\
61-
cosign attest -y --predicate sbom.merged.json --type cyclonedx "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}@$$REPO_DIGEST_OF_IMAGE"
62-
63-
# This assumes "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-amd64 and "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-arm64 are built and pushed
64-
docker-manifest-list-build:
65-
docker manifest create "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}" --amend "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-amd64" --amend "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}-arm64"
66-
67-
docker-manifest-list-publish:
68-
# Push to Harbor
69-
# We need to use "value" here to prevent the variable from being recursively expanded by make (username contains a dollar sign, since it's a Harbor bot)
70-
docker login --username '${value OCI_REGISTRY_SDP_USERNAME}' --password '${OCI_REGISTRY_SDP_PASSWORD}' '${OCI_REGISTRY_HOSTNAME}'
71-
DIGEST_HARBOR=$$(docker manifest push "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}");\
72-
# Refer to image via its digest (oci.stackable.tech/sdp/airflow@sha256:0a1b2c...);\
73-
# This generates a signature and publishes it to the registry, next to the image\
74-
# Uses the keyless signing flow with Github Actions as identity provider\
75-
cosign sign -y "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}@$$DIGEST_HARBOR"
76-
77-
# TODO remove if not used/needed
78-
docker: docker-build docker-publish
79-
80-
print-docker-tag:
81-
@echo "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_IMAGES}/${OPERATOR_NAME}:${VERSION}"
82-
83-
helm-publish:
84-
# Push to Harbor
85-
# We need to use "value" here to prevent the variable from being recursively expanded by make (username contains a dollar sign, since it's a Harbor bot)
86-
helm registry login --username '${value OCI_REGISTRY_SDP_CHARTS_USERNAME}' --password '${OCI_REGISTRY_SDP_CHARTS_PASSWORD}' '${OCI_REGISTRY_HOSTNAME}'
87-
# Obtain the digest of the pushed artifact from the output of `helm push`, because signing by tag is deprecated and will be removed from cosign in the future\
88-
HELM_OUTPUT=$$(helm push '${HELM_CHART_ARTIFACT}' 'oci://${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_CHARTS}' 2>&1);\
89-
REPO_DIGEST_OF_ARTIFACT=$$(echo "$$HELM_OUTPUT" | awk '/^Digest: sha256:[0-9a-f]{64}$$/ { print $$2 }');\
90-
if [ -z "$$REPO_DIGEST_OF_ARTIFACT" ]; then\
91-
echo 'Could not find repo digest for helm chart: ${HELM_CHART_NAME}';\
92-
exit 1;\
93-
fi;\
94-
# Login to Harbor, needed for cosign to be able to push the signature for the Helm chart\
95-
docker login --username '${value OCI_REGISTRY_SDP_CHARTS_USERNAME}' --password '${OCI_REGISTRY_SDP_CHARTS_PASSWORD}' '${OCI_REGISTRY_HOSTNAME}';\
96-
# This generates a signature and publishes it to the registry, next to the chart artifact\
97-
# Uses the keyless signing flow with Github Actions as identity provider\
98-
cosign sign -y "${OCI_REGISTRY_HOSTNAME}/${OCI_REGISTRY_PROJECT_CHARTS}/${HELM_CHART_NAME}@$$REPO_DIGEST_OF_ARTIFACT"
99-
100-
helm-package:
101-
mkdir -p target/helm && helm package --destination target/helm deploy/helm/${OPERATOR_NAME}
102-
10330
## Chart related targets
10431
compile-chart: version crds config
10532

@@ -133,14 +60,7 @@ regenerate-charts: chart-clean compile-chart
13360
regenerate-nix:
13461
nix run --extra-experimental-features "nix-command flakes" -f . regenerateNixLockfiles
13562

136-
build: regenerate-charts regenerate-nix helm-package docker-build
137-
138-
# This target is used by the CI
139-
# It doesn't make use of any nix dependencies and thus aviods building the
140-
# operator unnecessarily often.
141-
build-ci: regenerate-charts helm-package docker-build
142-
143-
publish: docker-publish helm-publish
63+
build: regenerate-charts regenerate-nix docker-build
14464

14565
check-nix:
14666
@which nix || (echo "Error: 'nix' is not installed. Please install it to proceed."; exit 1)

template/docker/Dockerfile.j2

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ FROM oci.stackable.tech/sdp/ubi9-rust-builder:latest AS builder
2121
FROM registry.access.redhat.com/ubi9/ubi-minimal:latest AS operator
2222

2323
ARG VERSION
24+
# NOTE (@Techassi): This is required for OpenShift/Red Hat certification
25+
# Keeping this as "1" seems to be fine since a couple of years /shrug
2426
ARG RELEASE="1"
2527

2628
# These are chosen at random and are this high on purpose to have very little chance to clash with an existing user or group on the host system

0 commit comments

Comments
 (0)