Jenkinsfile - Script Pipeline语法中的条件阶段执行

Ali*_*gat 5 groovy jenkins jenkins-pipeline

我们正在使用Script Pipeline语法,Jenkinsfile它有很多阶段定义来构建和部署我们的代码.我有一个用例,如果我正在进行完整构建,我想运行所有阶段,但如果我需要执行一些AWS路由,则只运行一个特定阶段.我知道我可以使用if(<expression>)跳过舞台或跑舞台.问题是我不想将这个if条件应用到我的每个阶段Jenkinsfile.

在新的Declarative Pipeline语法中,使用该stage..when选项很容易实现.我们的基础结构中使用了很多自定义Groovy辅助函数,所以此时我无法从Script Pipeline语法切换到新的Declarative Pipeline语法.我最终在现有Jenkinsfile的东西上做的是这样的......

原来詹金斯文件

  stage('Checkout Code') {}
  stage('Build') {}
  parallel(
    stage('Sonar Analysis') {}
    stage('CLM Analysis') {}
    stage('Security Analysis') {}
  )
  stage('Build Docker Image') {}
  ...
  ...
  stage('QA Deploy') {}
  stage('QA Routing') {}
  ...
  ...
  stage('Prod Deploy') {}
  stage('Prod Routing') {}
Run Code Online (Sandbox Code Playgroud)

变成

  if (fullDeploy){
    stage('Full Build') {
        stage('Checkout Code') {}
        stage('Build') {}
        parallel(
          stage('Sonar Analysis') {}
          stage('CLM Analysis') {}
          stage('Security Analysis') {}
        )
        stage('Build Docker Image') {}
        ...
        ...
        stage('QA Deploy') {}
        stage('QA Routing') {}
        ...
        ...
        stage('Prod Deploy') {}
        stage('Prod Routing') {}          
    }
  }

  if (routeOnly){
    stage('Prod Routing') {}    
  } 
Run Code Online (Sandbox Code Playgroud)

这让我觉得有点hacky,我在Jenkins文档上找不到任何提供这种方法的好方法.

有没有人有更好的方法可以加入这个?

cul*_*mat 23

我也不喜欢在我的舞台{}中有一个冗余的if {}块的想法.我通过如下覆盖舞台解决了这个问题

def stage(name, execute, block) {
    return stage(name, execute ? block : {echo "skipped stage $name"})
}
Run Code Online (Sandbox Code Playgroud)

现在你可以按如下方式禁用一个阶段

stage('Full Build', false) { 
    ...
}
Run Code Online (Sandbox Code Playgroud)

更新 您还可以使用以下def标记跳过的阶段

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils

def stage(name, execute, block) {
    return stage(name, execute ? block : {
        echo "skipped stage $name"
        Utils.markStageSkippedForConditional(STAGE_NAME)
    })
}
Run Code Online (Sandbox Code Playgroud)