@@ -113,21 +113,11 @@ jobs:
113113 build-and-push :
114114 needs : prepare
115115 if : needs.prepare.outputs.should_build == 'true'
116+ runs-on : ubuntu-latest
116117 permissions :
117118 contents : read
118119 packages : write
119120
120- strategy :
121- matrix :
122- include :
123- - platform : linux/amd64
124- runner : ubuntu-latest
125- - platform : linux/arm64
126- runner : ubuntu-24.04-arm64
127- fail-fast : false
128-
129- runs-on : ${{ matrix.runner }}
130-
131121 steps :
132122 - name : Checkout main repository
133123 uses : actions/checkout@v6
@@ -157,25 +147,21 @@ jobs:
157147 username : ${{ github.actor }}
158148 password : ${{ secrets.GITHUB_TOKEN }}
159149
160- - name : Set platform tag suffix
161- id : platform
162- run : |
163- PLATFORM="${{ matrix.platform }}"
164- SUFFIX="${PLATFORM//\//-}"
165- echo "suffix=$SUFFIX" >> $GITHUB_OUTPUT
150+ - name : Set up QEMU
151+ uses : docker/setup-qemu-action@v3
152+
153+ - name : Set up Docker Buildx
154+ uses : docker/setup-buildx-action@v3
166155
167156 - name : Extract metadata for Docker
168157 id : meta
169158 uses : docker/metadata-action@v5
170159 with :
171160 images : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
172161 tags : |
173- type=raw,value=latest-${{ steps.platform.outputs.suffix }},enable=${{ github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/main' }}
174- type=raw,value=${{ needs.prepare.outputs.tag_version }}-${{ steps.platform.outputs.suffix }},enable=${{ needs.prepare.outputs.tag_version != '' }}
175- type=sha,format=short,suffix=-${{ steps.platform.outputs.suffix }}
176-
177- - name : Set up Docker Buildx
178- uses : docker/setup-buildx-action@v3
162+ type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/main' }}
163+ type=raw,value=${{ needs.prepare.outputs.tag_version }},enable=${{ needs.prepare.outputs.tag_version != '' }}
164+ type=sha,format=short
179165
180166 - name : Build and push Docker image
181167 uses : docker/build-push-action@v6
@@ -187,48 +173,7 @@ jobs:
187173 labels : ${{ steps.meta.outputs.labels }}
188174 cache-from : type=gha
189175 cache-to : type=gha,mode=min
190- platforms : ${{ matrix.platform }}
191-
192- # Create multi-arch manifest after platform builds complete
193- create-manifest :
194- needs : [prepare, build-and-push]
195- if : needs.prepare.outputs.should_build == 'true' && github.event_name != 'pull_request'
196- runs-on : ubuntu-latest
197- permissions :
198- packages : write
199-
200- steps :
201- - name : Log in to GitHub Container Registry
202- uses : docker/login-action@v3
203- with :
204- registry : ${{ env.REGISTRY }}
205- username : ${{ github.actor }}
206- password : ${{ secrets.GITHUB_TOKEN }}
207-
208- - name : Create and push manifest
209- run : |
210- IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
211- TAG_VERSION="${{ needs.prepare.outputs.tag_version }}"
212-
213- # Create manifest for version tag if provided
214- if [ -n "$TAG_VERSION" ]; then
215- echo "Creating manifest for $TAG_VERSION..."
216- docker manifest create "${IMAGE}:${TAG_VERSION}" \
217- "${IMAGE}:${TAG_VERSION}-linux-amd64" \
218- "${IMAGE}:${TAG_VERSION}-linux-arm64"
219- docker manifest push "${IMAGE}:${TAG_VERSION}"
220- fi
221-
222- # Create manifest for latest if on main or workflow_dispatch
223- if [[ "${{ github.event_name }}" == "workflow_dispatch" || "${{ github.ref }}" == "refs/heads/main" ]]; then
224- echo "Creating manifest for latest..."
225- docker manifest create "${IMAGE}:latest" \
226- "${IMAGE}:latest-linux-amd64" \
227- "${IMAGE}:latest-linux-arm64"
228- docker manifest push "${IMAGE}:latest"
229- fi
230-
231- echo "✅ Multi-arch manifests created"
176+ platforms : linux/amd64,linux/arm64
232177
233178 # Retag unchanged agent forge from previous version when tag_version is provided
234179 # If source image doesn't exist (still building), falls back to full build
@@ -337,6 +282,10 @@ jobs:
337282 username : ${{ github.actor }}
338283 password : ${{ secrets.GITHUB_TOKEN }}
339284
285+ - name : Set up QEMU
286+ if : steps.retag-or-build.outputs.needs_build == 'true'
287+ uses : docker/setup-qemu-action@v3
288+
340289 - name : Set up Docker Buildx
341290 if : steps.retag-or-build.outputs.needs_build == 'true'
342291 uses : docker/setup-buildx-action@v3
@@ -352,12 +301,12 @@ jobs:
352301 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.prepare.outputs.tag_version }}
353302 cache-from : type=gha
354303 cache-to : type=gha,mode=min
355- platforms : linux/amd64
304+ platforms : linux/amd64,linux/arm64
356305
357306 # Notify release-finalize workflow when this CI completes (for final release builds only)
358307 notify-release :
359308 runs-on : ubuntu-latest
360- needs : [prepare, build-and-push, create-manifest, retag-unchanged]
309+ needs : [prepare, build-and-push, retag-unchanged]
361310 # Only notify for final releases (non-RC tags) - RC builds don't need release finalization
362311 if : |
363312 always() &&
@@ -371,15 +320,13 @@ jobs:
371320 run : |
372321 # Determine overall conclusion
373322 BUILD_RESULT="${{ needs.build-and-push.result }}"
374- MANIFEST_RESULT="${{ needs.create-manifest.result }}"
375323 RETAG_RESULT="${{ needs.retag-unchanged.result }}"
376324
377325 # Consider skipped as success (job conditions not met)
378326 if [[ "$BUILD_RESULT" == "skipped" ]]; then BUILD_RESULT="success"; fi
379- if [[ "$MANIFEST_RESULT" == "skipped" ]]; then MANIFEST_RESULT="success"; fi
380327 if [[ "$RETAG_RESULT" == "skipped" ]]; then RETAG_RESULT="success"; fi
381328
382- if [[ "$BUILD_RESULT" == "success" && "$MANIFEST_RESULT" == "success" && "$ RETAG_RESULT" == "success" ]]; then
329+ if [[ "$BUILD_RESULT" == "success" && "$RETAG_RESULT" == "success" ]]; then
383330 CONCLUSION="success"
384331 else
385332 CONCLUSION="failure"
0 commit comments