背景

CI 最容易浪费时间的阶段之一,就是镜像构建。

常见慢点:

  • 每次都重新下载依赖
  • layer 顺序不合理导致缓存失效
  • 多架构构建没有缓存复用

BuildKit 的关键能力

  1. cache mount
  2. 并行构建
  3. 远程缓存导入导出
# syntax=docker/dockerfile:1.7
FROM golang:1.22-alpine AS builder
WORKDIR /app

COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod go mod download

COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build \
    CGO_ENABLED=0 GOOS=linux go build -o app .

GitHub Actions 示例

- uses: docker/setup-buildx-action@v3

- uses: docker/build-push-action@v6
  with:
    context: .
    push: true
    tags: ghcr.io/org/app:latest
    cache-from: type=registry,ref=ghcr.io/org/app:buildcache
    cache-to: type=registry,ref=ghcr.io/org/app:buildcache,mode=max

总结

提速的核心不是换机器,而是设计好缓存路径。

构建系统越早做缓存治理,团队长期效率越高。


CI 慢不是宿命,很多时候只是缓存没被认真设计。