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
相关产品推荐
相关产品推荐

