首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在jenkins脚本中的try块中运行多个阶段时出现问题

在jenkins脚本中的try块中运行多个阶段时出现问题
EN

Stack Overflow用户
提问于 2021-10-14 20:34:34
回答 1查看 77关注 0票数 0

我是jenkins和groovy的新手,不能找出Jenkins脚本的问题,如果我能得到一些关于如何调试问题的帮助/反馈,那就太好了。所以问题是jenkins没有标记构建失败(红色并将它们显示为绿色),但当您打开这些作业的日志时,您可以清楚地看到构建失败,因为存在编译器问题。正在讨论的构建版本是Windows BuildWindows Unit Tests。据我所知,这两个主要脚本是PipelineUtils.groovy,如下所示

代码语言:javascript
复制
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()
      }

调用脚本如下所示

代码语言:javascript
复制
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文件在这两个实例中都失败了,并且存在编译器问题,它的最后一行是

代码语言:javascript
复制
make: *** [Makefile:161: all] Error 2

现在,即使bat脚本失败,我也看到两个阶段作业在jenkins上都显示为绿色,我还尝试将catchError添加到Windows Build阶段,如下所示

代码语言:javascript
复制
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脚本有错误。

EN

回答 1

Stack Overflow用户

发布于 2021-10-15 20:28:57

catchError步骤不会在失败时停止构建。这意味着它下面的所有代码都会被执行,而不管在它里面执行的操作的结果是什么。示例:

代码语言:javascript
复制
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:

代码语言:javascript
复制
stage('Windows Build') {
  timeout(time: 60, unit: 'MINUTES') {
    bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat"
  }
}

可以使用unstable步骤将测试标记为不稳定的测试:

代码语言:javascript
复制
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中的逻辑将不会执行:

代码语言:javascript
复制
} catch (Exception error){
  currentBuild.result = "FAILURE"
  pipeline_utils.notifyPipelineFailed(currentBuild)
  pipeline_utils.reportBuildResultToCloudwatch("1")
  throw(error)
} finally {

如果你也必须通知不稳定的测试,那么我不认为将舞台标记为黄色而不是红色值得引入大量的hack。没有任何附加逻辑的代码可以完成您所需的工作:

代码语言:javascript
复制
stage('Windows Unit Tests') {
  timeout(time: 60, unit: 'MINUTES') {
    bat "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat TRUE"
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69577036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档