Jenkins Pipeline在macOS执行yarn install提示命令未找到求助
问题
将我编写的首份Jenkins脚本在Linux环境运行正常,迁移至macOS High Sierra系统后出现Shell脚本错误。已在本地Jenkins用户账户下安装Node和yarn,但执行yarn install时提示“yarn: command not found”,无法定位问题原因,恳请协助排查。
我的Jenkinsfile:
node { stage('Check out') { checkout scm } stage('Prepare') { sh "yarn install" } stage('Test') { sh "yarn test" } stage('Sonar') { if (env.BRANCH_NAME == 'dev') { def scannerHome = tool 'sonar scanner'; withSonarQubeEnv('sonar') { sh "${scannerHome}/bin/sonar-scanner" } } } }
完整构建日志:
14:43:11 使用hariklee/******连接至https://api.github.com 从6c639bd70ac86cbe6a49ac0b58bcc10e3c64a375获取Jenkinsfile 运行持久化等级:MAX_SURVIVABILITY [Pipeline] node 在Jenkins上运行,工作目录:/Users/Shared/Jenkins/Home/workspace/wingman_423_ci_cd-7PSSGRAMBTXUQRESYCNVODXU7IZJLJLPHQOE3KYEPCSAAYAFFD4A [Pipeline] { [Pipeline] stage [Pipeline] { (Check out) [Pipeline] checkout git rev-parse --is-inside-work-tree # 超时时间=10 从远程Git仓库拉取变更 git config remote.origin.url https://github.com/wingman-xyz/app.git # 超时时间=10 不拉取标签 从https://github.com/wingman-xyz/app.git拉取上游变更 git --version # 超时时间=10 使用GIT_ASKPASS设置凭据 git fetch --no-tags --progress https://github.com/wingman-xyz/app.git +refs/heads/423_ci_cd:refs/remotes/origin/423_ci_cd 检出版本6c639bd70ac86cbe6a49ac0b58bcc10e3c64a375 (423_ci_cd) git config core.sparsecheckout # 超时时间=10 git checkout -f 6c639bd70ac86cbe6a49ac0b58bcc10e3c64a375 提交信息:"jenkins test" 首次构建,跳过变更日志。 [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Prepare) [Pipeline] sh [wingman_423_ci_cd-7PSSGRAMBTXUQRESYCNVODXU7IZJLJLPHQOE3KYEPCSAAYAFFD4A] 执行Shell脚本 yarn install /Users/Shared/Jenkins/Home/workspace/wingman_423_ci_cd-7PSSGRAMBTXUQRESYCNVODXU7IZJLJLPHQOE3KYEPCSAAYAFFD4A@tmp/durable-cf573520/script.sh: 第2行: yarn: 命令未找到 [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] 构建结束 已通知GitHub本次提交的构建结果 ERROR: 脚本返回退出码127 构建完成:FAILURE
解决方案
这个问题我在macOS部署Jenkins时也踩过坑,核心原因是Jenkins的运行环境和你本地登录用户的shell环境变量完全不共享:
macOS上Jenkins默认是以系统服务(LaunchDaemon)的形式运行的,它的PATH变量只包含系统默认路径(比如/usr/bin、/bin),而你在本地用户账户下安装的yarn(通常在/usr/local/bin或者~/.nvm/versions/node/xxx/bin这类用户级路径里)不在Jenkins的PATH范围内,所以会提示“命令未找到”。
下面给你几种简单有效的解决方法:
方法1:直接使用yarn的绝对路径执行
先在本地用户终端执行which yarn,得到yarn的绝对路径(比如/Users/yourusername/.nvm/versions/node/v18.17.0/bin/yarn或者/usr/local/bin/yarn),然后修改Jenkinsfile里的命令:
stage('Prepare') { sh "/Users/yourusername/.nvm/versions/node/v18.17.0/bin/yarn install" } stage('Test') { sh "/Users/yourusername/.nvm/versions/node/v18.17.0/bin/yarn test" }
这种方法最直接,适合快速验证。
方法2:在Jenkinsfile里手动添加PATH环境变量
把yarn所在的目录加到Jenkins的PATH里,后续就能直接用yarn命令了:
node { stage('Check out') { checkout scm } stage('Prepare') { // 替换成你实际的yarn父目录路径,比如nvm的node bin目录或者/usr/local/bin env.PATH = "/Users/yourusername/.nvm/versions/node/v18.17.0/bin:${env.PATH}" sh "yarn install" } stage('Test') { sh "yarn test" } // 其他stage保持不变... }
方法3:全局配置Jenkins的环境变量
如果你的Jenkins有多个项目需要用到yarn,可以一次性在全局配置里设置:
- 打开Jenkins管理界面,进入「系统管理」→「系统设置」
- 找到「全局属性」,勾选「环境变量」
- 添加一个变量:
- 名称:
PATH - 值:
/Users/yourusername/.nvm/versions/node/v18.17.0/bin:/usr/local/bin:${PATH}(替换成你实际的路径)
- 名称:
- 保存配置后,所有Jenkins项目都会继承这个PATH,不用每个项目都改Jenkinsfile。
注意事项
- 如果你是用nvm安装的Node/yarn,要确保路径正确,nvm的路径通常在用户主目录下的
.nvm文件夹里 - 不要直接修改系统级的PATH,避免影响其他服务的运行
内容的提问来源于stack exchange,提问作者d4rkwinz
相关产品推荐
相关产品推荐

