我的Jenkinsfile可以仅包含属性而没有Piepeline代码吗?

时间:2018-10-07 05:12:20

标签: jenkins jenkins-pipeline devops

我在编写声明性管道时遇到的所有教程都建议将 Jenkinsfile 中的阶段和步骤包括在内。

但是我注意到我的一位前辈以相反的方式写这本书。他只使用Jenkinsfile定义所有属性,即他的Jenkinsfile只是一个属性文件,仅此而已。

在定义管道时,他利用共享库的概念将管道代码写入vars文件夹中的文件中。我无法猜测这种方法背后的智慧。

我在互联网上找不到类似的地方。
在这方面的任何指导都是高度赞赏的。我是詹金斯世界的初学者。

1 个答案:

答案 0 :(得分:2)

Extending with Shared Libraries所示,该方法(我也在使用)允许:

  • 将Jenkinsfile内容保留为 minimum
  • 强制执行完成特定工作的标准方式(如共享库中所编码)

该共享库成为流程的模板,在将实际执行委托给预定义的库之前,您仅在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() }
    }
}