Azure容器内Pipeline连接SonarQube失败问题求助
初始问题:域名解析失败报错
报错信息
[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信任存储中,步骤如下:
确定Java cacerts路径
- Windows容器:通常为
C:\Program Files\Java\jdk<版本号>\jre\lib\security\cacerts - Linux容器:通常为
/usr/lib/jvm/java-<版本号>-openjdk/lib/security/cacerts
- Windows容器:通常为
使用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,若已修改需替换为实际密码。优化方案(可选)
若频繁执行构建,可将证书预先导入到自定义容器镜像中,避免每次构建重复执行导入步骤,提升构建效率。
内容的提问来源于stack exchange,提问作者John Z

