首页 文章

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

提问于
浏览
0

我们使用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 回答

  • 1

    上述答案中提供的方法是有效的,因为您没有在阶段('stage1')声明代理,而是在步骤中明确创建节点,因此在检查条件时不会创建代理 .

    这种方法可行,但它为您的Jenkinsfile增加了不必要的复杂性 . 实现这一目标的正确方法是:

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

    检查when标记中可用的语法和可用选项:https://jenkins.io/doc/book/pipeline/syntax/#when

  • 2

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

    pipeline {
      agent none 
    
      options {
       timestamps() 
      }
    
      environment { 
        //SOME ENV VARS
      }
    
      stages {
        // more stages
        stage('stage1'){
        when { branch 'master' }
        steps{
          parallel(
            'Job1': {
               node( 'slave1' ){
                 //doing stuff
               }
            }
          )
        }
      }
    }
    

相关问题