在不终止作业的情况下报告 Jenkins 管道中的 shell 个脚本测试错误
Reporting shell script test errors in Jenkins pipeline without killing job
在 Jenkins 管道中,报告 shell 使构建不稳定的脚本错误的推荐方法是什么(即,执行测试的脚本,但如果进一步失败,不应停止剩余的测试)
理想情况下,如果 'test' 脚本失败,我们不会取消构建,而是在最后报告错误。这可以通过用 catch 块包装 'sh' 个步骤并将构建标记为不稳定来实现。但是,如果我们使用单个管道,所有这些错误日志将混合在一个控制台日志中(我知道您也可以从管道视图向下钻取,但这需要寻找)。
是否有推荐的方法来报告这些错误?想法包括:
- 在数组中保存错误并在结束时打印
- 捕获输出并编写 junit 文件
- 某种插件有记录错误的步骤?如果有任何报告,这会将构建标记为不稳定?
例如
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,它以清晰的方式呈现流水线工作流程。
在 Jenkins 管道中,报告 shell 使构建不稳定的脚本错误的推荐方法是什么(即,执行测试的脚本,但如果进一步失败,不应停止剩余的测试)
理想情况下,如果 'test' 脚本失败,我们不会取消构建,而是在最后报告错误。这可以通过用 catch 块包装 'sh' 个步骤并将构建标记为不稳定来实现。但是,如果我们使用单个管道,所有这些错误日志将混合在一个控制台日志中(我知道您也可以从管道视图向下钻取,但这需要寻找)。
是否有推荐的方法来报告这些错误?想法包括:
- 在数组中保存错误并在结束时打印
- 捕获输出并编写 junit 文件
- 某种插件有记录错误的步骤?如果有任何报告,这会将构建标记为不稳定?
例如
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,它以清晰的方式呈现流水线工作流程。