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

仅在上一阶段在Jenkins脚本化管道中成功时才运行阶段

卜和悌
2023-03-14
问题内容

我正在尝试在Jenkins脚本化管道中运行条件步骤,但是我不确定如何仅在上一步成功的情况下运行步骤。例如,在以下情况中,如果“测试”阶段成功,我只想运行“推送工件”阶段:

node ('docker2') {

    stage ('Build') {
        // build application
    }

    stage ('Test') {
        // run tests
    }

    stage ('Push Artifacts') { 
        if (Tests Were Successful) {  
            // push to artifactory
        }
    }
}

我知道声明性管道允许您使用“后”条件,但是我对Jenkins中的声明性管道与脚本化管道的理解是,脚本化管道提供了更大的灵活性。有没有一种方法可以基于脚本管道中其他阶段的成功来运行阶段?


问题答案:

在詹金斯管道中没有成功步骤或失败步骤的概念。只有构建状态(成功,失败,不稳定等)

您可以通过两种方式解决问题:

第一。如果测试失败(使用“错误” jenkins步骤),则可以使管道失败。例如:

stage('Build') {
    // build application
}

stage('Test') {
    def testResult = ... // run command executing tests
    if (testResult == 'Failed') {
        error "test failed"
    }
}

stage('Push Artifacts') {
    //push artifacts
}

或者,如果您的命令在测试失败时传播错误(例如“ mvn test”),则可以这样编写:

stage('Build') {
    // build application
}

stage('Test') {
    sh 'mvn test'
}

stage('Push Artifacts') {

}

在这些情况下,如果测试失败,您的管道就会失败。“测试”阶段之后的任何阶段都不会执行。

第二。如果只想执行某些步骤,则应根据执行的步骤将测试结果写入变量。您可以在运行步骤之前分析该变量的值。例如:

stage('Build') {
    // build application
}

boolean testPassed = true
stage('Test') {
    try{
        sh 'mvn test'
    }catch (Exception e){
        testPassed = false
    }
}

stage('Push Artifacts') {
    if(testPassed){
        //push to artifactory
    }
}


 类似资料:
  • 我希望能够在Jenkins中包装一个“阶段”,这样我就可以在一个阶段的开始和结束时执行自定义代码,比如: 我想我可以通过使用元类来做到这一点: 但是Groovy脚本本身似乎是一个绑定,它没有元类: 我还在学习Groovy和Jenkins管道是如何工作的,所以也许我只是错过了一些东西。

  • 我有一个简单的Jenkins管道,它创建了一个包含3个容器的pod——jnlp、dind和示例测试 如下所示- 还定义了几个阶段- 现在我的根文件夹中有了这个脚本“示例”,我想运行它,但不知怎么的,它找不到。 Dockerfile看起来像这样- pwd返回“/home/jenkins/agent/workspace/test pipeline”,而不是docker容器路径。 结果如下- 你知道怎么

  • 我们有一个Jenkins脚本管道,包含6个阶段。我需要在每个阶段结束时调用RESTAPI,将阶段的状态推送到Cassandra DB。在詹金斯管道中有没有一种有效的方法? 目前,我正在每个阶段结束时调用一个状态为的函数。我必须在所有阶段编写这段代码,即使阶段成功或失败。

  • 我有一个多分支管道架构的以下Jenkinsfile 我试图在Ubuntu和Red Hat节点上并行运行“构建”阶段,而仅在Ubuntu节点上运行“测试”阶段。 任何人都可以帮助我指定如何选择在哪些节点上运行哪些阶段。我在网上找到的解决方案很少,但他们建议重写构建阶段两次:一次用于Red Hat节点,另一次用于Ubuntu节点。难道没有办法在没有代码重复的情况下做到这一点吗? 非常感谢

  • 我正在编写一个Groovy脚本,其中包含部署terraform的作业。我正在使用作业DSL并使种子作业由JCasC实现,一切正常。然后我有一个包含作业的Groovy文件的存储库。 如果我将Groovy文件保持为单个作业,它就可以正常工作。 然而,我希望能够构建具有构建阶段的管道。我知道我可以把管道写在詹金斯文件中 我有这个作为开始: 但是,我看到了这个错误: 我已经尝试了各种方法,并阅读了一堆文档

  • Jenkins版本=2.19 Jenkins多分支管道插件版本=2.92 我有一个Jenkinsfile,其中有一些基于分支的条件阶段。 为了简洁起见,这是我的Jenkinsfile的修改版本: 我正在使用多分支管道插件。 它成功地检测并构建了我所有的分支。 我的问题是,所有构建报告为失败,即使我悬停每个阶段,它报告'成功'。 我附上了一张图片,显示了一个功能分支,其中我想要运行的两个阶段已经运行