ci(perf): runner 本地预拉 action 镜像加速 Set up job
build-and-push-image / build-push (push) Has been cancelled
build-and-push-image / vulnerability-scan (push) Has been cancelled

问题:workflow "Set up job" 步骤非常缓慢
根因:每个 GitHub Actions step 都是 Docker 容器,需从 Docker Hub 拉镜像
      国内网络拉 Docker Hub 特别慢(甚至失败)

解决方案:
  scripts/prepull-actions.sh
    - 列出 build-image.yml 用到的所有 Docker 镜像
    - xargs -P 4 并行拉取
    - 提供验证命令 + cron 清理建议

更新 workflow 用的镜像列表:
  - docker/actions/setup-buildx:v3
  - docker/actions/login:v3
  - docker/actions/metadata:v5
  - docker/actions/build-push:v5
  - aquasec/trivy-action:master
  - moby/buildkit:v0.13.0

非 Docker action(actions/checkout / dtolnay/rust-toolchain / Swatinem/rust-cache)
是内置脚本,不需预拉。

README 新增"性能优化"章节:
  - 根因分析
  - 使用步骤
  - 清理策略 cron
  - 进一步优化建议(BuildKit cache / cargo 缓存 / 多架构)

使用方法:
  chmod +x scripts/prepull-actions.sh
  sudo ./scripts/prepull-actions.sh
This commit is contained in:
Matrix Music Bot Dev
2026-07-03 00:33:49 +08:00
parent 725c6b1d65
commit a22d9578fb
2 changed files with 107 additions and 0 deletions
+43
View File
@@ -151,6 +151,49 @@ pr-check:
push: false # 不推送,只构建验证
```
## 性能优化
### "Set up job" 步骤慢的优化
**根因**:每个 GitHub Actions step 都是个 Docker 容器,需从 Docker Hub
ghcr.io / docker.io)拉取镜像。runner 首次运行会卡在拉镜像上,国内网络下尤甚。
**解决方案 ARunner 本地预拉 action 镜像**
```bash
# 在 runner 主机上跑一次(脚本随仓库发布)
sudo ./scripts/prepull-actions.sh
# 验证缓存命中
docker images | grep -E "(docker/actions|aquasec/trivy-action|moby/buildkit)"
```
脚本会拉取 build-image.yml 用到的所有 Docker 镜像(并行 4 路)。
**建议节奏**
- runner 初始化时:跑一次
- 新增 action 时:跑一次
- 定期清理悬空镜像:
```bash
# /etc/cron.d/docker-prune
0 3 * * 0 root docker image prune -f --filter "until=168h"
```
**预期效果**
- 首次运行:`Set up job` 仍慢(冷启动)
- 后续运行:`Set up job` 仅 5-10 秒(仅做 job 调度,不再拉镜像)
### 构建性能进一步优化
如构建仍是瓶颈(>10 分钟),可叠加:
- **BuildKit registry cache**(已启用):`docker.io/yourorg/matrix-music-bot:buildcache`
- **Cargo 缓存**:在 Dockerfile 中加 `RUN cargo build --release` 复用 `target/`
- **多架构**(如需要):`PLATFORM: linux/amd64,linux/arm64`CI 时间约翻倍)
---
## 故障排查
### Workflow 触发不了