服务器无法访问到 Jenkins 的 SonarQube Webhook
Posted
技术标签:
【中文标题】服务器无法访问到 Jenkins 的 SonarQube Webhook【英文标题】:Server Unreachable SonarQube Webhook to Jenkins 【发布时间】:2021-12-21 01:18:31 【问题描述】:我们有两台服务器,一台在 Docker Swarm 中运行 Jenkins,另一台运行 SonarQube。在过去几年中,Jenkins 管道成功触发了声纳扫描,并将 webhook 报告给 Jenkins。
但是在 Jenkins 端更新 SSL 证书(在集群的 ALB 上)后,webhook 只是不断地说“服务器无法访问”。 jenkins 的 URL 根本没有改变。
在 jenkins 方面,日志只是等待质量门超时。
SonarQube task 'AXz95fbXYt_5WKK0bZ00' status is 'IN_PROGRESS'
Cancelling nested steps due to timeout
Jenkinsfile
在质量门阶段看起来像这样:
timeout(time: 5, unit: 'MINUTES')
waitForQualityGate abortPipeline: true
【问题讨论】:
非常有趣。我刚刚检查了您是否在我的公司,因为我们看到在 Jenkins 实例上更改 SSL 的那天发生了完全相同的事情,并且从那以后它一直以这种方式失败。没有人能够弄清楚这一点。我们不得不实施变通办法。我想我会在答案中提供一些解决方法的想法。 【参考方案1】:正如我在评论中提到的,我们遇到了几乎完全相同的事件序列。在他们在我们的 Jenkins 实例上重新配置 SSL 的那一天,我们从 SonarQube 到 Jenkins 的 webhook 开始失败。那是一年多以前的事了。我们从未找到任何线索说明为什么会发生这种情况。
在某个时候,我得出的结论是,这将永远无法解决,因此我决定想出一个解决方法。了解“waitForQualityGate”中发生的逻辑会很有帮助。它所做的第一件事是对 SonarQube 进行 REST 调用,以确定后台任务是否完成。如果不是,则进入等待循环等待任务完成,不会成功完成。
因此,解决方法是确保“waitForQualityGate”启动时,我们确保后台任务已完成。有两种方法可以做到这一点。有一种策略非常简单,但也有缺点,还有一种稍微复杂一点的策略更聪明。
非常简单的策略就是在“waitForQualityGate”之前添加一个“sleep”。你睡多久真的取决于。如果你睡得太短,一些后台任务可能还没有完成,再次进入循环。如果你睡得太久,那么你就浪费时间坐在那里无所事事。
更好的策略是基本上使用“waitForQualityGate”中使用的相同逻辑,在重试循环中对 SonarQube 进行 REST 调用以检查后台任务的状态,并在状态报告任务完成。
这个逻辑看起来像这样:
String authString = "$sonarProps['sonar.login']:$sonarProps['sonar.password']"
// If webhooks aren't going to work, then we have to poll for the task ourselves. First, we have to figure
// out the task id.
def reportFilePath = "target/sonar/report-task.txt"
def reportTaskFileExists = fileExists "$reportFilePath"
if (reportTaskFileExists)
echo "Found report task file"
def taskProps = readProperties file: "$reportFilePath"
echo "taskId[$taskProps['ceTaskId']]"
while (true)
sleep 20
def taskStatusResult =
sh(returnStdout: true,
script: "curl -s -X GET -u $authString \'$sonarProps['sonar.host.url']/api/ce/task?id=$taskProps['ceTaskId']\'")
echo "taskStatusResult[$taskStatusResult]"
def taskStatus = new JsonSlurper().parseText(taskStatusResult).task.status
echo "taskStatus[$taskStatus]"
// Status can be SUCCESS, ERROR, PENDING, or IN_PROGRESS. The last two indicate it's
// not done yet.
if (taskStatus != "IN_PROGRESS" && taskStatus != "PENDING")
break;
【讨论】:
这个问题确实和你很相似!唯一的解决方案是在 Sonar 的服务器上添加 SSL 证书,但由于服务器本身由 3rd 方供应商维护,因此团队对此并不是很有信心。但我们目前正在做的是将 Jenkins 服务器上的证书更改为 Public。将让您随时了解发生的情况。再次感谢。以上是关于服务器无法访问到 Jenkins 的 SonarQube Webhook的主要内容,如果未能解决你的问题,请参考以下文章