Xer*_*ati 7 groovy jenkins jenkins-pipeline
是否可以采用整个stage('foo') {...}定义并将其提取到Jenkins中的共享库中?文档非常清楚如何拉出单个步骤,但是我找不到任何方法可以进行整个阶段,对其进行参数化并在全球范围内重复使用。我以为也许return stage...会行得通,但它会作为无效的返回值而出错。
Szy*_*iak 10
这取决于您使用脚本化还是声明性管道。
脚本化管道更加灵活,它允许您例如根据某些条件创建阶段(每个管道运行可以具有不同数量和种类的阶段)。在这种管道中,您可以将整个阶段提取到共享库类及其整个node {}块中。考虑以下示例:
// src/ScriptedFooStage.groovy
class ScriptedFooStage {
private final Script script
ScriptedFooStage(Script script) {
this.script = script
}
// You can pass as many parameters as needed
void execute(String name, boolean param1) {
script.stage(name) {
script.echo "Triggering ${name} stage..."
script.sh "echo 'Execute your desired bash command here'"
if (param1) {
script.sh "echo 'Executing conditional command, because param1 == true'"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,Jenkinsfile可能如下所示:
node {
new ScriptedFooStage(this).execute('Foo', true)
}
Run Code Online (Sandbox Code Playgroud)
如您所见,整个阶段都封装在该ScriptedFooStage.execute()方法中。它的名称也来自参数name-脚本化管道允许您执行此操作。
另一方面,声明式管道更为严格和自以为是。如果涉及到阶段数及其名称,则此问题是固定的(您无法动态建模每个构建中存在的阶段及其名称)。您仍然可以利用共享库类,但仅限于在内部script {}块内部执行它们stage('Name') { steps {} }。这意味着您不能将整个阶段提取到单独的类中,而只能将某些部分提取到步骤级别。考虑以下示例:
// src/DeclarativeFooStage.groovy
class DeclarativeFooStage {
private final Script script
DeclarativeFooStage(Script script) {
this.script = script
}
// You can pass as many parameters as needed
void execute(String name, boolean param1) {
script.echo "Triggering script with name == ${name}"
script.sh "echo 'Execute your desired bash command here'"
if (param1) {
script.sh "echo 'Executing conditional command, because param1 == true'"
}
}
}
Run Code Online (Sandbox Code Playgroud)
而Jenkinsfile可能是这样的:
// Jenkinsfile
pipeline {
agent any
stages {
stage('Foo') {
steps {
script {
new DeclarativeFooStage(this).execute('something', false)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们尝试在声明式管道中执行new DeclarativeFooStage(this).execute('something', false)outside script {}block,则会出现编译错误。
在脚本化管道还是声明性管道之间进行选择取决于特定的用例。如果要在对管道业务逻辑进行建模时获得最大的灵活性,则脚本化管道可能是不错的选择。但是,它附带一些价格。例如,脚本化管道不支持从特定阶段重新启动管道构建-仅声明性管道支持。(假设您在管道中有10个阶段,而第7阶段由于一些愚蠢的错误而失败,并且您想从第7阶段重新开始构建-在脚本化管道中,您必须从头开始重新运行,而声明性管道可以重新启动记住前6个阶段的结果,从第7个阶段开始)。