将整个Jenkins阶段提取到共享库?

将整个Jenkins阶段提取到共享库?,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,是否可以将整个阶段('foo'){…}定义提取到Jenkins内的共享库中?这些文档非常清楚如何将单个步骤拉出,但我找不到任何方法来完成整个阶段,将其参数化,并在全球范围内重复使用。我原以为只要返回阶段…就可以了,但它会作为无效的返回值出错。这取决于您是使用脚本化的还是声明性的管道 脚本化管道更加灵活,允许您根据某些条件创建阶段(每个管道运行可以有不同数量和类型的阶段)。在这种管道中,您可以提取一个完整的stage到共享库类,并从节点{}块内部调用它。考虑下面的例子: //src/Scripte

是否可以将整个
阶段('foo'){…}
定义提取到Jenkins内的共享库中?这些文档非常清楚如何将单个步骤拉出,但我找不到任何方法来完成整个阶段,将其参数化,并在全球范围内重复使用。我原以为只要
返回阶段…
就可以了,但它会作为无效的返回值出错。

这取决于您是使用脚本化的还是声明性的管道

脚本化管道更加灵活,允许您根据某些条件创建阶段(每个管道运行可以有不同数量和类型的阶段)。在这种管道中,您可以提取一个完整的stage到共享库类,并从
节点{}
块内部调用它。考虑下面的例子:

//src/ScriptedFooStage.groovy
类ScriptedFooStage{
私人最终脚本
ScriptedFooStage(脚本脚本){
this.script=脚本
}
//您可以根据需要传递任意多个参数
void execute(字符串名,布尔参数1){
脚本.阶段(名称){
script.echo“触发${name}阶段…”
script.sh“echo‘在此处执行所需的bash命令’”
如果(参数1){
script.sh“echo”正在执行条件命令,因为param1==true”
}
}
}
}
那么Jenkins文件可能如下所示:

节点{
新建ScriptedFooStage(this).execute('Foo',true)
}
如您所见,整个阶段都封装在
ScriptedFooStage.execute()
方法中。它的名称也取自参数
name
——脚本化管道允许您执行这样的操作


声明性管道在另一方面更为严格和固执己见。如果涉及到阶段的数量和它们的名称,那么它是固定的(您不能动态地建模每个构建中存在哪些阶段以及它们的名称)。您仍然可以利用共享库类,但只能在
stage('Name'){steps{}
块内的
script{}
块内执行它们。这意味着您不能将整个阶段提取到单独的类中,而只能提取在步骤级别执行的部分。考虑下面的例子:

//src/DeclarativeFostage.groovy
类DeclarativeFostage{
私人最终脚本
DeclarativeFostage(脚本){
this.script=脚本
}
//您可以根据需要传递任意多个参数
void execute(字符串名,布尔参数1){
script.echo“触发名为=${name}的脚本”
script.sh“echo‘在此处执行所需的bash命令’”
如果(参数1){
script.sh“echo”正在执行条件命令,因为param1==true”
}
}
}
Jenkins文件可能如下所示:

//Jenkinsfile
管道{
任何代理人
舞台{
舞台(‘Foo’){
台阶{
剧本{
新建DeclarativeFostage(this.execute('something',false)
}
}
}
}
}
如果我们尝试在声明性管道中的
script{}
块之外执行
new declarativefostage(this).execute('something',false)

结论
脚本式管道和声明式管道之间的选择取决于特定的用例。如果您想在建模管道业务逻辑时获得最佳灵活性,那么脚本化管道可能是一个不错的选择。然而,它是有代价的。例如,脚本化管道不支持从特定阶段重新启动管道构建-这仅由声明性管道支持。(假设管道中有10个阶段,第7阶段由于一些愚蠢的错误而失败,并且您希望从第7阶段重新启动构建-在脚本管道中,您必须从一开始就重新运行,而声明性管道可以通过记住前6个阶段的结果从第7阶段重新启动).

我也在考虑这个问题。然而,脚本{}只允许在步骤{}内使用,所以您将如何注入它呢?谢谢您的回答,它帮助我分配了。尽管如此,您能否详细说明一下,当您将
this
参数传递给
DeclarativeFostage
类的ctor时,会发生什么情况(是这种类型的对象:)。我的意思是,在运行时,它到底是什么?我对Groovy、Java和Jenkins都很陌生,所以我希望这不是一个完全幼稚的问题……提前谢谢。