Skip to content

Commit e275f55

Browse files
committed
refactor: simplify multi-arch Docker build workflow using direct buildx push
1 parent b457e10 commit e275f55

1 file changed

Lines changed: 16 additions & 213 deletions

File tree

.github/workflows/docker-build.yml

Lines changed: 16 additions & 213 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@ env:
2626
IMAGE_NAME: aethersailor/rule-bot
2727

2828
jobs:
29-
# Job 1: 构建 amd64 架构
30-
build-amd64:
29+
# 构建并推送多架构镜像
30+
build-and-push:
3131
runs-on: ubuntu-latest
3232
permissions:
3333
contents: read
34-
outputs:
35-
tags: ${{ steps.meta.outputs.tags }}
34+
packages: write
3635

3736
steps:
3837
- name: Checkout repository
@@ -47,6 +46,13 @@ jobs:
4746
image=moby/buildkit:v0.12.0
4847
network=host
4948
49+
- name: Log in to Docker Hub
50+
uses: docker/login-action@v3
51+
with:
52+
registry: ${{ env.REGISTRY }}
53+
username: ${{ secrets.DOCKERHUB_USERNAME }}
54+
password: ${{ secrets.DOCKERHUB_TOKEN }}
55+
5056
- name: Extract metadata (tags, labels) for Docker
5157
id: meta
5258
uses: docker/metadata-action@v5
@@ -62,226 +68,23 @@ jobs:
6268
org.opencontainers.image.description=Telegram bot for rule management
6369
org.opencontainers.image.vendor=AetherSailor
6470
65-
- name: Build amd64 image
66-
uses: docker/build-push-action@v5
67-
with:
68-
context: .
69-
platforms: linux/amd64
70-
push: false
71-
outputs: type=docker,dest=/tmp/amd64.tar
72-
build-args: |
73-
BUILDKIT_INLINE_CACHE=1
74-
BUILDKIT_STEP_LOG_MAX_SIZE=10485760
75-
BUILDKIT_STEP_LOG_MAX_SPEED=10485760
76-
provenance: false
77-
78-
- name: Debug tags output
79-
run: |
80-
echo "Tags output: ${{ steps.meta.outputs.tags }}"
81-
TAGS="${{ steps.meta.outputs.tags }}"
82-
echo "Tags length: ${#TAGS}"
83-
84-
- name: Upload amd64 image
85-
uses: actions/upload-artifact@v4
86-
with:
87-
name: amd64-image
88-
path: /tmp/amd64.tar
89-
90-
# Job 2: 构建 arm64 架构
91-
build-arm64:
92-
runs-on: ubuntu-latest
93-
permissions:
94-
contents: read
95-
96-
steps:
97-
- name: Checkout repository
98-
uses: actions/checkout@v4
99-
with:
100-
fetch-depth: 1
101-
102-
- name: Set up Docker Buildx
103-
uses: docker/setup-buildx-action@v3
104-
with:
105-
driver-opts: |
106-
image=moby/buildkit:v0.12.0
107-
network=host
108-
109-
- name: Build arm64 image
71+
- name: Build and push multi-arch image
11072
uses: docker/build-push-action@v5
11173
with:
11274
context: .
113-
platforms: linux/arm64
114-
push: false
115-
outputs: type=docker,dest=/tmp/arm64.tar
75+
platforms: linux/amd64,linux/arm64
76+
push: true
77+
tags: ${{ steps.meta.outputs.tags }}
78+
labels: ${{ steps.meta.outputs.labels }}
11679
build-args: |
11780
BUILDKIT_INLINE_CACHE=1
11881
BUILDKIT_STEP_LOG_MAX_SIZE=10485760
11982
BUILDKIT_STEP_LOG_MAX_SPEED=10485760
12083
provenance: false
12184

