我正在尝试动态构建并行阶段,如已证明的here和here。具体来说,我正在尝试在管道范围之外定义的函数中执行此操作,例如:
sbn.getNotification().getSmallIcon()
问题是,这似乎只有在动态并行生成代码位于管道的step {}块内的script {}块内时才起作用(如第一个参考资料所示)。
运行与上面的代码段相似的内容时,我在jenkins中看到此错误:
pipeline{
stages{
stage('CI'){
steps{
doDynamicParallelSteps()
}
}
}
}
def doDynamicParallelSteps(){
tests = [:]
for (f in findFiles(glob: '**/html/*.html')) {
tests["${f}"] = {
node {
stage("${f}") {
echo '${f}'
}
}
}
}
parallel tests
}
是否有任何方法可以按照我在初始代码段中所示的方式将其定义为函数,还是我在管道定义中坚持使用大量的script {}块?
答案 0 :(得分:4)
声明性管道不允许您将Groovy代码放在steps {}
块中-它期望在此位置执行有效的Jenkins管道步骤。这就是为什么可以将script {}
块引入steps {}
块中以执行一些Groovy代码的原因。
如果您需要灵活性和非操作性语法,则可以改用脚本管道。在这里,您可以毫无限制地将Groovy代码与现有管道步骤混合在一起。
Jenkins documentation简要解释了两种方法之间的区别以及它们存在的原因:
第一次创建Jenkins Pipeline时,选择Groovy作为基础。 Jenkins长期以来一直提供嵌入式Groovy引擎,以为管理员和用户提供高级脚本功能。另外,Jenkins Pipeline的实现者发现Groovy是构建现在称为“脚本管道” DSL的坚实基础。 [2]。
由于它是功能齐全的编程环境,因此脚本化管道为Jenkins用户提供了极大的灵活性和可扩展性。 Groovy学习曲线通常并不是给定团队的所有成员所希望的,因此创建了声明式管道,以提供一种更简单,更自以为是的语法来编写Jenkins Pipeline。
两者在下面基本上是相同的Pipeline子系统。它们都是“管道作为代码”的持久实现。他们都可以使用内置在Pipeline中或由插件提供的步骤。两者都可以利用共享库
您在脚本化管道中的示例可能如下所示:
node {
stage('CI') {
doDynamicParallelSteps()
}
}
def doDynamicParallelSteps(){
tests = [:]
for (f in findFiles(glob: '**/html/*.html')) {
tests["${f}"] = {
node {
stage("${f}") {
echo '${f}'
}
}
}
}
parallel tests
}
而带有script {}
块的声明性管道将看起来像这样:
pipeline{
agent any
stages{
stage('CI'){
steps{
script {
doDynamicParallelSteps()
}
}
}
}
}
def doDynamicParallelSteps(){
tests = [:]
for (f in findFiles(glob: '**/html/*.html')) {
tests["${f}"] = {
node {
stage("${f}") {
echo '${f}'
}
}
}
}
parallel tests
}