无法在舞台内跳过舞台

2024-01-08

我有一个阶段在一个阶段内,我想根据条件跳过它when -

pipeline {
    agent any

    stages {
        stage("Dynamic stages") {
            steps {
                script {
                    serverAStatus = false
                    def tests = CLIENTS.split(',')
                    def builders = [:]
                    for (test in tests) {
                        def test1 = test
                        builders[test] = {

                            stage("Test ${test1}") {
                                 when {
                                expression {
                                    (serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")))

                                }
                            }
                                node('master') {
                                    script {
                                        echo "Executing stage ${test1}"
                                        echo "Client is " + test1
                                    }
                                }
                            }
                        }

                    }
                    parallel builders
                }
            }
        }
    }
}

但这给出了错误 -No such DSL method when inside steps

代替when,我尝试在阶段内使用 if 语句,例如 -

if ((!serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")))) {
      echo "******************************************************"
      Utils.markStageSkippedForConditional(STAGE_NAME)
}

但这并不会跳过阶段。

请帮助我如何在我的场景中跳过舞台,因为我已经在舞台内表演了。


首先,为了澄清一些误解,定义一个实际上是有效的stage里面的一个script步。这是向声明性管道动态添加阶段的常见模式。

在一个script步骤,应用脚本化管道的规则。脚本化管道有一个stage功能,不需要steps甚至script孩子们。一切都在脚本之内stage还使用脚本语法。

您只需使用 Groovy 即可跳过脚本阶段if陈述:

script {
    if( serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")) ) {
        stage('A Stage') {
            echo 'Hello'
        }
    }
}

这样做的缺点是舞台将完全被missing从蓝海管道来看。

我们其实想要的是展示舞台,但在skipped状态,正如我们从声明性管道中使用的那样。这可以通过使用来实现当步骤时势在必行 https://github.com/comquent/imperative-when(有关的博客文章 https://comquent.de/en/skipped-stages-in-jenkins-scripted-pipeline/).

结果并不完美,因为 Blue Ocean 将在舞台上画一条直线(而不是围绕舞台的曲线),但舞台按钮代表跳过状态。

按照描述包含共享库后博客文章 https://comquent.de/en/skipped-stages-in-jenkins-scripted-pipeline/,我们现在可以写:

script {
    stage("Test ${test1}") {
        when( serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")) ) {
            echo 'Hello'
        }
    }
}

这是使用“命令式”重写的完整示例,并删除了一些过时的代码:

pipeline {
    agent any

    stages {
        stage("Dynamic stages") {
            steps {
                script {
                    serverAStatus = false
                    def tests = CLIENTS.split(',')
                    def builders = [:]
                    for (test in tests) {
                        def test1 = test
                        builders[test] = {

                            stage("Test ${test1}") {
                                when( serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")) ) {
                                    node('master') {
                                        echo "Executing stage ${test1}"
                                        echo "Client is " + test1
                                    }
                                }
                            }
                        }

                    }
                    parallel builders
                }
            }
        }
    }
}

为了样本的缘故,node('master')也可以被删除。我将其保留,因为您可能希望在多个节点上并行运行并行阶段。在这种情况下,您可以将“master”替换为公共节点标签或根据变量传递显式节点名称test1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在舞台内跳过舞台 的相关文章

随机推荐

  • 如何从存储中获取准确的容量

    我想以编程方式从实习存储中读取确切的容量 我使用的是 Samsung Galaxy S7 Edge 32GB 设备 在预装的三星文件管理器 德语 Eigene Dateien 中 它显示了 32GB 的总容量 即使在菜单 gt 设置 gt
  • 实体框架 - 通过同一列中的多个条件进行选择 - 引用表

    示例场景 两张表 order and 订单项目 关系一对多 我想选择至少有一个价格为 100 的 orderItem 和至少一个价格为 200 的 orderItem 的所有订单 我可以这样做 var orders from o in ko
  • 用于查找给定文档的词频的 Python 脚本

    我正在寻找一个简单的脚本 可以找到给定文档的单词频率 可能通过使用便携式词干分析器 是否有任何库或简单的脚本可以执行此过程 use nltk http www nltk org import nltk YOUR STRING Your wo
  • Typescript Node.js 最简单的设置不起作用 - 错误 TS2307:找不到模块“fs”

    我已经全局安装了 TS 和节点类型 PS C Projects Test gt npm list global depth 0 C Users Jan AppData Roaming npm types email protected cd
  • 我知道react-native的TextInput有一个onsubmit回调函数,但是我实际上如何制作那个提交按钮?

    我想知道如何呈现此按钮 如果是的话 它是否会自动绑定到输入字段中的文本 基本上onSumbitEditing当从 Android 软键盘上单击 go 按钮时 将触发并提供事件 如下例所示
  • 承诺:转到下一个错误函数[重复]

    这个问题在这里已经有答案了 如何使用 Promise 链调用下一个错误函数 我认为错误函数内的返回会自动调用下一个错误函数 Called in a controller dataService saveRequest then functi
  • 如何在VSCODE中设置tasks.json文件来编译Fortran程序?

    我想设置 VScode 操作系统 Windows 10 来创建并编译用 Fortran 90 95 编写的程序 我可以通过在终端中输入以下内容来完成此操作 gfortran o Example exe Example f90进而 Examp
  • 捕获 python 程序的标准输出

    我正在尝试编写一个 C 程序来捕获 python 程序中的标准输出 我的问题是所有输出都是在程序执行之后而不是实际发生时出现的 举个例子 对于这个 python 程序 print Hello time sleep 2 print Hello
  • 在 net core 控制台应用程序中使用 Web 服务器进行简单路由

    我在使用 kestrel 进行路由时遇到问题 我找不到任何关于如何在 netcore 控制台应用程序内部实现此功能的好的教程 我想构建一个简单的 Web 服务器 它有 2 3 个可以访问的端点 public class WebServer
  • 由于非 Ascii 字符,顶点着色器无法编译?

    因此 我开始使用 OpenGL 与 glew 和 GLFW 来创建游戏引擎 在开始使用着色器时我几乎立即遇到了问题 它们没有被使用或者即使被使用也没有任何效果 我一直在用大量其他示例检查我的代码 它们都匹配 没有任何看起来不合适的地方 我开
  • 访问控制允许来源语法

    我希望允许所有的跨源资源共享from example com 的子域 因此 我将如下所示的跨源资源共享标头添加到了页面中subdomain1 to example com
  • 如何将全部破坏限制为仅长单词?

    我正在尝试全部打破很长的单词 还有一些很长的uuid col在基于引导程序的模板中 但是当我对所有列使用以下样式时 它会破坏所有内容 在示例中检查不良破坏 即使单词正常换行的地方工作得很好 在示例中检查预期破坏 有没有办法我可以尽可能使用正
  • Webpack 无法加载字体(ttf)

    目前我有 3 种字体想要添加到我的 React 项目中 一个 一个光 一个大胆 我的文件结构 src fonts A ttf A light ttf A bold ttf styles base base scss styles scss
  • 限制对 C++ 中特定类的方法访问

    我有两个密切相关的类 我将其称为 Widget 和 Sprocket Sprocket 有一组方法 我希望可以从 Widget 调用它们 但不能从任何其他类调用它们 我也不想仅仅将 Widget 声明为 Spocket 的友元 因为这将使
  • 如何访问 OpenCV Matcher 上的点位置?

    我正在使用这个 FLANN 匹配器算法来匹配 2 张图片中的兴趣点 代码如下所示 有时代码会找到匹配点的列表 std vector
  • 向 Python 添加宏

    我想调用以下代码in situ无论我提到什么MY MACRO在我下面的代码中 MY MACRO frameinfo getframeinfo currentframe msg We are on file frameinfo filenam
  • 归并排序,递归部分

    研究了几天合并排序后 我从概念上理解了它 但有一点我不明白 我得到什么 1 它需要一个列表 例如一个数字数组 将其分成两半并对两半进行排序 最后将它们合并在一起 2 因为它是一种递归算法 所以它使用递归来做到这一点 因此 上述数组的分割如下
  • 自动代码签名 - 保护私钥

    我想要自动执行一些 ClickOnce 部署工件 应用程序 exe 和清单 的代码签名 我在用signtool http msdn microsoft com en us library windows desktop aa387764 2
  • Java 中前导零如何改变数字文字?

    我和我的朋友在看到它和答案后对Java中的这个说法感到困惑 这是如何运作的 System out printf d 077 等于63 077 is an octal number http en wikipedia org wiki Oct
  • 无法在舞台内跳过舞台

    我有一个阶段在一个阶段内 我想根据条件跳过它when pipeline agent any stages stage Dynamic stages steps script serverAStatus false def tests CLI