You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gitlab CI多阶段使用pnpm遇命令未找到问题,求解决方案

Gitlab CI + pnpm 解决 pnpm: command not found 问题

你遇到的问题核心是:Gitlab CI的每个Job都是独立运行的环境,如果你只在某个阶段安装了pnpm,其他阶段的环境里不会自动继承这个命令。不需要在每个需要pnpm的阶段都单独加before_script,有更简洁的方案:

方案1:全局before_script(最推荐)

在.gitlab-ci.yml顶部定义全局的before_script,让所有Job执行前都先安装并配置pnpm的环境变量,这样所有需要用pnpm的Job都能直接调用命令:

# 全局前置脚本,所有Job都会执行
before_script:
  # 安装pnpm
  - curl -fsSL https://get.pnpm.io/install.sh | sh -
  # 将pnpm加入环境变量PATH,确保当前shell能找到命令
  - export PATH="$HOME/.local/share/pnpm:$PATH"

stages:
  - install
  - test

install_deps:
  stage: install
  script:
    - pnpm install
  # 配置pnpm缓存,优化后续流水线速度
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules
      - .pnpm-store  # pnpm的存储目录,比只缓存node_modules更高效

run_tests:
  stage: test
  script:
    - pnpm test:ci
  # 测试阶段只拉取缓存,不更新
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules
      - .pnpm-store
    policy: pull

方案2:使用预装pnpm的Docker镜像(更高效)

如果你的流水线频繁运行,用已经预装pnpm的镜像可以省去每次安装的时间,比如直接使用pnpm官方维护的镜像:

# 使用预装pnpm的Node.js镜像
image: ghcr.io/pnpm/pnpm:8-node20

stages:
  - install
  - test

install_deps:
  stage: install
  script:
    - pnpm install
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules
      - .pnpm-store

run_tests:
  stage: test
  script:
    - pnpm test:ci
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules
      - .pnpm-store
    policy: pull

方案3:仅给需要的Job单独配置before_script(适合特殊场景)

如果只有个别Job需要pnpm,也可以单独给这些Job加before_script,但会产生重复代码,不推荐大规模使用:

stages:
  - install
  - test

install_deps:
  stage: install
  before_script:
    - curl -fsSL https://get.pnpm.io/install.sh | sh -
    - export PATH="$HOME/.local/share/pnpm:$PATH"
  script:
    - pnpm install
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules
      - .pnpm-store

run_tests:
  stage: test
  before_script:
    - curl -fsSL https://get.pnpm.io/install.sh | sh -
    - export PATH="$HOME/.local/share/pnpm:$PATH"
  script:
    - pnpm test:ci
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules
      - .pnpm-store
    policy: pull

关键注意点

  • Gitlab CI的Job是隔离的,每个Job的环境都是全新的,所以必须确保每个需要pnpm的Job都能在环境中找到该命令。
  • 缓存配置里一定要加上.pnpm-store,这是pnpm的依赖存储目录,能大幅提升后续安装的速度,比只缓存node_modules更高效。

内容的提问来源于stack exchange,提问作者Aw3same

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:10:34