122-
- name: Upload arm64 image
123-
uses: actions/upload-artifact@v4
124-
with:
125-
name: arm64-image
126-
path: /tmp/arm64.tar
127-
128-
# Job 3: 合并架构并推送到 Docker Hub
129-
push-multiarch:
130-
runs-on: ubuntu-latest
131-
needs: [build-amd64, build-arm64]
132-
permissions:
133-
contents: read
134-
packages: write
135-
136-
steps:
137-
- name: Set up Docker Buildx
138-
uses: docker/setup-buildx-action@v3
139-
with:
140-
driver-opts: |
141-
image=moby/buildkit:v0.12.0
142-
network=host
143-
144-
- name: Log in to Docker Hub
145-
uses: docker/login-action@v3
146-
with:
147-
registry: ${{ env.REGISTRY }}
148-
username: ${{ secrets.DOCKERHUB_USERNAME }}
149-
password: ${{ secrets.DOCKERHUB_TOKEN }}
150-
151-
- name: Download amd64 artifact
152-
uses: actions/download-artifact@v4
153-
with:
154-
name: amd64-image
155-
path: /tmp
156-
157-
- name: Download arm64 artifact
158-
uses: actions/download-artifact@v4
159-
with:
160-
name: arm64-image
161-
path: /tmp
162-
163-
- name: Load images
164-
run: |
165-
echo "Loading amd64 image..."
166-
docker load --input /tmp/amd64.tar
167-
echo "Loading arm64 image..."
168-
docker load --input /tmp/arm64.tar
169-
echo "Available images after loading:"
170-
docker images
171-
echo ""
172-
echo "All images with platform info:"
173-
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}"
174-
175-
- name: Debug information
176-
run: |
177-
echo "Available images:"
178-
docker images
179-
echo ""
180-
echo "Dangling images (our loaded images):"
181-
docker images --filter "dangling=true"
182-
echo ""
183-
echo "Tags from build-amd64: ${{ needs.build-amd64.outputs.tags }}"
184-
echo "Image name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
185-
186-
- name: Create and push multi-arch manifest
187-
run: |
188-
# 获取镜像标签
189-
TAGS="${{ needs.build-amd64.outputs.tags }}"
190-
echo "Processing tags: $TAGS"
191-
192-
if [ -z "$TAGS" ]; then
193-
echo "Error: No tags found!"
194-
exit 1
195-
fi
196-
197-
# 获取加载的镜像ID(排除buildkit镜像)
198-
IMAGE_IDS=$(docker images --format "{{.ID}}" --filter "dangling=true")
199-
echo "Found dangling images: $IMAGE_IDS"
200-
201-
AMD64_ID=""
202-
ARM64_ID=""
203-
204-
# 检查每个镜像的架构
205-
for img_id in $IMAGE_IDS; do
206-
echo "Inspecting image: $img_id"
207-
ARCH=$(docker inspect $img_id --format='{{.Architecture}}' 2>/dev/null || echo "unknown")
208-
echo "Image $img_id has architecture: $ARCH"
209-
210-
if [ "$ARCH" = "amd64" ]; then
211-
AMD64_ID=$img_id
212-
echo "Found amd64 image: $img_id"
213-
elif [ "$ARCH" = "arm64" ]; then
214-
ARM64_ID=$img_id
215-
echo "Found arm64 image: $img_id"
216-
fi
217-
done
218-
219-
echo "Final amd64 image ID: $AMD64_ID"
220-
echo "Final arm64 image ID: $ARM64_ID"
221-
222-
if [ -z "$AMD64_ID" ]; then
223-
echo "Error: amd64 image not found!"
224-
exit 1
225-
fi
226-
227-
if [ -z "$ARM64_ID" ]; then
228-
echo "Error: arm64 image not found!"
229-
exit 1
230-
fi
231-
232-
# 为每个架构创建标签并推送
233-
for tag in $TAGS; do
234-
echo "Processing tag: $tag"
235-
236-
# 使用临时标签推送各个架构的镜像
237-
TEMP_AMD64_TAG="${tag}-temp-amd64-$(date +%s)"
238-
TEMP_ARM64_TAG="${tag}-temp-arm64-$(date +%s)"
239-
240-
# 为 amd64 架构创建临时标签
241-
docker tag $AMD64_ID $TEMP_AMD64_TAG
242-
243-
# 为 arm64 架构创建临时标签
244-
docker tag $ARM64_ID $TEMP_ARM64_TAG
245-
246-
# 推送各个架构的镜像到Docker Hub
247-
echo "Pushing amd64 image with temporary tag: $TEMP_AMD64_TAG"
248-
docker push $TEMP_AMD64_TAG
249-
250-
echo "Pushing arm64 image with temporary tag: $TEMP_ARM64_TAG"
251-
docker push $TEMP_ARM64_TAG
252-
253-
# 创建多架构 manifest
254-
echo "Creating multi-arch manifest for tag: $tag"
255-
docker manifest create $tag $TEMP_AMD64_TAG $TEMP_ARM64_TAG
256-
257-
# 推送到 Docker Hub
258-
echo "Pushing multi-arch manifest for tag: $tag"
259-
docker manifest push $tag
260-
261-
# 删除Docker Hub上的临时镜像
262-
echo "Deleting temporary images from Docker Hub"
263-
# 提取临时标签名(去掉仓库前缀)
264-
TEMP_AMD64_TAG_NAME=$(echo $TEMP_AMD64_TAG | sed 's/.*\///')
265-
TEMP_ARM64_TAG_NAME=$(echo $TEMP_ARM64_TAG | sed 's/.*\///')
266-
267-
curl -X DELETE \
268-
-H "Authorization: Bearer ${{ secrets.DOCKERHUB_TOKEN }}" \
269-
"https://hub.docker.com/v2/repositories/${{ env.IMAGE_NAME }}/tags/$TEMP_AMD64_TAG_NAME/" || echo "Failed to delete amd64 temp tag"
270-
271-
curl -X DELETE \
272-
-H "Authorization: Bearer ${{ secrets.DOCKERHUB_TOKEN }}" \
273-
"https://hub.docker.com/v2/repositories/${{ env.IMAGE_NAME }}/tags/$TEMP_ARM64_TAG_NAME/" || echo "Failed to delete arm64 temp tag"
274-
275-
# 清理本地临时标签
276-
docker rmi $TEMP_AMD64_TAG $TEMP_ARM64_TAG
277-
278-
echo "Successfully created multi-arch manifest: $tag"
279-
echo "Temporary images have been deleted from Docker Hub"
280-
done
281-
28285
- name: Verify multi-arch manifest
28386
run: |
284-
TAGS="${{ needs.build-amd64.outputs.tags }}"
87+
TAGS="${{ steps.meta.outputs.tags }}"
28588
for tag in $TAGS; do
28689
echo "Verifying manifest for $tag"
28790

0 commit comments

Comments
 (0)