logo
5
0
WeChat Login
chore: 拆分单架构构建流水线配置

CNB 多架构 Docker 镜像构建流程

概述

本项目基于 CNB (Cloud Native Build) 平台实现自动化多架构 Docker 镜像构建流程,支持 linux/amd64linux/arm64 两种架构的并行构建与合并。

CNB 平台特性

CNB 平台提供了以下关键功能,使多架构构建变得简单高效:

  • 并行构建:支持不同架构的构建任务并行执行,显著提高构建效率
  • 架构标签:通过 cnb:arch:amd64cnb:arch:arm64:v8 标签自动分配到对应架构的运行器
  • 任务同步:使用 cnb:awaitcnb:resolve 实现跨任务的状态同步
  • 清单管理:通过 cnbcool/manifest 工具自动创建和管理多架构镜像清单
  • 资源清理:使用 artifact:remove-tag 自动清理中间构建标签

构建流程架构

1. 单架构构建模板

.build-arch-template: &build-arch-template
  services:
    - docker
  stages:
    - name: 构建并推送 Docker 镜像
      script: |
        docker buildx build \
          --platform linux/${ARCH_KEY} \
          -t ${IMAGE_TAG} \
          --push \
          ${DOCKER_BUILD_PATH}
    - name: 标记构建完成(供后续等待使用)
      type: cnb:resolve
      options:
        key: build-${ARCH_KEY}

此模板定义了单个架构的构建流程,包括:

  • 使用 Docker Buildx 进行多架构构建
  • 构建完成后自动推送到注册表
  • 使用 cnb:resolve 标记构建完成状态

2. 多架构合并清单

.build-manifest: &build-manifest
  services:
    - docker
  runner:
    cpus: 1
  env:
    IMAGE_TAG: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
  stages:
    - name: 等待 amd64 构建完成
      type: cnb:await
      options:
        key: build-amd64
    - name: 等待 arm64 构建完成
      type: cnb:await
      options:
        key: build-arm64
    - name: 创建多平台镜像清单
      image: cnbcool/manifest
      settings:
        target: ${IMAGE_TAG}
        template: ${IMAGE_TAG}-OS-ARCH
        platforms:
          - linux/amd64
          - linux/arm64
    - name: 清理中间架构标签
      type: artifact:remove-tag
      options:
        name: ${CNB_REPO_NAME}
        tags:
          - latest-linux-amd64
          - latest-linux-arm64
        type: docker

此阶段负责:

  • 使用 cnb:await 等待所有架构构建完成
  • 创建多架构 Docker 清单
  • 清理中间构建标签

构建流水线类型

标准构建流水线

标准构建流水线使用项目根目录作为构建上下文:

.build-pipeline:
  # amd64 构建任务(使用当前目录)
  - <<: *build-arch-template
    runner:
      tags: cnb:arch:amd64
      cpus: 1
    env:
      ARCH_KEY: amd64
      DOCKER_BUILD_PATH: .
      IMAGE_TAG: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest-linux-amd64

  # arm64 构建任务(使用当前目录)
  - <<: *build-arch-template
    runner:
      tags: cnb:arch:arm64:v8
      cpus: 1
    env:
      ARCH_KEY: arm64
      DOCKER_BUILD_PATH: .
      IMAGE_TAG: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest-linux-arm64

  # 合并 manifest
  - *build-manifest

IDE 构建流水线

IDE 构建流水线使用 .ide 目录作为构建上下文,专门用于构建 IDE 相关镜像:

.build-ide-pipeline:
  # amd64 构建任务(使用 .ide 目录)
  - <<: *build-arch-template
    runner:
      tags: cnb:arch:amd64
      cpus: 1
    env:
      ARCH_KEY: amd64
      DOCKER_BUILD_PATH: .ide
      IMAGE_TAG: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest-linux-amd64

  # arm64 构建任务(使用 .ide 目录)
  - <<: *build-arch-template
    runner:
      tags: cnb:arch:arm64:v8
      cpus: 1
    env:
      ARCH_KEY: arm64
      DOCKER_BUILD_PATH: .ide
      IMAGE_TAG: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest-linux-arm64

  # 合并 manifest
  - *build-manifest

CNB 平台特殊指令

cnb:resolve

用于标记任务完成状态,供其他任务等待:

- name: 标记构建完成
  type: cnb:resolve
  options:
    key: build-${ARCH_KEY}

cnb:await

用于等待其他任务完成:

- name: 等待 amd64 构建完成
  type: cnb:await
  options:
    key: build-amd64

artifact:remove-tag

用于清理构建过程中产生的临时标签:

- name: 清理中间架构标签
  type: artifact:remove-tag
  options:
    name: ${CNB_REPO_NAME}
    tags:
      - latest-linux-amd64
      - latest-linux-arm64
    type: docker

使用指南

1. 准备工作

确保项目根目录或 .ide 目录包含有效的 Dockerfile:

FROM alpine:latest
CMD ["echo", "Hello, CNB!"]

2. 触发构建

在 CNB 平台上配置构建流水线,选择适当的构建类型:

  • 使用 .build-pipeline 进行标准构建
  • 使用 .build-ide-pipeline 进行 IDE 构建

3. 监控构建过程

CNB 平台会自动:

  • 分配对应架构的运行器
  • 并行执行多架构构建
  • 等待所有架构构建完成
  • 创建多架构清单
  • 清理临时资源

4. 拉取镜像

构建完成后,可以使用以下命令拉取多架构镜像:

docker pull ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest

Docker 会自动根据当前架构拉取对应的镜像版本。

最佳实践

  1. 构建上下文优化:确保 Dockerfile 和相关文件位于正确的构建上下文目录中
  2. 多阶段构建:使用多阶段构建减少最终镜像大小
  3. 缓存利用:合理利用 Docker Buildx 缓存机制提高构建速度
  4. 标签管理:遵循语义化版本标签规范,便于版本管理

故障排除

常见问题

  1. 构建超时:检查 Dockerfile 是否存在耗时操作,考虑优化构建步骤
  2. 架构不匹配:确保基础镜像支持目标架构
  3. 推送失败:检查注册表权限和网络连接

调试技巧

  1. 查看构建日志了解详细错误信息
  2. 使用 docker buildx build 本地测试构建过程
  3. 检查环境变量是否正确设置

总结

CNB 平台通过提供并行构建、任务同步和清单管理等特性,大大简化了多架构 Docker 镜像的构建流程。本项目提供的构建模板可以作为标准参考,帮助快速实现高效的多架构 CI/CD 流程。

About

No description, topics, or website provided.