当前位置: 首页 > 科技观察

摘要:四个流水线脚本化与声明式语法差异

时间:2023-03-16 21:05:33 科技观察

如果您正在阅读这篇博文,您可能正在寻找有关脚本化流水线和声明式流水线之间实际差异的信息,对吗?好吧,你不能去一个更好的地方。我将向您展示两者之间最实际的四个区别。花几分钟和我一起享受旅程吧!为什么有两种管道类型?脚本化管道是Jenkins中管道即代码的第一个实现。尽管它使用底层管道子系统,但它或多或少被设计为使用Groovy构建的通用DSL。这意味着它没有固定的结构,这取决于您如何定义管道逻辑。声明式管道更加固执己见,其结构定义明确。可能看起来很有限。但实际上,您可以使用脚本化或声明式管道来实现相同的目的。那么选择哪一个呢?如果你问我这个问题,我会说使用声明式管道。以下是原因。1.代码验证管道{agentanystages{stage("Build"){steps{echo"Somecodecompilationhere..."}}stage("Test"){steps{echo"Sometestsexecutionhere..."echo1}}}在管道启动时}如果我们尝试运行以下管道,验证将很快使构建失败。日志只显示带有String参数的触发器,所以我们得到了这个错误。请注意,管道没有执行任何阶段,它只是失败了。这可能为我们节省了很多时间-想象一下执行构建阶段几分钟,只是为了获得信息java.lang.String而不是echo步骤期望的java.lang.Integer。现在,让我们看一下与此示例等效的脚本化管道。node{stage("Build"){echo"Somecodecompilationhere..."}stage("Test"){echo"Sometestsexecutionhere..."echo1}}此管道执行相同的阶段和相同的步骤。但是,有一个显着差异。让我们执行它,看看它会产生什么。它按预期失败了。但是这次是Build阶段的执行,也是Test阶段的第一步。如您所见,没有验证管道代码。在这种情况下,声明式管道可以更好地处理此类用例。2.从指定步骤重启声明式管道的另一个很酷的特性是“从阶段重启”。让我们修复上一个示例中的管道,看看是否只能重新启动测试阶段。pipeline{agentanystages{stage("Build"){steps{echo"Somecodecompilationhere..."}}stage("Test"){steps{echo"Sometestsexecutionhere..."}}}}让我们执行它。在这里您可以看到选择了测试阶段。在右侧的步骤列表上方,有一个名为“重新启动测试”的选项。让我们点击它并查看结果。如您所见,Jenkins跳过了构建阶段(它使用了之前构建的工作区)并从测试阶段开始了下一个管道执行。当您执行一些外部测试并且测试由于远程环境的某些问题而失败时,这可能很有用。您可以使用测试环境来解决问题,然后重新运行该阶段,而无需重建所有工件。(在这种情况下,应用程序的代码没有改变。)现在,让我们看一个示例脚本管道。node{stage("Build"){echo"Somecodecompilationhere..."}stage("Test"){echo"Sometestsexecutionhere..."}}如您所见,没有重启选项。声明式管道与脚本式管道-2:0。3.声明式管道选项块两种管道类型都支持第三个特性,但我认为声明式管道处理得更好。假设我们将以下功能添加到之前的管道中。控制台日志中的时间戳。ANSI颜色输出。构建阶段超时1分钟,测试阶段超时2分钟。声明式管道看起来像这样。pipeline{agentanyoptions{timestamps()ansiColor("xterm")}stages{stage("Build"){options{timeout(time:1,unit:"MINUTES")}steps{sh'printf"\\e[31mSomecodecompilationhere...\\e[0m\\n"'}}stage("Test"){options{timeout(time:2,unit:"MINUTES")}steps{sh'printf"\\e[31mSometestsexecutionhere...\\e[0m\\n"'}}}}让我们运行这个。这是控制台日志。StartedbyuserSzymonStepniakRunninginDurabilitylevel:MAX_SURVIVABILITY[Pipeline]StartofPipeline[Pipeline]nodeRunningonJenkinsin/home/wololock/.jenkins/workspace/pipeline-sandbox[Pipeline]{[Pipeline]timestamps[Pipeline]{[Pipeline]ansiColor[Pipeline]{[]{Pipeline]stage(Build)[Pipeline]timeout15:10:04Timeoutsettoexpirein1min0sec[Pipeline]{[Pipeline]sh15:10:04+printf'\e[31mSomecodecompilationhere...\e[0m\n'15:10:04Somecodecompilationhere...[Pipeline]}[Pipeline]//timeout[Pipeline]}[Pipeline]//stage[Pipeline]stage[Pipeline]{(Test)[Pipeline]timeout15:10:04Timeoutsettoexpirein2min0sec[Pipeline]{[Pipeline]sh15:10:05+printf'\e[31mSometestsexecutionhere...\e[0m\n'15:10:05Sometestsexecutionhere...[Pipeline]}[Pipeline]//timeout[Pipeline]}[Pipeline]//stage[Pipeline]}[Pipeline]//ansiColor[Pipeline]}[Pipeline]//timestamps[Pipeline]}[Pipeline]//node[Pipeline]EndofPipelineFinished:SUCCESS在声明性管道中,选项与管道脚本逻辑分离。脚本管道还支持时间戳、ansiColor和超时选项,但它需要不同的代码。这是使用脚本化管道表达的相同管道。node{timestamps{ansiColor("xterm"){stage("Build"){timeout(time:1,unit:"MINUTES"){sh'printf"\\e[31mSomecodecompilationhere...\\e[0m\\n"'}}stage("Test"){timeout(time:2,unit:"MINUTES"){sh'printf"\\e[31mSometestsexecutionhere...\\e[0m\\n"'}}}}}我想你看到了问题所在。这里我们只使用时间戳和ansiColorJenkins插件。想象一下添加另一个或两个插件。声明式与脚本式,3:0。4.使用when块跳过阶段。在这篇博文中,我想提及的最后一件事是声明式管道支持的when块。让我们改进前面的示例并添加以下条件:仅当等于时才执行测试阶段。env.FOO``bar这就是声明性管道代码的样子。pipeline{agentanyoptions{timestamps()ansiColor("xterm")}stages{stage("Build"){options{timeout(time:1,unit:"MINUTES")}steps{sh'printf"\\e[31mSomecodecompilationhere...\\e[0m\\n"'}}stage("Test"){when{environmentname:"FOO",value:"bar"}options{timeout(time:2,unit:"MINUTES")}steps{sh'printf"\\e[31mSometestsexecutionhere...\\e[0m\\n"'}}}}并执行它。测试阶段按预期跳过。现在,让我们尝试在我们的脚本管道示例中执行相同的操作。node{timestamps{ansiColor("xterm"){stage("Build"){timeout(time:1,unit:"MINUTES"){sh'printf"\\e[31mSomecodecompilationhere...\\e[0m\\n"'}}if(env.FOO=="bar"){stage("Test"){timeout(time:2,unit:"MINUTES"){sh'printf"\\e[31mSometestsexecutionhere...\\e[0m\\n"'}}}}}}如您所见,在添加测试阶段之前,我们必须使用if条件来检查env.FOO是否等于bar。(不幸的是,这并不是真正的跳过。)让我们运行它看看结果如何。这是不同的结果。在脚本管道用例中,“测试”阶段甚至没有呈现。在我看来,这可能会引入一些不必要的混乱,而声明式管道会更好地处理它。声明式与脚本式,4:0。结论以下是声明式和脚本化Jenkins管道之间的四大区别。这些不是唯一的区别,我想您的列表可能看起来有点不同。你有什么选择?您更喜欢声明式还是脚本式管道?