如何让 SonarQube(docker 容器中的 运行)从 Jenkins 管道连接到 localhost:9000?

How to get SonarQube (running in docker container) to connect to localhost:9000 from Jenkins Pipeline?

我在 CentOS VM 内的 java 和 java 脚本代码上 运行ning SonarQube。我拉出了 sonarqube docker 图像并 运行 安装了容器。我公开了端口 9000 并且能够打开 localhost:9000 并与声纳库图形用户界面进行交互。当我 运行 从命令行在 Java 脚本代码中使用此命令的声纳扫描仪时:

sonar-scanner -Dsonar.projectKey=javascript_code -Dsonar.sources=. -Dsonar.host.url=http://localhost:9000 -Dsonar.login=admin -Dsonar.password=admin 

我得到了一个经过全面分析的项目。除了 Java 脚本代码,我还可以 运行 使用 maven 构建的 Java 代码。两者都可以从命令行正常工作。

当我将它添加到 Jenkins 管道中时,我执行完全相同的命令并得到以下结果:

Error: SonarQube server [http://localhost:9000] can not be reached

Caused by: Fail to get bootstrap index from server

Caused by: Failed to connect to localhost:9000

Caused by: Connection refused (Connection refused)

我也尝试在启动容器时使用 --network="host" 而不是发布端口 9000,但它仍然无法从 Jenkins Pipeline 连接。当我 运行 从命令行执行命令时,一切正常,就在我尝试将其放入 Jenkins 管道时。

关于如何解决这个问题有什么建议吗?谢谢。

*编辑:使用 sonarqube 插件,我能够将 运行 作为 Jenkins 作业进行分析。但是,当我尝试将分析添加到管道中时,我得到了相同的 SonarQube 服务器无法到达错误。它说它跳过了我的项目,因为该项目由于之前的失败而被禁止构建,并给我这个错误消息:

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.5.0.1254:sonar (default-cli) on project sonarqubeproj: 
Unable to execute SonarQube: Fail to get bootstrap index from server: unexpected end of stream on Connection{localhost:9000, proxy=DIRECT hostAddress=localhost/127.0.0.1:9000 cipherSuite=none protocol=http/1.1}: \n not found: limit=0 content=… -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.5.0.1254:sonar (default-cli) on project feedback-tool-ui: Unable to execute SonarQube

您面临的问题很可能与您如何 运行 jenkins 有关。

我假设你也通过 docker 运行 jenkins。这意味着在 jenkins 的上下文中,localhost 不是您的主机系统,而是 jenkins 容器。这意味着您需要调整您的 sonarqube-url 以引用主机系统。

因此您有多种选择:

  1. 使用主机系统的public ip
  2. 使用主机系统的docker ip
  3. 通过dns解析ip。 docker 有一个内部 DNS,如果这些容器 运行 在同一网络中,您通常可以通过容器名称访问它们。

旁注: 我不确定您使用的是 docker-compose 还是 kubernetes,但如果您不使用它,您可能还想深入研究 docker-compose,因为它只是一个简单的 yaml-config您可以轻松启动服务器。