我们正在尝试添加Sonarqube扫描作为Jenkins Pipeline脚本的一部分。我们有一个多模块的Maven项目,我们使用Maven Sonarqube插件来运行聚合的扫描。为了启动扫描,我们按照Sonarqube的文档中的说明进行了说明(向下滚动到页面末尾(。
所以管道脚本看起来像这样:
node {
stage('SonarQube analysis') {
withSonarQubeEnv('My SonarQube Server') {
sh 'mvn clean package sonar:sonar'
}
}
}
stage("Quality Gate") {
timeout(time: 1, unit: 'HOURS') {
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Pipeline aborted due to quality gate failure: ${qg.status}"
}
}
}
它可以按预期工作。但是,由于我们在多个文件中使用它,因此我们希望尽可能少地重复代码,因此我们希望在节点中使用它:
node {
stage('SonarQube analysis') {
withSonarQubeEnv('My SonarQube Server') {
sh 'mvn clean package sonar:sonar'
}
}
stage("Quality Gate") {
timeout(time: 1, unit: 'HOURS') {
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Pipeline aborted due to quality gate failure: ${qg.status}"
}
}
}
}
但是,由于某种原因,这会使质量大门陷入待处理状态,直到达到超时为止。我试图了解为什么会发生这种情况,以及可以做些什么以避免在节点外移动质量门检查。
任何帮助将不胜感激!
waitForQualityGate
对Sonarqube服务器执行HTTP调用。
确保您的构建节点对您的Sonarqube实例具有HTTP访问权(Jenkins Master访问它并不意味着构建节点也具有它(。
无论如何,正如我在评论中所说的那样,在node
内使用等待步骤通常不是一个好主意。
我也面临着同一问题,我通过在waitForQualityGate
阶段
sleep 10
stage("Quality Gate") {
timeout(time: 1, unit: 'HOURS') {
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Pipeline aborted due to quality gate failure: ${qg.status}"
}
}
}
这可能是重试的更好方法。
def retryForTimeoutExceeded(count = 3, Closure closure) {
for (int i = 1; i <= count; i++) {
try {
closure()
break
} catch (FlowInterruptedException error) {
int retriesLeft = count - i
def hasTimeoutExceeded = error.causes[0].getClass().toString() == 'class org.jenkinsci.plugins.workflow.steps.TimeoutStepExecution$ExceededTimeout'
println "Timeout Exceeded for clousre.nRetries left: $retriesLeft"
if (retriesLeft == 0 || !hasTimeoutExceeded) {
throw error
}
}
}
}
stage("Quality Gate") {
retryForTimeoutExceeded {
timeout(time: 5, unit: 'MINUTES') {
// Just in case something goes wrong, pipeline will be killed after a timeout
def qg = waitForQualityGate() // Reuse taskId previously collected by withSonarQubeEnv
if (qg.status != 'OK') {
error "Pipeline aborted due to sonar quality gate failure: ${qg.status}"
}
}
}
}
可以相应地配置超时