当前位置: 首页 > 面试题库 >

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

洪飞扬
2023-03-14
问题内容

我们正在使用 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文档上找不到任何提供这种方法的好方法。

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


问题答案:

我还不喜欢在 舞台{}* 中使用多余的 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)
    })
}


 类似资料:
  • 我希望能够在Jenkins中包装一个“阶段”,这样我就可以在一个阶段的开始和结束时执行自定义代码,比如: 我想我可以通过使用元类来做到这一点: 但是Groovy脚本本身似乎是一个绑定,它没有元类: 我还在学习Groovy和Jenkins管道是如何工作的,所以也许我只是错过了一些东西。

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

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

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

  • 问题内容: 如何 从Jenkinsfile(groovy)中获取Jenkins中管道配置字段“脚本路径”的内容? 在此处输入图片说明 在此示例中:我想在 执行Jenkinsfile本身时获取字符串’Apps / mq-logger / Jenkinsfile’ 。 问题答案: 您可以通过这种方式获取脚本路径 请注意,您必须approve 所有这些方法。

  • 问题内容: 我正在尝试在Jenkins脚本化管道中运行条件步骤,但是我不确定如何仅在上一步成功的情况下运行步骤。例如,在以下情况中,如果“测试”阶段成功,我只想运行“推送工件”阶段: 我知道声明性管道允许您使用“后”条件,但是我对Jenkins中的声明性管道与脚本化管道的理解是,脚本化管道提供了更大的灵活性。有没有一种方法可以基于脚本管道中其他阶段的成功来运行阶段? 问题答案: 在詹金斯管道中没有