繁体   English   中英

在 jenkins 管道节点内时,Sonarqube 质量门卡在待处理状态

[英]Sonarqube quality gate stuck on pending when inside jenkins pipeline node

我们正在尝试添加 Sonarqube 扫描作为 Jenkins 管道脚本的一部分。 我们有一个多模块 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}"
            }
        }
    }
}

但出于某种原因,这会使质量门卡在 PENDING 状态,直到达到超时。 我试图了解为什么会发生这种情况,以及可以做些什么来避免将质量门检查移到节点之外。

任何帮助将不胜感激!

waitForQualityGate对 SonarQube 服务器执行HTTP 调用

确保您的构建节点可以通过 HTTP 访问您的 SonarQube 实例(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}"
                }
            }
        }
    }

可以相应地配置超时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM