Sonarqube TFS 任务返回错误 (401) Unauthorized on one project but not others

Sonarqube TFS task returning error (401) Unauthorized on one project but not others

过去 2 个月,我们一直在 TFS 2017 服务器上使用 Sonarqube。总的来说,它非常有帮助,但几周前,由于 Sonarqube 返回 401 错误(未授权),我们的一个构建开始失败。

2017-10-12T15:11:19.7921253Z ##[error]16:11:19.729 Failed to request and parse 'http://sonarqube.local:9000/api/settings/values?component=MYPROJECTNAME%3Amaster': The remote server returned an error: (401) Unauthorized.

2017-10-12T15:11:19.7921253Z ##[error]16:11:19.729 Could not authorize while connecting to the SonarQube server. Check your credentials and try again.

奇怪的是,来自其他项目的其他构建使用相同的 API 令牌运行得非常好。我什至在失败的项目中创建了一个新的 Sonarqube 端点,然后在一个已知的好项目中再次创建 - 再次在两者上使用相同的 API 键 - 只是为了发生同样的事情。一个因上述错误而失败,另一个很好。

我认为这可能是 sonarqube 本身的一个 security/permission 选项,所以我尝试创建一个全新的 sonarqube 项目,但再次 - 一个 TFS 项目失败,而另一个成功,当两个项目都指向这个新项目时.

我怀疑这个问题源于 TFS 项目的安全设置,但是在比较好项目和坏项目之后,我并没有突然想到可能是什么原因 - 它们的设置似乎相同.我在好的构建和坏的构建上都启用了调试并比较了输出。据我所知,两者之间唯一真正的区别是 "Failing" 构建从某个地方获取 sonar.password 而好的构建不是:

好:

2017-10-12T15:13:07.1067146Z ##[debug]Processed: ##vso[task.setvariable variable=MSBuild.SonarQube.ServerPassword;]


2017-10-12T15:13:07.2785974Z ##[debug] arguments = /c ""Y:17_agent_work_tasks\SonarQubeScannerMsBuildBegin_15b84ca1-b62f-4a2a-a403-89b77a063157.0.2\SonarQubeScannerMsBuild\MSBuild.SonarQube.Runner.exe" begin /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]Processed: ##vso[task.setvariable variable=MSBuild.SonarQube.ServerPassword;]********


2017-10-12T15:11:19.5733714Z ##[debug] Path: Z:17_agent_work_tasks\SonarQubeScannerMsBuildBegin_15b84ca1-b62f-4a2a-a403-89b77a063157.0.2\SonarQubeScannerMsBuild\MSBuild.SonarQube.Runner.exe 2017-10-12T15:11:19.5733714Z ##[debug] Arguments: begin /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"

(注意:尽管在这种情况下 good/bad 运行 在不同的构建代理上,代理是相同的,我已经确认 "good" 项目适用于我们所有的代理而 "bad" 项目失败,所有代理的结果相同。

但是,我不知道它是从哪里得到这个密码的——存储库中没有 sonar.properties 文件。可以肯定的是,我克隆了失败的 TFS 项目的存储库,将其推送到工作中的 TFS 项目的存储库中,复制了构建并且它工作了。

我已经检查了 Sonarqube 本身的日志,它们没有什么帮助

我可能错过了什么?

TFS 2017 是 15.117.26714.0

Sonarqube 是 6.5.0.27846

Sonarqube 任务版本为 3.0.2

编辑:我已经设法通过编辑构建任务以不将 sonar.password 插入命令行来获得临时解决方法,这可行。这确实证明了根本问题是从 "somewhere" 中提取这个神秘密码的任务,但我仍然不知道它会在哪里提取它。我找不到太多关于设置 MSBuild.SonarQube.ServerPassword

的信息

基于 (401) 未经授权。一般来说,您需要在 TFS 的 SonarQube 服务端点中指定身份验证令牌:click! To obtain a user token in SonarQube follow these steps 但是,根据您所做的故障排除,一个项目有效,另一个项目无效,这应该与您的问题无关。

只需确保 SonarQube.Analysis.xml 中的 sonar.loginsonar.password 属性被注释掉,否则令牌将不会被使用。

还建议您比较好构建和坏构建的构建定义。另一种方法是为坏项目创建一个新的构建定义,只包含与声纳 qube 相关的任务。要查看身份验证是否有效,如果问题与构建定义相关,这将缩小范围。