对文件执行责备时发生 SonarQube 错误

Posted

技术标签:

【中文标题】对文件执行责备时发生 SonarQube 错误【英文标题】:SonarQube error when executing blame for file 【发布时间】:2017-06-10 23:28:36 【问题描述】:

我最近从 SonarQube 5.1.2 升级到了 SonarQube 5.6。现在我得到一个 IllegalStateException “执行文件责备时出错”。这发生在 Eclipse 和 Jenkins 中使用我的 ant 脚本构建。在 Jenkins 中,错误更完整,表明 SVNAuthenticationException E170001: Negotiate authentication failed: 'No valid credentials provided'。

SonarQube 管理 -> 常规设置 -> SCM -> SVN 中存在有效凭据。它们与我在 5.1.2 中使用的凭据相同,并且责备功能正常工作,并将问题分配给各个开发人员。此外,我的构建脚本使用相同的凭据填充 sonar.svn.username 和 sonar.svn.password.secured。

在 5.1.2 中,我使用的是 sonar-issue-assign-plugin。我看到它现在已被弃用,事实上,如果存在该插件,SonarQube 5.6 将无法成功启动。不幸的是,任何取代它的东西都不适合我。

我查看了here 和here 相同错误的问题的答案。

编辑:我仍然坚持这一点。我在 SonarQube Administration > Generate Settings > SCM > SVN 中重新输入了凭据并重新启动了服务器。结果相同。这是异常堆栈跟踪的最后一部分:

原因:org.tmatesoft.svn.core.SVNAuthenticationException:svn:E170001:协商身份验证失败:“未提供有效凭据” 在 org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:62) 在 org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51) 在 org.tmatesoft.svn.core.internal.io.dav.http.DefaultHTTPNegotiateAuthentication$1.run(DefaultHTTPNegotiateAuthentication.java:175) 在 org.tmatesoft.svn.core.internal.io.dav.http.DefaultHTTPNegotiateAuthentication$1.run(DefaultHTTPNegotiateAuthentication.java:166) 在 org.tmatesoft.svn.core.internal.io.dav.http.DefaultHTTPNegotiateAuthentication.authenticate(DefaultHTTPNegotiateAuthentication.java:221) 在 org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:477) 在 org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:398) 在 org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:386) 在 org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:863) 在 org.tmatesoft.svn.core.internal.io.dav.DAVConnection.exchangeCapabilities(DAVConnection.java:699) 在 org.tmatesoft.svn.core.internal.io.dav.DAVConnection.open(DAVConnection.java:118) 在 org.tmatesoft.svn.core.internal.io.dav.DAVRepository.openConnection(DAVRepository.java:1049) 在 org.tmatesoft.svn.core.internal.io.dav.DAVRepository.hasCapability(DAVRepository.java:877) 在 org.tmatesoft.svn.core.io.SVNRepository.assertServerIsMergeInfoCapable(SVNRepository.java:787) 在 org.tmatesoft.svn.core.io.SVNRepository.getFileRevisions(SVNRepository.java:756) 在 org.tmatesoft.svn.core.internal.wc2.remote.SvnRemoteAnnotate.run(SvnRemoteAnnotate.java:111) 在 org.tmatesoft.svn.core.internal.wc2.remote.SvnRemoteAnnotate.run(SvnRemoteAnnotate.java:35) 在 org.tmatesoft.svn.core.internal.wc2.SvnOperationRunner.run(SvnOperationRunner.java:21) 在 org.tmatesoft.svn.core.wc2.SvnOperationFactory.run(SvnOperationFactory.java:1235) 在 org.tmatesoft.svn.core.wc2.SvnOperation.run(SvnOperation.java:294) 在 org.tmatesoft.svn.core.wc.SVNLogClient.doAnnotate(SVNLogClient.java:295) 在 org.sonar.plugins.scm.svn.SvnBlameCommand.blame(SvnBlameCommand.java:100) ... 64 更多

编辑 2:我使用 sonarqube-ant-task-2.5.jar 将其作为 Ant 任务运行,并使用 SonarQube 插件在 Jenkins 中将其作为单独的构建步骤运行(版本 2.4.4)具有相同的结果。我仍然不知道为什么在尝试分配责任时找不到我的 SVN 凭据。

【问题讨论】:

另见:***.com/q/28740785/59087 【参考方案1】:

我将回答我自己的问题,因为我找到了一个可行的解决方案。这似乎是 SVNKit 的一个问题,我的 SVN 服务器正在使用 NTLM 或协商身份验证,而 SonarQube 插件调用的 tmatesoft svn 代码在我的环境中不支持它。

将以下内容添加到 Jenkins 主机 JVM 选项可解决该问题:

-Dsvnkit.http.methods=Basic,Digest,Negotiate,NTLM

Solution found here.

这适用于通过在调用 ant 脚本时将 Sonar 添加到 JVM 选项来从 Ant 调用 Sonar,并且它也适用于 Jenkins 构建任务 Execute SonarQube Scanner 添加到 JVM 选项时。

【讨论】:

谢谢。有同样的问题。也为我解决了。 谢谢,这正是我需要的。我发现 NTLM 的回退不起作用,所以我不得不将它移到前面。即-Dsvnkit.http.methods=NTLM,Basic,Digest,Negotiate这里有一个错误报告issues.tmatesoft.com/issue/SVNKIT-502

以上是关于对文件执行责备时发生 SonarQube 错误的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube 覆盖范围未显示

加载项目存储库时发生 SonarQube 5.1.1 读取超时错误

C# 文件失败的 SonarQube 分析:对文件中不存在的行号的引用

Git责备显示没有历史记录

从 GitLab CI 运行 sonarqube 时出错

Sonarqube 扫描错误,行超出范围?