Jenkins 构建不会在 OWASP 依赖检查器发现漏洞的管道阶段失败

Jenkins build not failing at pipeline stage where OWASP Dependency Checker finds vulnerabilities

当 OWASP 依赖性检查器发现并报告发现的漏洞时,我试图在管道阶段使我的 Jenkins 构建失败 。但相反,即使发现漏洞,它也会继续前进并执行所有后续阶段。我的 Jenkinsfile 看起来像这样:-

pipeline {
    tools {
        nodejs "nodejs"
    }
    stages {
        stage('install') {
            steps {
                // 'ci' install node modules
                sh 'npm ci'
            }
        }
        stage('Dependency Check') {
            steps {
                sh 'npm prune --production'
                sh "mkdir -p build/report"
                sh "'$DEPENDENCY_PATH' --project demoProject --disableRetireJS --suppression 'dependency-check-suppressions.xml' --format XML --out 'build/report/dependency-check-report.xml' --scan ."
                dependencyCheckPublisher pattern: 'build/report/dependency-check-report.xml', failedTotalCritical: '0', failedTotalHigh: '0', failedTotalLow: '0', failedTotalMedium: '0'
            }
        }
        stage('Test Step') {
            steps {
                sh 'echo "Reaching test step"'
            }
        }
    }
}

环境。变量 '$DEPENDENCY_PATH' 包含 dependency-check.bat 文件的位置。 OWASP Dependency Checker 发现并报告了我在 dependency-check-report.xml 中看到的漏洞,最后它也无法构建。 但是我不希望最后阶段的测试步骤也被执行。如果发现任何漏洞,我希望 Jenkins 构建在依赖性检查阶段失败。 我哪里做错了?

DependencyCheckPublisher 似乎抛出了一个错误,但 Jenkins 无法在此时捕捉到它,但最后它检查了相同的错误并导致构建失败。为了在 DependencyCheckPublisher 抛出错误的确切位置捕获错误,我必须引入一个 rawBuild 控制台输出检查,检查 DependencyCheckPublisher 是否打印了任何关于超出漏洞计数的信息。在 dependencyCheckPublisher 步骤后添加 -

if (currentBuild.rawBuild.getLog(50).contains('[DependencyCheck] Findings exceed configured thresholds')) {
        error("Build failed due to vulnerabilities found during dependencyCheck")    
}else{
        sh 'echo "No vulnerabilities found during dependencyCheck"'
}

为此,您还需要允许 Jenkins 的 rawBuildgetLog 调用权限。您可以从 Jenkins -> Manage Jenkins -> In-process Script Approval 并允许它们。(如果您不允许它们,那么 Jenkins 构建将失败并在控制台中失败构建的输出你可以找到关于这个的详细信息)

不需要白名单的更简单的方法:

         dependencyCheckPublisher (
            pattern: '**/build/reports/dependencyCheck/dependency-check-report.xml',
            failedTotalLow: 1,
            failedTotalMedium: 1,
            failedTotalHigh: 1,
            failedTotalCritical: 1
          )
          if (currentBuild.result == 'UNSTABLE') {
            unstable('UNSTABLE: Dependency check')
          } else if (currentBuild.result == 'FAILURE') {
            error('FAILED: Dependency check')
          }