使用 Jenkins 在 SonarScanner 中读取超时

Posted

技术标签:

【中文标题】使用 Jenkins 在 SonarScanner 中读取超时【英文标题】:Read timed out in SonarScanner using Jenkins 【发布时间】:2020-01-11 09:54:45 【问题描述】:

在执行与 Jenkins 集成的 SonarScanner 分析期间,控制台输出中会提示显示以下消息:

INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 3:33.658s
INFO: Final Memory: 5M/24M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
ERROR: Unable to load component class org.sonar.scanner.scan.ProjectConfiguration
ERROR: Caused by: Unable to load component class org.sonar.scanner.scan.ProjectServerSettings
ERROR: Caused by: Fail to request http://sonarqube:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste
ERROR: Caused by: timeout
ERROR: Caused by: Read timed out

OBS:我将 Docker 用于 JenkinsSonarQube

来自 sonar.properties 的自定义值:

sonar.jdbc.username=YYYY
sonar.jdbc.password=XXXX
sonar.jdbc.url=jdbc:postgresql://sonarqube_db:5432/YYYY
sonar.jdbc.maxActive=1000
sonar.jdbc.maxIdle=8
sonar.jdbc.minIdle=4
sonar.jdbc.maxWait=0
sonar.web.host=0.0.0.0
sonar.web.context=/sonarqube
sonar.web.port=9000

Docker 编写文件:

version: "3.7"
services:
  jenkins:
    image: jenkins/jenkins:lts-jdk11
    container_name: jenkins-container
    restart: always
    labels:
      br.com.topfornecedores.descricao: "Jenkins CI/CD"
    networks:
      - software_qa
    volumes:
      - ./Jenkins/volumes/home:/var/jenkins_home
    expose:
      - 8080 
      - 50000
    ports:
      - 8088:8080 
      - 50055:50000
    depends_on:
      - sonarqube
  sonarqube_db:
    build: ./SonarQube_PostgreSQL
    container_name: sonarqube_db-container
    restart: always
    labels:
      br.com.topfornecedores.descricao: "Banco de dados do SonarQube"
    volumes:
      -  postgresql-volume:/var/lib/postgresql/data
    expose:
      - 5432
    ports:
      - 5432:5432
    networks:
      - software_qa 
    healthcheck:
      test: ["CMD", "pg_isready -U postgres"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 40s
  sonarqube:
    build: ./SonarQube
    container_name: sonarqube-container
    restart: always
    labels:
      br.com.topfornecedores.descricao: "SonarQube análises de qualidade de código e segurança"
    volumes:
      - "./SonarQube/volumes/conf:/opt/sonarqube/conf"
      - "./SonarQube/volumes/data:/opt/sonarqube/data"
      - "./SonarQube/volumes/logs:/opt/sonarqube/log"
    environment:
      - SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_db:5432/sonardb
      - SONARQUBE_JDBC_USERNAME=sonarusuario
      - SONARQUBE_JDBC_PASSWORD=sonarusuariosenha
    expose:
      - 9000
    ports:
      - 9000:9000
      - 9002:9002
    depends_on:
      - sonarqube_db
    networks:
      - software_qa
networks:
  software_qa:
    driver: "bridge"
volumes:
    postgresql-volume:
      name: postgresql-volume

我可以在浏览器中访问网址:http://sonarqube:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste,就可以了。

版本: SonarQube:7.9.1 SonarScanner Jenkins 插件:2.6.1 詹金斯:lts-jdk11 Docker Windows 桌面:2

这个错误是什么原因造成的?

【问题讨论】:

更好地发布您的 docker compose?是否也都在运行 Docker 容器? @Adiii 是的,两者都在单独的容器中运行,我将发布 docker compose 发布答案请查看@Ricardo 【参考方案1】:

您的数据库容器在 docker-compose 中不同,并且 URL 不同,这就是您超时的原因。

  sonarqube_db:
    build: ./SonarQube_PostgreSQL
    container_name: sonarqube_db-container

由于错误日志是

http://sonarqube:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste
ERROR: Caused by: timeout ```

你需要更新

SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_db:5432/sonardb

SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_db-container:5432/sonardb

sonarqube 的情况相同,您正在为您的容器分配一个名称,因此当您想从其他容器访问时应该使用 sonarqube-container

  sonarqube:
    build: ./SonarQube
    container_name: sonarqube-container

喜欢

ERROR: Caused by: Fail to request http://sonarqube:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste

改成

http://sonarqube-container:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste

【讨论】:

您好 Adii,我尝试了您的解决方案,但没有任何效果,没有“-container”我可以打开 SonarQube,Jenkins,在 Sonarqube 中添加一个新项目,生成令牌。 容器名可能不是原因但尝试删除容器名或尝试使用主机IP调试,使用主机IP和端口http://HostIP:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste调用

以上是关于使用 Jenkins 在 SonarScanner 中读取超时的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 上的 Sonarscanner:在 JAVA_HOME 或 PATH 中找不到“java”可执行文件

gitlab+jenkins+maven+docker持续集成——sonarqube及sonarscanner代码审查

SONARSCANNER命令行执行

SonarScanner 整合 SonarQube 代码质量检查完美方案

sonar+Jenkins注意的关键点或坑及sonar规则忽略或修改

在 Jenkins 上配置 SonarQube