SonarCloud:当 运行 蚂蚁和声纳连接到声纳云时出现错误

SonarCloud: Getting error when running ant and sonar connecting to sonar cloud

我们有一个设置,我们将 SonarQube 与 Ant 一起使用并连接到 SonarCloud (https://sonarcloud.io)。此设置始终在本地开发人员机器和 bitbucket 管道中运行。两天以来,我们在本地和 bitbucket 管道上一直低于错误。下面是堆栈跟踪:

Project.sonar:
[sonar:sonar] Apache Ant(TM) version 1.10.5 compiled on July 10 2018
[sonar:sonar] SonarQube Ant Task version: 2.5
[sonar:sonar] Loaded from: file:<redacted_path>/sonarqube-ant-task-2.5.jar
[sonar:sonar] User cache: /Users/<user>/.sonar/cache

BUILD FAILED
<redacted_path>/build-sonar.xml:120: java.lang.IllegalStateException: not started
    at org.sonarsource.scanner.api.EmbeddedScanner.checkLauncherExists(EmbeddedScanner.java:244)
    at org.sonarsource.scanner.api.EmbeddedScanner.stop(EmbeddedScanner.java:164)
    at org.sonarsource.scanner.ant.SonarQubeTask.launchAnalysis(SonarQubeTask.java:101)
    at org.sonarsource.scanner.ant.SonarQubeTask.execute(SonarQubeTask.java:81)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
    at org.apache.tools.ant.Task.perform(Task.java:350)
    at org.apache.tools.ant.Target.execute(Target.java:449)
    at org.apache.tools.ant.Target.performTasks(Target.java:470)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1361)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:834)
    at org.apache.tools.ant.Main.startAnt(Main.java:223)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:284)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:101)

下面是我们用于 运行 声纳的命令:

ant compile Project.sonar -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=<org_name> -Dsonar.login=<token_which_has_all_privs>

我们尝试用新的 sonar.login 令牌更改(认为旧的可能已经过期)但它也不适用于新的。

我无法在其他任何地方找到有关此错误的任何帮助,因为它没有说明太多。我看到其他错误,例如 "WebApp did not start" 但这似乎与 SonarQube 在本地 运行 的用例有关。但在我们的例子中,我们连接到 https://sonarcloud.io 主机。我们也尝试过 sonar.login 和 sonar.password,但仍然失败。

如有任何帮助,我们将不胜感激。

mc1arke 问题的更新 1 这足够了吗?我可以创建一个新的基本构建-sonar.xml 并提供它,但它只会包含以下内容和一些特定于我们环境的 properties/variables。

从 build-sonar.xml 中提取的内容如下所示:

<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
    <classpath>
        <pathelement location="${lib.dir}/sonarqube-ant-task-2.5.jar"/>
    </classpath>
</taskdef>

<target name="Project.sonar">
    <property name="sonar.projectKey" value="ProjectKey" />
    <property name="sonar.projectName" value="ProjectName" />
    <property name="sonar.projectVersion" value="1.0" />
    <property name="sonar.sources" value="${src.dir}" />
    <property name="sonar.binaries" value="${build.dir}" />
    <property name="sonar.java.binaries" value="${build.dir}" />
    <property name="sonar.java.libraries" value="${lib.dir}/*.jar"/>
    <property name="sonar.java.test.libraries" value="${lib.dir}/*.jar"/>
    <property name="sonar.java.source" value="1.8" />
    <property name="sonar.exclusions" value="<some modules>"/>
    <property name="sonar.jacoco.reportPath" value="${junit.reports}/coverage/jacoco.exec"/>
    <property name="sonar.junit.reportsPath" value="${junit.reports}" />
    <property name="sonar.jacoco.itReportPath" value="${junit.reports}/coverage/jacoco-it.exec"/>
    <property name="sonar.coverage.exclusions" value="<some modules>"/>
<sonar:sonar/>
</target>

更新 2: 我查看了 EmbeddedScanner.java、IsolatedLauncherFactory.java 和 IsolatedLauncherProxy.java 中的声纳代码,实际上应该抛出错误.我还 运行 -v 模式下的 ant 命令,下面是它的输出:

Project.sonar:
[antlib:org.sonar.ant] Could not load definitions from resource org/sonar/ant/antlib.xml. It could not be found.
[sonar:sonar] Apache Ant(TM) version 1.10.5 compiled on July 10 2018
[sonar:sonar] SonarQube Ant Task version: 2.5
[sonar:sonar] Loaded from: file:<redacted_path>/sonarqube-ant-task-2.5.jar
[sonar:sonar] keyStore is : 
[sonar:sonar] keyStore type is : jks
[sonar:sonar] keyStore provider is : 
[sonar:sonar] init keystore
[sonar:sonar] init keymanager of type SunX509
[sonar:sonar] User cache: /Users/<user.name>/.sonar/cache
[sonar:sonar] Extract sonar-scanner-api-batch in temp...
[sonar:sonar] Get bootstrap index...
[sonar:sonar] Download: https://sonarcloud.io/batch_bootstrap/index
[sonar:sonar] Get bootstrap completed

查看代码及其输出,我认为下面是代码流程:

EmbeddedScanner.checkLauncherExists() --> IsolatedLauncherFactory.createLauncher() --> JarDownloader.download() --> JarDownloader.getScannerEngineFiles() --> BootstrapIndexDownloader.getIndex()

从日志来看,好像索引返回成功了。但是 JarDownloader.getScannerEngineFiles()JarDownloader.download() 失败,因为日志语句 logger.debug("Create isolated classloader..."); 紧接着 List<File> jarFiles = jarDownloader.download() in IsolatedLauncherFactory.createLauncher() 未打印。

参考:声纳源代码可用here

您的问题是 sonar-ant-plugin 似乎不支持 SonarCloud。该插件依赖于旧版本的 sonar-scanner-api,它试图通过从远程 SonarQube 服务器检索 /batch_bootstrap/index 来检索要下载的 Jar 列表。 SonarCloud 不提供这样的 URL,但确实有 /bootstrap/index,其中 newer versions of sonar-scanner-api do use

更新:已发布 2.6.0.1426 版本的 Ant 扫描器以解决此问题。