使用外部定义的 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
会包含一些信息,这些信息不是项目构建本身固有的,而是特定于构建环境实例的,这可能改变。
我完成这个的方法是:
将核心构建过程封装在一个脚本中(build.py
或 build.sh
)。这可能会调用特定的构建工具,如 Make、CMake、Ant 等
通过 Jenkinsfile
告诉 Jenkins 调用单个全局库中定义的函数
定义全局 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'
}
}
}
}
我有一个开源项目,它位于 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
会包含一些信息,这些信息不是项目构建本身固有的,而是特定于构建环境实例的,这可能改变。
我完成这个的方法是:
将核心构建过程封装在一个脚本中(
build.py
或build.sh
)。这可能会调用特定的构建工具,如 Make、CMake、Ant 等通过
Jenkinsfile
告诉 Jenkins 调用单个全局库中定义的函数定义全局 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'
}
}
}
}