我在编写声明性管道时遇到的所有教程都建议将 Jenkinsfile 中的阶段和步骤包括在内。
但是我注意到我的一位前辈以相反的方式写这本书。他只使用Jenkinsfile定义所有属性,即他的Jenkinsfile只是一个属性文件,仅此而已。
在定义管道时,他利用共享库的概念将管道代码写入vars文件夹中的文件中。我无法猜测这种方法背后的智慧。
我在互联网上找不到类似的地方。
在这方面的任何指导都是高度赞赏的。我是詹金斯世界的初学者。
答案 0 :(得分:2)
如Extending with Shared Libraries所示,该方法(我也在使用)允许:
该共享库成为流程的模板,在将实际执行委托给预定义的库之前,您仅在Jenkinsfile中为其提供值。
OP Asif Kamran Malick请注意,documentation does include:
还有一个使用Groovy的
Closure.DELEGATE_FIRST
的“生成器模式”技巧,该技巧使Jenkinsfile看起来比程序更像是配置文件,但这更复杂且容易出错,因此不推荐。 / p>
然后他问:
为什么博客作者实际上不鼓励在官方文档中使用这种方式。
我检查了一下,我们也在使用Closure.DELEGATE_FIRST
。
原因在于“允许Jenkinsfile看起来更像是配置文件而不是程序”
这避免了我们必须定义JSON块,并将参数保留为一系列key=value
行,以便于阅读的情况。
然后调用共享库:
#!/usr/bin/env groovy
@Library("MyLibraries") _
MyLibrary {
config1 = 'value1'
config2 = 'value2'
...
}
{
anotherConfigA = 'valueA'
anotherConfigB = 'valueB'...
astep(
...
)
}
然后您在MyLibraries/vars/MyLibrary.yml
中的jenkins管道模板可以使用这些封闭块:
def call(Closure configBlock, Closure body) {
def config = [:]
configBlock.resolveStrategy = Closure.DELEGATE_FIRST
configBlock.delegate = config
configBlock()
astep(
...
){
if (body) { body() }
}
}