Sonarqube TFS 任务返回错误 (401) 在一个项目上未经授权,但在其他项目上未授权
Posted
技术标签:
【中文标题】Sonarqube TFS 任务返回错误 (401) 在一个项目上未经授权,但在其他项目上未授权【英文标题】:Sonarqube TFS task returning error (401) Unauthorized on one project but not others 【发布时间】:2018-03-25 07:46:24 【问题描述】:过去 2 个月以来,我们一直在 TFS 2017 服务器上使用 Sonarqube。总体而言,它非常有帮助,但几周前,由于 Sonarqube 返回 401 错误(未经授权),我们的一个构建开始失败。
2017-10-12T15:11:19.7921253Z ##[error]16:11:19.729 无法请求和解析“http://sonarqube.local:9000/api/settings/values?component=MYPROJECTNAME%3Amaster”:远程服务器返回错误:(401) Unauthorized。
2017-10-12T15:11:19.7921253Z ##[error]16:11:19.729 连接到 SonarQube 服务器时无法授权。检查您的凭据,然后重试。
奇怪的是,来自其他项目的其他构建工作绝对正常,使用相同的 API 令牌。我什至在失败的项目中创建了一个新的 Sonarqube 端点,然后在一个已知的好项目中再次创建 - 再次在两者上使用相同的 API 密钥 - 只是为了发生同样的事情。一个因上述错误而失败,另一个很好。
我认为这可能是 sonarqube 本身中的一个安全/权限选项,所以我尝试创建一个全新的 sonarqube 项目,但又一次 - 一个 TFS 项目失败,而另一个在两个都指向这个新项目时成功。
我怀疑这个问题源于 TFS 项目的安全设置,但是在将好项目与坏项目进行比较后,我没有想到可能是什么原因 - 它们的设置似乎相同。我对好的构建和坏的构建都启用了调试,并比较了输出。据我所知,两者之间唯一真正的区别是“失败”构建是从某个地方获取 sonar.password 而好的构建不是:
好:
2017-10-12T15:13:07.1067146Z ##[debug]已处理:##vso[task.setvariable variable=MSBuild.SonarQube.ServerPassword;]
2017-10-12T15:13:07.2785974Z ##[debug] arguments = /c ""Y:\2017_agent_work_tasks\SonarQubeScannerMsBuildBegin_15b84ca1-b62f-4a2a-a403-89b77a063157\3.0.2\SonarQubeScannerMsBuild\MSBuild.So .exe" 开始 /k:"MYPROJECTNAME" /n:"MYPROJECTNAME" /v:"20171012.7" /d:sonar.host.url="http://sonarqube.local:9000/" /d:sonar.login= ******** /d:sonar.cs.vscoveragexml.reportsPaths="***.coveragexml" /d:sonar.branch="master""
不好:
2017-10-12T15:11:19.5733714Z ##[debug]已处理:##vso[task.setvariable variable=MSBuild.SonarQube.ServerPassword;]********
2017-10-12T15:11:19.5733714Z ##[debug] 路径:Z:\2017_agent_work_tasks\SonarQubeScannerMsBuildBegin_15b84ca1-b62f-4a2a-a403-89b77a063157\3.0.2\SonarQubeScannerMsBuild\MSBuild.SonarQube. 2017-10-12T15:11:19.5733714Z ##[debug] 参数:开始 /k:"MYPROJECTNAME" /n:"MYPROJECTNAME" /v:"20171012.3" /d:sonar.host.url="http:// sonarqube.local:9000/" /d:sonar.login=******** /d:sonar.password=******** /d:sonar.cs.vscoveragexml.reportsPaths="* **.coveragexml" /d:sonar.branch="master"
(注意:虽然在这种情况下,好/坏项目在不同的构建代理上运行,但代理是相同的,我已经确认“好”项目在我们所有的代理上都可以工作,而“坏”项目同样失败所有代理的结果)。
但是,我不知道它从哪里获取此密码 - 存储库中没有 sonar.properties 文件。可以肯定的是,我为失败的 TFS 项目克隆了存储库,将其推送到工作 TFS 项目的存储库中,复制了构建并且它可以工作。
我已经检查了 Sonarqube 本身的日志,但它们的帮助不大
我可能错过了什么?
TFS 2017 是 15.117.26714.0
Sonarqube 是 6.5.0.27846
Sonarqube 任务版本为 3.0.2
编辑:我已经设法通过编辑构建任务而不将 sonar.password 插入命令行来获得临时解决方法,这可以工作。这确实证明了根本问题是从“某处”提取这个神秘密码的任务,但我仍然不知道它会在哪里捡起它。我找不到太多关于什么设置MSBuild.SonarQube.ServerPassword
【问题讨论】:
【参考方案1】:基于 (401) 未授权。一般来说,您需要在 TFS 中的 SonarQube 服务端点中指定身份验证令牌:click! 要在 SonarQube 中获取用户令牌,请遵循 these steps 但是,根据您所做的故障排除,一个项目工作,另一个项目不工作,这个应该与您的问题无关。
请确保将 SonarQube.Analysis.xml 中的 sonar.login
和 sonar.password
属性注释掉,否则不会使用令牌。
还建议您比较好构建和坏构建的构建定义。另一种方法是只为坏项目创建一个与声纳 qube 相关的任务的新构建定义。要查看身份验证是否有效,这将缩小与构建定义相关的问题。
【讨论】:
以上是关于Sonarqube TFS 任务返回错误 (401) 在一个项目上未经授权,但在其他项目上未授权的主要内容,如果未能解决你的问题,请参考以下文章
Sonarqube v.4 TFS 任务“Publish Quality Gate Result”抛出错误“Could not fetch task for ID”
##[错误]错误:超出 GC 开销限制 - TFS 构建中的 SonarQube
org.sonarqube.ws.client.HttpException:错误 401