2626 IMAGE_NAME : aethersailor/rule-bot
2727
2828jobs :
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
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