在没有调用代理的情况下在jenkins管道中跳过一个阶段?

时间:2017-08-04 06:36:42

标签: jenkins jenkins-pipeline jenkins-slave

我们使用jenkins管道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
    }
  }
}

构建过程中的一个阶段只应在构建主分支时运行,您可以考虑部署作业或该方向的某些内容。问题是,我们对具有该特定标签的代理商的资源是有限的。当我们构建其他分支时,作业仍会调用slave1代理,而不是在检查分支不是主分支后跳过阶段。这很糟糕,因为当所有slave1代理正在处理主分支作业时,其他作业将不得不等待slave1代理变为可用,只是为了检查它是否需要运行该阶段。

有没有办法让jenkins管道DSL跳过那个阶段而不等待slave1代理确定分支?

2 个答案:

答案 0 :(得分:4)

接受的答案中提供的方法是有效的,因为您没有在舞台上宣布代理人(' stage1')。而是在步骤中明确创建节点,因此在检查条件时不会创建代理。

这种方法可行,但会给Jenkinsfile增加不必要的复杂性。截至Jenkins 管道插件版本1.2.6 ,实现此目的的正确方法是:

SystemExit

检查when tag documentation中提供的语法和可用选项。

答案 1 :(得分:1)

我找到了一个适合我的解决方案。虽然我不太清楚为什么。 引入并行部分并使用节点但是修复了问题并且跳过了阶段而不首先调用代理。请参阅修改后的管道:

pipeline {
  agent none 

  options {
   timestamps() 
  }

  environment { 
    //SOME ENV VARS
  }

  stages {
    // more stages
    stage('stage1'){
    when { branch 'master' }
    steps{
      parallel(
        'Job1': {
           node( 'slave1' ){
             //doing stuff
           }
        }
      )
    }
  }
}