我是jenkins和groovy的新手,不能找出Jenkins脚本的问题,如果我能得到一些关于如何调试问题的帮助/反馈,那就太好了。所以问题是jenkins没有标记构建失败(红色并将它们显示为绿色),但当您打开这些作业的日志时,您可以清楚地看到构建失败,因为存在编译器问题。正在讨论的构建版本是Windows Build和Windows Unit Tests。据我所知,这两个主要脚本是PipelineUtils.groovy,如下所示
def build_and_test_windows(fail_build_on_test) {
boolean run_tests = true
build_windows(run_tests, fail_build_on_test)
}
def get_results_on_failure(failBuildOnFailure) {
String buildResult = failBuildOnFailure ? "FAILURE" : "SUCCESS"
String stageResult = failBuildOnFailure ? "FAILURE" : "UNSTABLE"
return [buildResult, stageResult]
}
def build_windows(run_tests, fail_build_on_test) {
String buildResult
String stageResult
(buildResult, stageResult) = get_results_on_failure(fail_build_on_test)
node("windows"){
setupWorkspace()
try{
stage('Windows Build') {
timeout(time: 60, unit: 'MINUTES') {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat"
}
}
if (run_tests) {
stage('Windows Unit Tests') {
catchError(buildResult: buildResult, stageResult: stageResult) {
timeout(time: 60, unit: 'MINUTES') {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat TRUE"
}
}
}
}
}finally{
cleanWorkspace()
}调用脚本如下所示
boolean MANDATORY_TESTS = true
...
...
try{
...
parallel
'Windows' : {
pipeline_utils.build_and_test_windows(MANDATORY_STAGE)
...
...
completed = true
}catch(Exception error){
currentBuild.result = "FAILURE"
pipeline_utils.notifyPipelineFailed(currentBuild)
pipeline_utils.reportBuildResultToCloudwatch("1")
throw(error)
} finally {
if (completed && currentBuild.result != 'FAILURE') {
pipeline_utils.upload_stable_sdk()
def emailList = SUCCESS_EMAIL_LIST ?: ""
pipeline_utils.notifyPipelineSuccess(currentBuild, emailList);
pipeline_utils.reportBuildResultToCloudwatch("0")
}
}现在,windows.bat文件在这两个实例中都失败了,并且存在编译器问题,它的最后一行是
make: *** [Makefile:161: all] Error 2现在,即使bat脚本失败,我也看到两个阶段作业在jenkins上都显示为绿色,我还尝试将catchError添加到Windows Build阶段,如下所示
node("windows"){
setupWorkspace()
try{
stage('Windows Build') {
catchError(buildResult: buildResult, stageResult: stageResult) {
timeout(time: 60, unit: 'MINUTES') {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat"
}
}
}
if (run_tests) {
stage('Windows Unit Tests') {
catchError(buildResult: buildResult, stageResult: stageResult) {
timeout(time: 60, unit: 'MINUTES') {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat TRUE"
}
}
}
}
}finally{
cleanWorkspace()
}但是现在windows build stage job在Jenkins上失败了,并且是红色的,但是'Windows Unit Tests'仍然显示为绿色,即使日志表明它应该由于编译问题而失败。
将是伟大的,如果有人可以帮助我了解发生了什么和如何调试/fix脚本,基本上是试图修复脚本,使两个作业失败,如果bat脚本有错误。
发布于 2021-10-15 20:28:57
catchError步骤不会在失败时停止构建。这意味着它下面的所有代码都会被执行,而不管在它里面执行的操作的结果是什么。示例:
stage('1') {
catchError {
error 'fail build'
}
}
stage('2') { // this stage is executed
echo 'stage 2'
}
stage('3') { // this stage is also executed
echo 'stage 3'
}在try-finally块中执行build_and_test_windows方法。最简单的选择是根本不使用catcheError步骤。当Windows Build失败时,整个构建应该失败。它被赋予OOTB:
stage('Windows Build') {
timeout(time: 60, unit: 'MINUTES') {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat"
}
}可以使用unstable步骤将测试标记为不稳定的测试:
stage('Windows Unit Tests') {
timeout(time: 60, unit: 'MINUTES') {
try {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat TRUE"
} catch(e) {
unstable "Tests have failed"
}
}
}但是,当您将测试标记为不稳定时,catch中的逻辑将不会执行:
} catch (Exception error){
currentBuild.result = "FAILURE"
pipeline_utils.notifyPipelineFailed(currentBuild)
pipeline_utils.reportBuildResultToCloudwatch("1")
throw(error)
} finally {如果你也必须通知不稳定的测试,那么我不认为将舞台标记为黄色而不是红色值得引入大量的hack。没有任何附加逻辑的代码可以完成您所需的工作:
stage('Windows Unit Tests') {
timeout(time: 60, unit: 'MINUTES') {
bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat TRUE"
}
}https://stackoverflow.com/questions/69577036
复制相似问题