Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenDAS
dynamo
Commits
9f01dd25
"vscode:/vscode.git/clone" did not exist on "b2aa504b476241663e2d573acd9c346c5098e90e"
Unverified
Commit
9f01dd25
authored
Mar 13, 2026
by
Ran Rubin
Committed by
GitHub
Mar 13, 2026
Browse files
chore: multi-arch frontend image (#7290)
parent
57648c19
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
33 additions
and
30 deletions
+33
-30
.github/actions/docker-remote-build/action.yml
.github/actions/docker-remote-build/action.yml
+12
-5
.github/workflows/build-frontend-image.yaml
.github/workflows/build-frontend-image.yaml
+21
-25
No files found.
.github/actions/docker-remote-build/action.yml
View file @
9f01dd25
...
@@ -84,6 +84,13 @@ runs:
...
@@ -84,6 +84,13 @@ runs:
IMAGE_TAG="${{ inputs.image_tag }}"
IMAGE_TAG="${{ inputs.image_tag }}"
# Normalize platform: prepend linux/ only when not already present
PLATFORM_FLAG="${PLATFORM}"
if [[ "$PLATFORM_FLAG" != linux/* ]]; then
PLATFORM_FLAG="linux/${PLATFORM_FLAG}"
fi
# Sanitized platform for registry tags and filenames (no slashes or commas)
PLATFORM_SAFE=$(echo "${PLATFORM}" | sed 's|linux/||g; s/,/-/g')
CUDA_VERSION_MAJOR=${CUDA_VERSION%%.*}
CUDA_VERSION_MAJOR=${CUDA_VERSION%%.*}
...
@@ -94,7 +101,7 @@ runs:
...
@@ -94,7 +101,7 @@ runs:
# Create build logs directory
# Create build logs directory
mkdir -p build-logs
mkdir -p build-logs
BUILD_LOG_FILE="build-logs/build-${{ inputs.framework }}-${
{ inputs.platform }
}.log"
BUILD_LOG_FILE="build-logs/build-${{ inputs.framework }}-${
PLATFORM_SAFE
}.log"
echo "BUILD_LOG_FILE=${BUILD_LOG_FILE}" >> $GITHUB_ENV
echo "BUILD_LOG_FILE=${BUILD_LOG_FILE}" >> $GITHUB_ENV
echo "📝 Build log will be saved to: ${BUILD_LOG_FILE}"
echo "📝 Build log will be saved to: ${BUILD_LOG_FILE}"
...
@@ -102,7 +109,7 @@ runs:
...
@@ -102,7 +109,7 @@ runs:
# Set base cache args and set --cache-to if this is a main commit
# Set base cache args and set --cache-to if this is a main commit
CACHE_ARGS=""
CACHE_ARGS=""
if [[ "${{ inputs.target }}" != "frontend" ]]; then
if [[ "${{ inputs.target }}" != "frontend" ]]; then
CACHE_TAG="${{ inputs.framework }}-cuda${CUDA_VERSION_MAJOR}-${PLATFORM}-cache"
CACHE_TAG="${{ inputs.framework }}-cuda${CUDA_VERSION_MAJOR}-${PLATFORM
_SAFE
}-cache"
CACHE_ARGS="--cache-from type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG} "
CACHE_ARGS="--cache-from type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG} "
CACHE_ARGS+="--cache-from type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:release-${CACHE_TAG} "
CACHE_ARGS+="--cache-from type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:release-${CACHE_TAG} "
if [[ "$GITHUB_REF_NAME" =~ ^release ]]; then
if [[ "$GITHUB_REF_NAME" =~ ^release ]]; then
...
@@ -112,7 +119,7 @@ runs:
...
@@ -112,7 +119,7 @@ runs:
CACHE_ARGS+="--cache-to type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG},mode=max "
CACHE_ARGS+="--cache-to type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG},mode=max "
fi
fi
else
else
CACHE_TAG="${{ inputs.target }}-cuda${CUDA_VERSION_MAJOR}-${PLATFORM}-cache"
CACHE_TAG="${{ inputs.target }}-cuda${CUDA_VERSION_MAJOR}-${PLATFORM
_SAFE
}-cache"
CACHE_ARGS="--cache-from type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG} "
CACHE_ARGS="--cache-from type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG} "
if [[ "$GITHUB_REF_NAME" == "main" ]]; then
if [[ "$GITHUB_REF_NAME" == "main" ]]; then
CACHE_ARGS+="--cache-to type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG},mode=max "
CACHE_ARGS+="--cache-to type=registry,ref=${ECR_HOSTNAME}/ai-dynamo/dynamo:main-${CACHE_TAG},mode=max "
...
@@ -166,7 +173,7 @@ runs:
...
@@ -166,7 +173,7 @@ runs:
docker buildx build \
docker buildx build \
--progress=plain \
--progress=plain \
--tag "$IMAGE_TAG" \
--tag "$IMAGE_TAG" \
--platform
linux/${{ inputs.platform }}
\
--platform
"${PLATFORM_FLAG}"
\
-f ./container/rendered.Dockerfile \
-f ./container/rendered.Dockerfile \
$CACHE_ARGS $EXTRA_ARGS $SECRET_ARGS . 2>&1 | tee "${BUILD_LOG_FILE}"
$CACHE_ARGS $EXTRA_ARGS $SECRET_ARGS . 2>&1 | tee "${BUILD_LOG_FILE}"
...
@@ -236,7 +243,7 @@ runs:
...
@@ -236,7 +243,7 @@ runs:
echo "⚠️ No image tag available"
echo "⚠️ No image tag available"
fi
fi
PLATFORM_ARCH=$(echo "${{ inputs.platform }}" | sed 's
/
linux
\///
')
PLATFORM_ARCH=$(echo "${{ inputs.platform }}" | sed 's
|
linux
/||g; s/,/-/g
')
echo " Architecture: ${PLATFORM_ARCH}"
echo " Architecture: ${PLATFORM_ARCH}"
echo "PLATFORM_ARCH=${PLATFORM_ARCH}" >> $GITHUB_ENV
echo "PLATFORM_ARCH=${PLATFORM_ARCH}" >> $GITHUB_ENV
JOB_KEY="${{ inputs.framework }}-${PLATFORM_ARCH}"
JOB_KEY="${{ inputs.framework }}-${PLATFORM_ARCH}"
...
...
.github/workflows/build-frontend-image.yaml
View file @
9f01dd25
...
@@ -18,7 +18,7 @@ on:
...
@@ -18,7 +18,7 @@ on:
type
:
boolean
type
:
boolean
default
:
false
default
:
false
image_prefix
:
image_prefix
:
description
:
'
Optional
prefix
for
image
tags
(e.g.,
release-0.9.0).
When
set,
images
are
also
tagged
as
{prefix}-frontend
-{arch}
.'
description
:
'
Optional
prefix
for
image
tags
(e.g.,
release-0.9.0).
When
set,
images
are
also
tagged
as
{prefix}-frontend.'
required
:
false
required
:
false
type
:
string
type
:
string
default
:
'
'
default
:
'
'
...
@@ -124,11 +124,9 @@ jobs:
...
@@ -124,11 +124,9 @@ jobs:
name
:
Build Frontend Image
name
:
Build Frontend Image
needs
:
[
changed-files
,
build-epp-image
]
needs
:
[
changed-files
,
build-epp-image
]
if
:
needs.changed-files.outputs.frontend == 'true' || inputs.skip_change_detection ==
true
|| startsWith(github.ref_name, 'release/')
if
:
needs.changed-files.outputs.frontend == 'true' || inputs.skip_change_detection ==
true
|| startsWith(github.ref_name, 'release/')
strategy
:
fail-fast
:
false
matrix
:
arch
:
[
amd64
,
arm64
]
runs-on
:
prod-builder-v3
runs-on
:
prod-builder-v3
outputs
:
target_tag
:
${{ steps.calculate-target-tag.outputs.target_tag }}
env
:
env
:
IMAGE_REGISTRY
:
ai-dynamo
IMAGE_REGISTRY
:
ai-dynamo
IMAGE_REPOSITORY
:
dynamo
IMAGE_REPOSITORY
:
dynamo
...
@@ -136,6 +134,7 @@ jobs:
...
@@ -136,6 +134,7 @@ jobs:
TARGET
:
frontend
TARGET
:
frontend
CUDA_VERSION
:
"
12.9"
CUDA_VERSION
:
"
12.9"
FRAMEWORK
:
dynamo
FRAMEWORK
:
dynamo
PLATFORM
:
"
linux/amd64,linux/arm64"
steps
:
steps
:
-
name
:
Checkout repository
-
name
:
Checkout repository
uses
:
actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955
# v4.3.0
uses
:
actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955
# v4.3.0
...
@@ -146,7 +145,7 @@ jobs:
...
@@ -146,7 +145,7 @@ jobs:
python ./container/render.py \
python ./container/render.py \
--target=${{ env.TARGET }} \
--target=${{ env.TARGET }} \
--framework=${{ env.FRAMEWORK }} \
--framework=${{ env.FRAMEWORK }} \
--platform=${{
matrix.arch
}} \
--platform=${{
env.PLATFORM
}} \
--cuda-version=${{ env.CUDA_VERSION }} \
--cuda-version=${{ env.CUDA_VERSION }} \
--show-result \
--show-result \
--output-short-filename
--output-short-filename
...
@@ -155,7 +154,7 @@ jobs:
...
@@ -155,7 +154,7 @@ jobs:
shell
:
bash
shell
:
bash
run
:
|
run
:
|
ECR_IMAGE_BASE="${{ env.ECR_HOSTNAME }}/${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_REPOSITORY }}"
ECR_IMAGE_BASE="${{ env.ECR_HOSTNAME }}/${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_REPOSITORY }}"
TARGET_TAG="${{ github.sha }}-${{ env.TARGET
}}-${{ matrix.arch
}}"
TARGET_TAG="${{ github.sha }}-${{ env.TARGET }}"
echo "ecr_image_base=${ECR_IMAGE_BASE}" >> $GITHUB_OUTPUT
echo "ecr_image_base=${ECR_IMAGE_BASE}" >> $GITHUB_OUTPUT
echo "default_target_image_uri=${ECR_IMAGE_BASE}:${TARGET_TAG}" >> $GITHUB_OUTPUT
echo "default_target_image_uri=${ECR_IMAGE_BASE}:${TARGET_TAG}" >> $GITHUB_OUTPUT
echo "epp_image_uri=${{ env.ECR_HOSTNAME }}/${{ needs.build-epp-image.outputs.epp_image_ref }}" >> $GITHUB_OUTPUT
echo "epp_image_uri=${{ env.ECR_HOSTNAME }}/${{ needs.build-epp-image.outputs.epp_image_ref }}" >> $GITHUB_OUTPUT
...
@@ -167,7 +166,7 @@ jobs:
...
@@ -167,7 +166,7 @@ jobs:
echo "image_tag: ${{ steps.calculate-target-tag.outputs.default_target_image_uri }}"
echo "image_tag: ${{ steps.calculate-target-tag.outputs.default_target_image_uri }}"
echo "framework: ${{ env.FRAMEWORK }}"
echo "framework: ${{ env.FRAMEWORK }}"
echo "target: ${{ env.TARGET }}"
echo "target: ${{ env.TARGET }}"
echo "platform: ${{
matrix.arch
}}"
echo "platform: ${{
env.PLATFORM
}}"
echo "cuda_version: ${{ env.CUDA_VERSION }}"
echo "cuda_version: ${{ env.CUDA_VERSION }}"
echo "extra_tags: ${{ steps.calculate-target-tag.outputs.azure_target_image_uri }}"
echo "extra_tags: ${{ steps.calculate-target-tag.outputs.azure_target_image_uri }}"
echo "epp_image_uri: ${{ steps.calculate-target-tag.outputs.epp_image_uri }}"
echo "epp_image_uri: ${{ steps.calculate-target-tag.outputs.epp_image_uri }}"
...
@@ -185,7 +184,7 @@ jobs:
...
@@ -185,7 +184,7 @@ jobs:
with
:
with
:
builder_name
:
${{ needs.changed-files.outputs.builder_name }}
builder_name
:
${{ needs.changed-files.outputs.builder_name }}
flavor
:
general
flavor
:
general
arch
:
${{ matrix.arch }}
all_
arch
:
'
true'
-
name
:
Build Frontend Container
-
name
:
Build Frontend Container
id
:
build-image
id
:
build-image
timeout-minutes
:
30
timeout-minutes
:
30
...
@@ -194,7 +193,7 @@ jobs:
...
@@ -194,7 +193,7 @@ jobs:
image_tag
:
${{ steps.calculate-target-tag.outputs.default_target_image_uri }}
image_tag
:
${{ steps.calculate-target-tag.outputs.default_target_image_uri }}
framework
:
${{ env.FRAMEWORK }}
framework
:
${{ env.FRAMEWORK }}
target
:
${{ env.TARGET }}
target
:
${{ env.TARGET }}
platform
:
${{
matrix.arch
}}
platform
:
${{
env.PLATFORM
}}
cuda_version
:
${{ env.CUDA_VERSION }}
cuda_version
:
${{ env.CUDA_VERSION }}
aws_default_region
:
${{ secrets.AWS_DEFAULT_REGION }}
aws_default_region
:
${{ secrets.AWS_DEFAULT_REGION }}
sccache_s3_bucket
:
${{ secrets.SCCACHE_S3_BUCKET }}
sccache_s3_bucket
:
${{ secrets.SCCACHE_S3_BUCKET }}
...
@@ -205,15 +204,15 @@ jobs:
...
@@ -205,15 +204,15 @@ jobs:
extra_build_args
:
|
extra_build_args
:
|
EPP_IMAGE=${{ steps.calculate-target-tag.outputs.epp_image_uri }}
EPP_IMAGE=${{ steps.calculate-target-tag.outputs.epp_image_uri }}
extra_tags
:
|
extra_tags
:
|
${{
matrix.arch == 'amd64' &&
steps.calculate-target-tag.outputs.azure_target_image_uri
|| ''
}}
${{ steps.calculate-target-tag.outputs.azure_target_image_uri }}
${{ github.ref_name == 'main' && format('{0}:main-frontend
-{1}
', steps.calculate-target-tag.outputs.ecr_image_base
, matrix.arch
) || '' }}
${{ github.ref_name == 'main' && format('{0}:main-frontend', steps.calculate-target-tag.outputs.ecr_image_base) || '' }}
${{ github.ref_name == 'main' && format('{0}:main-frontend-{1}
-{2}
', steps.calculate-target-tag.outputs.ecr_image_base, github.sha
, matrix.arch
) || '' }}
${{ github.ref_name == 'main' && format('{0}:main-frontend-{1}', steps.calculate-target-tag.outputs.ecr_image_base, github.sha) || '' }}
${{ inputs.image_prefix != '' && format('{0}:{1}-frontend
-{2}
', steps.calculate-target-tag.outputs.ecr_image_base, inputs.image_prefix
, matrix.arch
) || '' }}
${{ inputs.image_prefix != '' && format('{0}:{1}-frontend', steps.calculate-target-tag.outputs.ecr_image_base, inputs.image_prefix) || '' }}
-
name
:
Show summary
-
name
:
Show summary
shell
:
bash
shell
:
bash
run
:
|
run
:
|
echo "###
🐳 ${{ env.FRAMEWORK }}-cuda${{ env.CUDA_VERSION }}-${{ matrix.arch }} Default Image
" >> $GITHUB_STEP_SUMMARY
echo "###
Frontend Image (multi-arch)
" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Image URI |" >> $GITHUB_STEP_SUMMARY
echo "| Image URI |" >> $GITHUB_STEP_SUMMARY
echo "|-----|" >> $GITHUB_STEP_SUMMARY
echo "|-----|" >> $GITHUB_STEP_SUMMARY
...
@@ -229,9 +228,13 @@ jobs:
...
@@ -229,9 +228,13 @@ jobs:
strategy
:
strategy
:
fail-fast
:
false
fail-fast
:
false
matrix
:
matrix
:
arch
:
[
amd64
,
arm64
]
include
:
-
arch
:
amd64
runner
:
prod-builder-amd-v1
-
arch
:
arm64
runner
:
prod-tester-arm-v1
name
:
Compliance frontend-${{ matrix.arch }}
name
:
Compliance frontend-${{ matrix.arch }}
runs-on
:
${{ matrix.
arch == 'amd64' && 'prod-builder-amd-v1' || 'prod-tester-arm-v1'
}}
runs-on
:
${{ matrix.
runner
}}
steps
:
steps
:
-
name
:
Checkout repository
-
name
:
Checkout repository
uses
:
actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955
# v4.3.0
uses
:
actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955
# v4.3.0
...
@@ -243,17 +246,10 @@ jobs:
...
@@ -243,17 +246,10 @@ jobs:
azure_acr_hostname
:
${{ secrets.AZURE_ACR_HOSTNAME }}
azure_acr_hostname
:
${{ secrets.AZURE_ACR_HOSTNAME }}
azure_acr_user
:
${{ secrets.AZURE_ACR_USER }}
azure_acr_user
:
${{ secrets.AZURE_ACR_USER }}
azure_acr_password
:
${{ secrets.AZURE_ACR_PASSWORD }}
azure_acr_password
:
${{ secrets.AZURE_ACR_PASSWORD }}
-
name
:
Calculate image URI
id
:
images
shell
:
bash
run
:
|
TARGET_TAG="${{ github.sha }}-frontend-${{ matrix.arch }}"
FRONTEND_IMAGE="${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_DEFAULT_REGION }}.amazonaws.com/ai-dynamo/dynamo:${TARGET_TAG}"
echo "frontend_image=${FRONTEND_IMAGE}" >> $GITHUB_OUTPUT
-
name
:
Compliance scan
-
name
:
Compliance scan
uses
:
./.github/actions/compliance-scan
uses
:
./.github/actions/compliance-scan
with
:
with
:
image
:
${{ s
teps.images.outputs.
frontend
_
image }}
image
:
${{ s
ecrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_DEFAULT_REGION }}.amazonaws.com/ai-dynamo/dynamo:${{ needs.build-
frontend
-
image
.outputs.target_tag
}}
artifact_name
:
compliance-frontend-${{ matrix.arch }}
artifact_name
:
compliance-frontend-${{ matrix.arch }}
framework
:
dynamo
framework
:
dynamo
target
:
frontend
target
:
frontend
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment