在Groovy脚本中是否可以将Jenkins流水线分配给变量并运行

109次阅读
没有评论

问题描述

在Groovy脚本中定义了一个流水线,该流水线有多个阶段。用户想将该流水线定义分配给一个变量,并在同一个Groovy脚本中稍后运行它。用户想知道是否有可能实现这个需求。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Groovy编程语言中,可以使用闭包(closures)的特性来实现你所描述的需求。
假设你有一个类似于以下示例的Groovy脚本:

node() {
    stage('A') {
        println("I'm stage A!")
    }
    stage('B') {
        println("I'm stage B!")
    }
}

你可以通过以下方式多次运行这个流水线:

node() {
    // 在这里创建闭包
    def reusablePipeline = {
        node() {
            stage('A') {
                println("I'm stage A!")
            }
            stage('B') {
                println("I'm stage B!")
            }
        }
    }
    // 运行流水线一次
    reusablePipeline()
    // 运行流水线第二次
    reusablePipeline()
}

如果所有的流水线都在相同的node()上运行,我们可以删除第二次定义:

def reusablePipeline = {
    stage('A') {
        println("I'm stage A!")
    }
    stage('B') {
        println("I'm stage B!")
    }
}

如果你发现可重用部分的作业非常长,你可能希望从第二个文件中加载它。你可以使用流水线的load函数来实现这一点。以下是一个示例:
将可重用的流水线放在一个新文件中,我将其命名为pipeline.groovy

// pipeline.groovy文件的内容
def doStuff() {
    stage('A') {
        println("I'm stage A!")
    }
    stage('B') {
        println("I'm stage B!")
    }
}
// 这一点非常重要
return this

现在你的流水线将如下所示:

node() {
    def reusablePipeline = load('pipeline.groovy')
    // 运行流水线一次
    reusablePipeline.doStuff()
    // 运行流水线第二次
    reusablePipeline.doStuff()
}

上述方法非常适用于具有一系列复杂步骤的流水线,并且希望根据某些条件多次调用这些步骤。一个常见的用例是使用不同的参数调用测试套件或者在某些不稳定的测试失败时重新运行测试套件。
但是,如果你想在多个Jenkins流水线中重用流水线步骤,那么你需要使用Jenkins共享库。
我有一个公共的共享库,其中包含许多实用程序,可以使编写流水线更容易,称为jenkins-std-lib。我还是Jenkins Extension Pack的创建者,该扩展包可以使用VSCode IDE更轻松地编写Jenkins流水线。

正文完