Skip to content

Commit 87a6fc6

Browse files
committed
Build arm64 on native runner instead of QEMU emulation in beta publish
The emulated arm64 'npm install' (or build) intermittently fails with ECONNRESET under QEMU. Split the multi-arch build across native runners (amd64 on ubuntu-latest, arm64 on ubuntu-24.04-arm), push each platform by digest, then assemble the manifest list. Removes QEMU emulation from the build entirely.
1 parent f670ffd commit 87a6fc6

1 file changed

Lines changed: 63 additions & 10 deletions

File tree

.github/workflows/publishDockerBeta.yml

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,79 @@ on:
55
branches:
66
- beta
77

8+
env:
9+
IMAGE: tecokit/edge-ml_dataset-store_beta
10+
811
jobs:
9-
push_to_registry:
10-
name: Push Docker image to Docker Hub
11-
runs-on: ubuntu-latest
12+
build:
13+
name: Build (${{ matrix.platform }})
14+
runs-on: ${{ matrix.runner }}
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
include:
19+
- platform: linux/amd64
20+
runner: ubuntu-latest
21+
- platform: linux/arm64
22+
runner: ubuntu-24.04-arm
1223
steps:
24+
- name: Prepare platform pair
25+
run: |
26+
platform=${{ matrix.platform }}
27+
echo "PLATFORM_PAIR=${platform//\//-}" >> "$GITHUB_ENV"
1328
- name: Checkout
1429
uses: actions/checkout@v4
15-
- name: Set up QEMU
16-
uses: docker/setup-qemu-action@v3
1730
- name: Set up Docker Buildx
1831
uses: docker/setup-buildx-action@v3
1932
- name: Login to Docker Hub
2033
uses: docker/login-action@v3
2134
with:
2235
username: ${{ secrets.DOCKER_USERNAME }}
2336
password: ${{ secrets.DOCKER_PASSWORD }}
24-
- name: Build and push
25-
uses: docker/build-push-action@v5
37+
- name: Build and push by digest
38+
id: build
39+
uses: docker/build-push-action@v6
2640
with:
2741
context: .
28-
platforms: linux/amd64,linux/arm64,linux/aarch64
29-
push: true
30-
tags: tecokit/edge-ml_dataset-store_beta:latest
42+
platforms: ${{ matrix.platform }}
43+
outputs: type=image,name=${{ env.IMAGE }},push-by-digest=true,name-canonical=true,push=true
44+
- name: Export digest
45+
run: |
46+
mkdir -p "${{ runner.temp }}/digests"
47+
digest="${{ steps.build.outputs.digest }}"
48+
touch "${{ runner.temp }}/digests/${digest#sha256:}"
49+
- name: Upload digest
50+
uses: actions/upload-artifact@v4
51+
with:
52+
name: digests-${{ env.PLATFORM_PAIR }}
53+
path: ${{ runner.temp }}/digests/*
54+
if-no-files-found: error
55+
retention-days: 1
56+
57+
merge:
58+
name: Merge manifest and push
59+
runs-on: ubuntu-latest
60+
needs:
61+
- build
62+
steps:
63+
- name: Download digests
64+
uses: actions/download-artifact@v4
65+
with:
66+
path: ${{ runner.temp }}/digests
67+
pattern: digests-*
68+
merge-multiple: true
69+
- name: Set up Docker Buildx
70+
uses: docker/setup-buildx-action@v3
71+
- name: Login to Docker Hub
72+
uses: docker/login-action@v3
73+
with:
74+
username: ${{ secrets.DOCKER_USERNAME }}
75+
password: ${{ secrets.DOCKER_PASSWORD }}
76+
- name: Create manifest list and push
77+
working-directory: ${{ runner.temp }}/digests
78+
run: |
79+
docker buildx imagetools create -t "${{ env.IMAGE }}:latest" \
80+
$(printf '${{ env.IMAGE }}@sha256:%s ' *)
81+
- name: Inspect image
82+
run: |
83+
docker buildx imagetools inspect "${{ env.IMAGE }}:latest"

0 commit comments

Comments
 (0)