在不终止作业的情况下报告 Jenkins 管道中的 shell 个脚本测试错误

Reporting shell script test errors in Jenkins pipeline without killing job

在 Jenkins 管道中,报告 shell 使构建不稳定的脚本错误的推荐方法是什么(即,执行测试的脚本,但如果进一步失败,不应停止剩余的测试)

理想情况下,如果 'test' 脚本失败,我们不会取消构建,而是在最后报告错误。这可以通过用 catch 块包装 'sh' 个步骤并将构建标记为不稳定来实现。但是,如果我们使用单个管道,所有这些错误日志将混合在一个控制台日志中(我知道您也可以从管道视图向下钻取,但这需要寻找)。

是否有推荐的方法来报告这些错误?想法包括:

例如

def errors = []

try {
    sh "check-doc-style.sh | tee check-doc-style.log"
} catch (e)
    errors << "Doc style check failed : ${e}"
}
step([$class: 'ArtifactArchiver', artifacts: 'check-doc-style.log'])

try {
    sh "sanity-checks.sh | tee sanity-checks.log"
} catch (e)
    errors << "Sanity checks failed : ${e}"
}
step([$class: 'ArtifactArchiver', artifacts: 'sanity-checks.log'])

if (errors.size() > 0) {
    currentBuild.result = 'UNSTABLE'
    for (int i = 0; i < errors.size(); i++) {
        echo errors[i]; 
    }
}

对于上下文:我们正在从 Jenkins 设置(每个分支有十几个作业)迁移到单个 Jenkine 管道 Jenkinsfile 来表示整个事情。许多作业都是通过(退出代码 0)或失败的脚本测试。通过查看控制台日志查看错误消息。

退出代码处理

Shell

由于正在编写,管道插件不支持 return 退出代码或 sh 步骤的输出。然而,有一个开放的 ticket 可以跟踪此功能。因此 try / catch / finally 将是处理这种情况的默认方式。

还有其他方法,但这些方法相当麻烦,即。 :

  • 忽略 bash 中的非零退出代码,例如。 set +e
  • 将输出重定向到外部文件

行家

sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify"
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])

maven.test.failure.ignore 将 运行 所有测试,即使其中一些测试失败了。然后 JUnitResultArchiver 可以将构建状态设置为 'UNSTABLE'.

状态报告

  • 在我看来,如果您要进行 运行 测试,跟踪结果的最有意义的方法是使用 JUnitResultArchiver.

    来分析它们
  • 然而,如果另一方面您想收集 警告 然后根据重要性更改结果状态,请考虑使用一个阶段甚至创建专用阶段, IE。 stage "report",最终信息清晰可见。

Jenkins 2.0 包括 Stage View plug-in,它以清晰的方式呈现流水线工作流程。