云原生构建缓存方式分为 volumes 功能和docker cache;

  volumes 功能

云原生构建 利用 Docker 的 volumes 功能,可在配置文件中通过声明 pipeline.docker.volumes, 将构建机上目录 mount 到容器中。构建任务可将下载好的依赖放入构建机缓存,供后续流水线使用。
.yml文件配置如下:

main:
  push:
    "volume-cache":
      docker:
        image: node:22-alpine
        volumes:
          - node_modules:copy-on-write
      stages:
        - name: npm install
          script: npm install

volumes 的缺点是,缓存只在当前构建机有效。云原生构建 会根据项目构建并发情况,动态在几台构建机上分配一台作为当前流水线构建机,后续流水线分配了其他无缓存的构建机,仍会重新从网络下载资源;

docker cache

云原生构建 还提供了一种 cache 方式:在一个镜像中 npm install 好依赖,然后缓存这个镜像在当前构建机,并推送到远端镜像源。

后续流水线使用时,若构建机有镜像缓存,则直接使用。若构建机无镜像缓存,则会从远端镜像源拉取下来。

.yml配置如下:
 

main:
  push:
    "volume-cache":      
      docker:
        # 通过 Dockerfile 指定构建环境
        build:
          dockerfile: ./dockerfiles/ci-dockerfile
        runner:
          cpus: 8
      stages:
        - name: 依赖是否更新,依赖安装
          type: docker:cache
          options:
            dockerfile: cache.dockerfile
            by:
              - package.json
              - pnpm-lock.yaml
            versionBy:
              - pnpm-lock.yaml
          exports:
            name: DOCKER_CACHE_IMAGE_NAME
        - name: 使用缓存
          image: $DOCKER_CACHE_IMAGE_NAME
          commands:
            - cp -r "$NODE_PATH" ./node_modules

需穿件新增 cache.dockerfile 文件

cache.dockerfile内容如下(使用的为pnpm,用的pnpm-lock.yaml做判断依赖是否更新,依赖未更新用缓存,更新了生成新的容器)

# cache.dockerfile
FROM node:22-alpine AS base

# 安装 pnpm
RUN npm install pnpm@9.14.4 -g

FROM base AS dependencies

# 设置工作目录
WORKDIR /app

# 首先只复制包管理文件
COPY package.json pnpm-lock.yaml ./

# 安装依赖 - 这层会被缓存直到包管理文件变化
RUN pnpm install --frozen-lockfile --prod=false

FROM base AS runtime

WORKDIR /app

# 复制 node_modules
COPY --from=dependencies /app/node_modules ./node_modules

# 设置环境变量
ENV NODE_PATH=/app/node_modules

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