使用外部定义的 Jenkinsfile 的多分支配置

Multi-branch configuration with externally-defined Jenkinsfile

我有一个开源项目,它位于 GitHub 中,是使用构建农场构建的,由 Jenkins 控制。

我想使用管道按分支构建它,但我不想将 Jenkinsfile 存储在代码中。有办法实现吗?

首先,为什么您不想在代码中使用 Jenkinsfile?管道与构建文件一样都是代码的一部分。

除此之外,您可以加载 groovy 个文件以作为管道脚本进行评估。您可以使用来自 SCM 选项的不同位置执行此操作,然后签出实际代码。但这将迫使您手动处理分支构建。

另一种选择是拥有一个非常基本的 Jenkinsfile,它只检查一个外部管道。

你会得到这样的东西:

node{
    deleteDir()

    git env.flowScm
    def flow = load 'pipeline.groovy'
    stash includes: '**', name: 'flowFiles'

    stage 'Checkout'
    checkout scm // short hand for checking out the "from scm repository"

    flow.runFlow()
}

pipeline.groovy 文件包含实际管道的位置如下所示:

def runFlow() {
    // your pipeline code

} 

// Has to exit with 'return this;' in order to be used as library
return this;

我遇到了和你一样的问题。虽然将构建过程作为代码的一部分的想法很好,但是 Jenkinsfile 会包含一些信息,这些信息不是项目构建本身固有的,而是特定于构建环境实例的,这可能改变。

我完成这个的方法是:

  1. 将核心构建过程封装在一个脚本中(build.pybuild.sh)。这可能会调用特定的构建工具,如 Make、CMake、Ant 等

  2. 通过 Jenkinsfile 告诉 Jenkins 调用单个全局库中定义的函数

  3. 定义全局 Jenkins 构建函数以使用适当的环境设置调用构建脚本(例如 build.py)。例如,使用自定义工具并设置 PATH.

因此,对于第 2 步,在您的项目中创建一个 Jenkinsfile,仅包含行

build_PROJECTNAME()

其中 PROJECTNAME 基于您的项目名称。

然后使用 Pipeline Shared Groovy Libraries Plugin 并在名为 vars/build_PROJECTNAME.groovy 的共享库存储库中创建一个 Groovy 脚本,其中包含设置环境和调用项目构建脚本的代码(例如 build.py):

def call() {
    node('linux') {
        stage("checkout") {
            checkout scm
        }
        stage("build") {
            withEnv([
                "PATH+CMAKE=${tool 'CMake'}/bin",
                "PATH+PYTHON=${tool 'Python-3'}",
                "PATH+NINJA=${tool 'Ninja'}",
            ]) {
                execute 'python build.py'
            }
        }
    }
}