【发布时间】:2020-02-13 04:45:02
【问题描述】:
我有一个开源项目,它位于 GitHub 中,使用由 Jenkins 控制的构建农场构建。
我想使用管道以分支方式构建它,但我不想将 Jenkinsfile 存储在代码中。有没有办法做到这一点?
【问题讨论】:
我有一个开源项目,它位于 GitHub 中,使用由 Jenkins 控制的构建农场构建。
我想使用管道以分支方式构建它,但我不想将 Jenkinsfile 存储在代码中。有没有办法做到这一点?
【问题讨论】:
我遇到了和你一样的问题。虽然将构建过程作为代码的一部分的想法很好,但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'
}
}
}
}
【讨论】:
首先,您为什么不希望在您的代码中使用 Jenkinsfile?管道和构建文件一样是代码的一部分。
除此之外,您可以加载 groovy 文件以作为管道脚本进行评估。您可以使用 from 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;
【讨论】: