乐闻世界logo
搜索文章和话题

pnpm 如何在 CI/CD 环境中优化构建速度?

3月5日 23:35

在 CI/CD 环境中,pnpm 可以通过多种方式优化构建速度。

基础优化配置:

yaml
# .github/workflows/ci.yml name: CI jobs: build: steps: - uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v2 with: version: 8 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'pnpm' # 自动缓存 pnpm store - name: Install dependencies run: pnpm install --frozen-lockfile

Store 缓存策略:

yaml
# GitHub Actions - 手动缓存 store - name: Cache pnpm store uses: actions/cache@v3 with: path: | ~/.pnpm-store **/node_modules key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-

Docker 优化:

dockerfile
# Dockerfile FROM node:20-alpine # 安装 pnpm RUN npm install -g pnpm # 先复制 lock 文件(利用缓存层) COPY pnpm-lock.yaml ./ COPY package.json ./ # 安装依赖 RUN pnpm install --frozen-lockfile --prod # 复制源代码 COPY . . # 构建 RUN pnpm build

多阶段构建优化:

dockerfile
# 构建阶段 FROM node:20-alpine AS builder RUN npm install -g pnpm WORKDIR /app COPY pnpm-lock.yaml package.json ./ RUN pnpm install --frozen-lockfile COPY . . RUN pnpm build # 生产阶段 FROM node:20-alpine RUN npm install -g pnpm WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY package.json ./ CMD ["node", "dist/main.js"]

并行执行优化:

yaml
# GitLab CI stages: - install - test - build install: stage: install script: - pnpm install --frozen-lockfile cache: key: ${CI_COMMIT_REF_SLUG} paths: - .pnpm-store - node_modules test: stage: test script: - pnpm test parallel: 4 # 并行测试 build: stage: build script: - pnpm build

Monorepo 优化:

yaml
# 只构建变更的包 - name: Build changed packages run: pnpm -r --filter "...[origin/main]" build # 并行构建 - name: Parallel build run: pnpm -r --parallel build # 拓扑顺序构建 - name: Topological build run: pnpm -r --workspace-concurrency=4 build

网络优化:

ini
# .npmrc # 使用国内镜像 registry=https://registry.npmmirror.com/ # 增加并发数 network-concurrency=32 # 增加超时时间 fetch-timeout=120000 # 增加重试次数 fetch-retries=5

安装优化参数:

bash
# 冻结锁文件(更快,更安全) pnpm install --frozen-lockfile # 优先使用离线缓存 pnpm install --prefer-offline # 忽略 engines 检查(加速) pnpm install --ignore-engines # 不显示进度条(略微加速) pnpm install --reporter=silent

性能对比:

优化策略无优化有优化提升
Store 缓存45s8s82%
并行构建120s35s71%
Docker 分层180s60s67%
镜像加速60s15s75%

最佳实践:

  1. 始终使用 frozen-lockfile
bash
pnpm install --frozen-lockfile
  1. 缓存策略
yaml
# 缓存 pnpm store 和 node_modules - uses: actions/cache@v3 with: path: | ~/.pnpm-store node_modules key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
  1. 分层构建
dockerfile
# 先复制依赖相关文件 COPY pnpm-lock.yaml package.json ./ RUN pnpm install --frozen-lockfile # 再复制源代码 COPY . . RUN pnpm build
  1. 并行执行
bash
# 并行运行测试 pnpm -r --parallel test # 并行构建 pnpm -r --parallel build
标签:PNPM