当前位置: 首页 > 知识库问答 >
问题:

跳过 jenkins 管道中的某个阶段而不调用代理?

何长恨
2023-03-14

我们在工作描述中使用jenkins pipeline dsl。现在我们有了这样的东西:

pipeline {
  agent none 

  options {
    timestamps() 
  }

  environment { 
    //SOME ENV VARS
  }

  stages {
    // more stages
    stage('stage1'){
    when {
         expression { env.BRANCH_NAME == 'master' }
         }
    agent { label 'slave1' }
    steps{
       //doing stuff
    }
  }
}

生成过程中的一个阶段,仅当生成主分支时才应运行,您可以考虑部署作业或该方向的任何内容。问题是,我们带有该特定标签的代理商资源有限。当我们构建其他分支时,作业仍然调用slaver1代理,并且在检查分支不是主分支后跳过该阶段。这很糟糕,因为当所有 slave1 代理都在主分支作业上工作时,其他作业将不得不等待 slave1 代理可用,以检查它是否确实需要运行该阶段。

jenkins管道DSL是否有任何方法可以跳过该阶段而不等待slave1代理确定分支?

共有2个答案

松鸣
2023-03-14

我找到了一个对我有用的解决方案。虽然我不太确定为什么。但是,引入并行部分并使用节点修复了问题,并且在不首先调用代理的情况下跳过了各个阶段。请参阅修改后的管道:

pipeline {
  agent none 

  options {
   timestamps() 
  }

  environment { 
    //SOME ENV VARS
  }

  stages {
    // more stages
    stage('stage1'){
    when { branch 'master' }
    steps{
      parallel(
        'Job1': {
           node( 'slave1' ){
             //doing stuff
           }
        }
      )
    }
  }
}
崔宇
2023-03-14

已接受的答案中提供的方法有效,因为您没有在阶段(“stage1”)中声明代理。相反,您在步骤中显式创建一个节点,因此在检查条件时不会创建代理。

这种方法是可行的,但是它给你的Jenkinsfile增加了不必要的复杂性。从Jenkins pipeline插件版本1.2.6开始,实现这一点的正确方法应该是:

pipeline {
  agent none 
  stages {
    // more stages
    stage('stage1'){
      when {
        beforeAgent true
        branch 'master'
      }
      agent { label 'slave1' }
      steps { 
        // do stuff 
      }
    }
  }
}

检查when标记文档中的语法和可用选项。

 类似资料:
  • 在声明性多分支Jenkins管道中,我只希望在Git标记存在的情况下运行一个阶段。出于测试原因,我设置了一个简单的虚拟管道。但是,始终跳过阶段。我检查了Git标签是否存在,并且我也推了标签,但这似乎没有任何效果。 詹金斯文件 Jenkins构建的控制台输出 克隆存储库的日志输出

  • 我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行

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

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

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

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