一尘不染

Jenkinsfile-脚本管道语法中的条件阶段执行

jenkins

我们正在使用 Script Pipeline 语法,Jenkinsfile其中定义了很多阶段来构建和部署代码。我们有一个用例,如果我要执行
完整构建,则要

运行所有阶段,但是如果需要执行一些AWS路由,则只运行一个特定阶段。我知道我可以使用if(<expression>)跳过阶段或运行阶段。问题是我不想将这个if条件应用于我的每个阶段Jenkinsfile

在新的 声明性管道
语法中,使用该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') {}

变成

  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') {}    
  }

这对我来说有点不客气,我在Jenkins文档上找不到任何提供这种方法的好方法。

有没有人有更好的方法来整合这一点?


阅读 576

收藏
2020-07-25

共1个答案

一尘不染

我还不喜欢在 舞台{}* 中使用多余的 if {} 块的想法。我通过覆盖以下阶段解决了这个问题 *

def stage(name, execute, block) {
    return stage(name, execute ? block : {echo "skipped stage $name"})
}

现在您可以按以下方式禁用阶段

stage('Full Build', false) { 
    ...
}

更新 您还可以使用以下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)
    })
}
2020-07-25