当前位置: 首页 > 面试题库 >

Jenkins-尝试捕获特定阶段和后续条件步骤

卓云
2023-03-14
问题内容

我正在尝试在前一个阶段周围使用try / catch来复制Jenkins管道中条件阶段的等效内容,然后在该阶段之前设置一个成功变量,该变量用于触发条件阶段。

看起来,尝试catch块是可行的方法,将成功var设置为SUCCESS或FAILED,这将在以后的when语句中用作条件语句(作为条件阶段的一部分)。

我使用的代码如下:

pipeline {
    agent any
    stages {
        try{
            stage("Run unit tests"){
                steps{
                    sh  '''
                        # Run unit tests without capturing stdout or logs, generates cobetura reports
                        cd ./python
                        nosetests3 --with-xcoverage --nocapture --with-xunit --nologcapture --cover-package=application
                        cd ..
                    '''
                    currentBuild.result = 'SUCCESS'
                }
            }
        } catch(Exception e) {
            // Do something with the exception 
            currentBuild.result = 'SUCCESS'
        }

        stage ('Speak') {
            when {
                expression { currentBuild.result == 'SUCCESS' }
            }
            steps{
                echo "Hello, CONDITIONAL"
            }
        }
    }
}

我收到的最新语法错误如下:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup 
failed:
WorkflowScript: 4: Expected a stage @ line 4, column 9.
       try{

我也尝试了很多变化。

我在这里采用错误的方法吗?这似乎是一个相当普遍的要求。

谢谢。


问题答案:

这可能会解决您的问题,具体取决于您要做什么。阶段仅在前面的阶段成功时才运行,因此,如果您实际上有两个阶段(如示例中所示),并且如果您希望第二阶段仅在第一个阶段成功时才运行,则要确保在测试失败时第一个阶段适当地失败。捕捉将防止(理想的)故障。最终将保留故障,并且仍然可以用来获取测试结果。

因此,在这里,第二阶段仅在测试通过时运行,并且无论以下情况如何,都会记录测试结果:

pipeline {
  agent any
  stages {
    stage("Run unit tests"){
      steps {
        script {
          try {
            sh  '''
              # Run unit tests without capturing stdout or logs, generates cobetura reports
              cd ./python
              nosetests3 --with-xcoverage --nocapture --with-xunit --nologcapture --cover-package=application
              cd ..
              '''
          } finally {
            junit 'nosetests.xml'
          }
        }
      }
    }
    stage ('Speak') {
      steps{
        echo "Hello, CONDITIONAL"
      }
    }
  }
}

请注意,我实际上是try在声明性管道中使用,但是就像StephenKing所说的那样,您不能只直接使用try(必须在脚本步骤中包装任意的Groovy代码)。



 类似资料:
  • 问题内容: 仅在构建特定分支时,如何运行构建步骤/阶段? 例如,仅在调用分支的情况下才运行部署步骤,而其他所有都保持不变。 问题答案: 在声明性管道语法中执行相同的操作,以下是一些示例: 出现更有效的方法-https: //issues.jenkins- ci.org/browse/JENKINS-41187 另请 参阅- https://jenkins.io/doc/book/pipeline/

  • 仅当构建特定分支时,如何运行构建步骤/阶段? 例如,仅当分支被称为时才运行部署步骤,其他操作保持不变。

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 我正在将在UI中配置的Jenkins作业转换为使用声明性管道脚本配置的作业。 这是一个maven构建的Java项目,具有部署到Artifactory的构建后操作 构建和测试步骤很简单。我们可以使用这个UI 并将其转换为mvn命令。 构建后步骤的配置在UI中很简单 选中了三个文本框 部署maven工件 过滤器从构建信息中排除了工件(我不认为有任何) 捕获并发布构建信息 这会生成并上传丰富的build

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 我有一个返回< code>List的方法。现在我想知道如何正确放置< code>try/catch块。如果我将< code>return语句放在< code>try中,我会得到错误 并非所有代码路径都返回值 如果我放置在之后(就像我目前所做的那样),即使在之后,它也会返回。那么最好的方法应该是什么? 方法如下: