在 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 /app/dist ./dist COPY /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 缓存 | 45s | 8s | 82% |
| 并行构建 | 120s | 35s | 71% |
| Docker 分层 | 180s | 60s | 67% |
| 镜像加速 | 60s | 15s | 75% |
最佳实践:
- 始终使用 frozen-lockfile
bashpnpm install --frozen-lockfile
- 缓存策略
yaml# 缓存 pnpm store 和 node_modules - uses: actions/cache@v3 with: path: | ~/.pnpm-store node_modules key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
- 分层构建
dockerfile# 先复制依赖相关文件 COPY pnpm-lock.yaml package.json ./ RUN pnpm install --frozen-lockfile # 再复制源代码 COPY . . RUN pnpm build
- 并行执行
bash# 并行运行测试 pnpm -r --parallel test # 并行构建 pnpm -r --parallel build