You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure容器内Pipeline连接SonarQube失败问题求助

容器中Azure Pipeline的SonarQubePrepare@6任务连接失败问题排查与解决

初始问题:域名解析失败报错

报错信息

[error][SQ] API GET '/api/server/version' failed, error is request to https://xxx-sonarqube.azurewebsites.net/api/server/version failed, reason: getaddrinfo ENOTFOUND xxx-sonarqube.azurewebsites.net.

根因分析

该报错说明容器内无法解析SonarQube服务器的域名,常见触发原因有两个:

  • 容器未配置代理:如果构建环境需要通过代理访问外部网络,容器默认不会继承代理主机的配置
  • 容器DNS配置异常:容器使用的DNS服务器无法解析目标域名

解决方案

配置容器代理

在Pipeline的job容器配置中直接添加代理环境变量:

jobs:
  - job: XXXXX
    displayName: 'XXXX'
    pool:
      name: XXXXX
      container:
          image: XXXX
          env:
            HTTP_PROXY: http://your-proxy-server:port
            HTTPS_PROXY: http://your-proxy-server:port
            NO_PROXY: localhost,127.0.0.1,.your-internal-domain.com
      workspace:
          clean: all

也可以在SonarQubePrepare任务前添加步骤手动设置环境变量:

# Windows容器
$env:HTTP_PROXY = "http://your-proxy-server:port"
$env:HTTPS_PROXY = "http://your-proxy-server:port"
# Linux容器
export HTTP_PROXY=http://your-proxy-server:port
export HTTPS_PROXY=http://your-proxy-server:port

配置容器DNS

如果是DNS解析问题,可在容器配置中指定可靠的DNS服务器:

container:
  image: XXXX
  dns:
    - 8.8.8.8
    - your-internal-dns-ip

更新后问题:证书信任已手动导入但SonarQube任务仍报错

问题现象

  • 容器内已通过Import-Certificate导入证书,Invoke-WebRequest可正常访问SonarQube接口
  • SonarQubePrepare@6任务仍报相同的连接错误

根因分析

Import-Certificate是将证书导入Windows系统证书存储,但SonarQubePrepare任务依赖的SonarScanner CLI基于Java运行,Java会读取自身的信任存储(cacerts文件),而非系统证书存储,因此手动导入的证书未被Java环境识别。

解决方案

需要将证书导入Java的cacerts信任存储中,步骤如下:

  1. 确定Java cacerts路径

    • Windows容器:通常为C:\Program Files\Java\jdk<版本号>\jre\lib\security\cacerts
    • Linux容器:通常为/usr/lib/jvm/java-<版本号>-openjdk/lib/security/cacerts
  2. 使用keytool导入证书
    在SonarQubePrepare任务前添加执行keytool命令的步骤:

    # Windows容器示例
    keytool.exe -importcert -file "C:\path\to\your\cert1.cer" -alias sonarqube-cert1 -keystore "C:\Program Files\Java\jdk17\jre\lib\security\cacerts" -storepass changeit -noprompt
    keytool.exe -importcert -file "C:\path\to\your\cert2.cer" -alias sonarqube-cert2 -keystore "C:\Program Files\Java\jdk17\jre\lib\security\cacerts" -storepass changeit -noprompt
    
    # Linux容器示例
    keytool -importcert -file /path/to/your/cert1.cer -alias sonarqube-cert1 -keystore /usr/lib/jvm/java-17-openjdk/lib/security/cacerts -storepass changeit -noprompt
    keytool -importcert -file /path/to/your/cert2.cer -alias sonarqube-cert2 -keystore /usr/lib/jvm/java-17-openjdk/lib/security/cacerts -storepass changeit -noprompt
    

    注:Java cacerts默认密码为changeit,若已修改需替换为实际密码。

  3. 优化方案(可选)
    若频繁执行构建,可将证书预先导入到自定义容器镜像中,避免每次构建重复执行导入步骤,提升构建效率。

内容的提问来源于stack exchange,提问作者John Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:03:19