本地Jenkins流水线执行SonarQube Scanner提示command not found如何解决
报错原因分析
- 核心原因是Jenkins执行流水线
sh步骤时,未加载系统全局的PATH环境变量,导致sonar-scanner运行脚本依赖的基础系统命令dirname、basename无法被识别调用 - 由于
dirname执行失败,sonar-scanner脚本无法正确获取自身的安装目录,默认将根路径/作为安装路径查找依赖的jar包,最终触发文件不存在的报错,你日志中的File does not exist: //lib/sonar-scanner-cli-4.6.2.2472.jar就是该问题的直接表现。
修复方案
以下3种方案任选其一即可:
方案1:临时在sh步骤中注入PATH环境变量
直接修改SonarQube阶段的sh脚本,先声明系统命令的搜索路径:
stage('Sonarqube') { sh ''' # 注入系统基础命令路径,macOS环境可额外增加:/usr/local/bin export PATH=$PATH:/usr/bin:/bin /usr/local/bin/sonar-scanner ''' }
方案2:全局配置Jenkins的PATH变量(一劳永逸)
- 打开Jenkins控制台,依次进入「Manage Jenkins」→「Configure System」→「Global properties」
- 勾选「Environment variables」,新增名为
PATH的变量,值填写$PATH:/usr/bin:/bin:/usr/local/bin - 保存配置后重启Jenkins即可生效,后续所有任务都不会再出现基础命令找不到的问题
方案3:使用官方SonarQube Scanner插件执行(更推荐)
避免手动调用本地二进制文件的环境问题,操作流程如下:
- 先在Jenkins插件市场安装「SonarQube Scanner」插件
- 进入「Manage Jenkins」→「Global Tool Configuration」,找到SonarQube Scanner配置项,新增一个扫描仪实例,填写你本地的sonar-scanner安装路径,保存配置
- 修改流水线脚本如下:
node { // 调用全局配置的sonar-scanner实例,参数为你之前配置的实例名 def scannerHome = tool '你配置的SonarQube Scanner实例名' stage('Preparation') { try{ // 从bitbucket克隆项目 git url: 'https://test@bitbucket.org/test/test.git' }catch(err){ echo err } } stage('Sonarqube') { sh "${scannerHome}/bin/sonar-scanner" } stage('end') { echo "Success" } }
内容的提问来源于stack exchange,提问作者daniel meyer
相关产品推荐
相关产品推荐

