GitHub Actions 多平台构建
适用场景
- •多平台镜像构建与发布(amd64/arm64)
- •需要 digest 合并 manifest list
- •需要 Buildx 缓存与标签管理
不适用
- •单平台构建且不合并 manifest
- •不推送到镜像仓库
核心检查清单
Build job (matrix)
- • Matrix 可用列表形式:
platform: [linux/amd64, linux/arm64](
fail-fast: false) - • 环境变量:
REGISTRY_IMAGE(小写),VERSION - • 生成
REGISTRY_IMAGE时强制小写(如tr '[:upper:]' '[:lower:]') - •
actions/checkout@v4 - •
docker/setup-buildx-action@v3 - •
docker/login-action@v3(ghcr.io) - •
docker/build-push-action@v6:- •
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true - •
platforms: ${{ matrix.platform }} - •
cache-from: type=gha,cache-to: type=gha,mode=max
- •
- • 获取 digest:
digest="${{ steps.build.outputs.digest }}" - • 导出 digest:
touch "/tmp/digests/${digest#sha256:}" - • artifact 名避免
/(如linux/amd64→linux-amd64) - •
actions/upload-artifact@v4:name: digests-<safe-platform>
Merge job
- •
needs: build,runs-on: ubuntu-latest - •
actions/download-artifact@v4:pattern: digests-*,merge-multiple: true - •
docker/setup-buildx-action@v3 - • (可选)
docker/metadata-action@v5: 生成标签 - •
docker/login-action@v3 - • 通过 metadata 输出或自定义标签传入
imagetools create - •
docker buildx imagetools create -t <tag> <image@sha256:digest>...
值得学习的点
- •✅ digest + manifest 分离式流程(build 推 digest,merge 合并)
- •✅
push-by-digest+name-canonical防止 tag 冲突 - •✅
mergejob 统一打标签,避免重复推送 - •✅
permissions最小化(contents: read,packages: write) - •✅ 短期 artifact(
retention-days: 1)
常见错误
- •❌ 单 runner 构建所有平台 → ✅ 使用平台匹配的 runner
- •❌ 忘记
push-by-digest→ ✅ 必须使用以安全合并 - •❌ GHCR 镜像名未小写 → ✅ 强制小写
- •❌ 跳过 digest artifact → ✅ 必须传递到 merge job
基线要求
- •✅ 不声称文件已创建除非实际创建
- •✅ 不跳过验证即使模板存在
- •✅ 输出检查清单而非完整模板(除非明确要求)
- •✅ 尊重个人/项目技能位置
快速自检(必做)
- • frontmatter 仅含
name与description - •
description以 “Use when” 开头并包含触发词 - • 未声明任何未执行的操作或验证
借口-现实
| 借口 | 现实 |
|---|---|
| “模板够用,跳过验证” | 格式错误会导致技能不可发现 |
| “我已经更新了” | 未实际改写就不能声明 |
红旗
- •“默认输出完整模板”
- •“未执行也声明已验证”