Jenkins Pipeline:是否可以避免多次结帐?
Jenkins Pipeline: is it possible to avoid multiple checkout?
为了能够将 Jenkins 配置集成到 git 存储库中,我已经使用 pipeline feature 将一些旧的 Jenkins 作业转移到了新的作业上。
它工作正常,但我在问自己是否有办法减少构建时发生的结帐次数。
设置
- 我有一个与我的 git 存储库相关的 Jenkins 多分支作业
我的 git 存储库中有一个 Jenkinsfile
#!groovy
node {
stage 'Checkout'
checkout scm
// build project
stage 'Build'
...
}
问题
当我推送到我的远程分支 BRANCH_1 时,多分支 jenkins 作业被触发,我的理解是发生了以下步骤:
- 多分支作业为分支索引创建
git fetch
并触发与我的远程分支对应的作业:BRANCH_1_job
- BRANCH_1_job 生成一个
git checkout
来检索触发分支的 Jenkinsfile
- Jenkinsfile 被执行并生成
checkout scm
本身。如果我不这样做,我将无法构建我的项目,因为没有可用的源。
因此,为了构建我的分支,我最终得到了一个 git fetch
和两个 git checkout
。
问题
- 我对这个过程的理解正确吗?还是我错过了什么?
- 有没有办法减少
git checkout
的数量?当我检查 official examples 时,他们都将结帐 scm 作为第一步。我个人认为我不必这样做,因为詹金斯工作已经必须进行结帐以检索詹金斯文件(所以我的来源必须以某种方式在这里)。
- 一旦 git 存储库包含大量引用,您不认为这些多次检出会导致性能下降吗?
谢谢大家
对于简单的 git,Jenkins 必须进行两次检查:一次是让 Jenkinsfile 知道在作业中执行什么,然后是为了构建目的而检查实际存储库内容。
从技术上讲,Jenkins 只需要从 repo 加载一个 Jenkinsfile,但 git 不允许签出单个文件。因此,使用多分支插件 git 无法避免双重签出。
如果您在 Bitbucket 或 GitHub 上托管 git,那么您可以通过使用其特定的 Jenkins 插件而不是多分支插件来避免双重签出。
请参阅 Jenkins 插件站点以获取相应的 Bitbucket and GitHub 插件。
这些插件使用各自的 Git 提供商的 REST API 加载单个 Jenkins 文件。所以从技术上讲,您仍然有双重检出,但第一个是简单的 REST 调用来下载单个文件,而不是对整个存储库进行完整的本机 git 检出。
我已经 运行 多次进入这个问题,我提出的可靠解决方案是在作业本身(没有 scm 源)中定义一个微小的 "launcher script" 来检出正确的源修订并从源加载实际管道。
如果您使用 DSL 插件来概括您的工作,您将以这种方式定义管道:
pipelineJob("myjob") {
...
definition {
cps {
script('''
node {
checkout scm
load("path/to/script.groovy")
}
''')
}
}
}
如果您使用 jenkins "Configure" 屏幕手动配置作业,这与选择 "Pipeline script" 而不是 "Pipeline script from SCM" 并复制里面的小型签出和加载脚本相同盒子。
这将管道 bootstrap 与实际的 SCM 分离,并允许您签出一次并同时拥有管道定义和要构建的源。不是最漂亮的方法,但绝对可以很好地完成工作。
为了能够将 Jenkins 配置集成到 git 存储库中,我已经使用 pipeline feature 将一些旧的 Jenkins 作业转移到了新的作业上。 它工作正常,但我在问自己是否有办法减少构建时发生的结帐次数。
设置
- 我有一个与我的 git 存储库相关的 Jenkins 多分支作业
我的 git 存储库中有一个 Jenkinsfile
#!groovy node { stage 'Checkout' checkout scm // build project stage 'Build' ... }
问题
当我推送到我的远程分支 BRANCH_1 时,多分支 jenkins 作业被触发,我的理解是发生了以下步骤:
- 多分支作业为分支索引创建
git fetch
并触发与我的远程分支对应的作业:BRANCH_1_job - BRANCH_1_job 生成一个
git checkout
来检索触发分支的 Jenkinsfile - Jenkinsfile 被执行并生成
checkout scm
本身。如果我不这样做,我将无法构建我的项目,因为没有可用的源。
因此,为了构建我的分支,我最终得到了一个 git fetch
和两个 git checkout
。
问题
- 我对这个过程的理解正确吗?还是我错过了什么?
- 有没有办法减少
git checkout
的数量?当我检查 official examples 时,他们都将结帐 scm 作为第一步。我个人认为我不必这样做,因为詹金斯工作已经必须进行结帐以检索詹金斯文件(所以我的来源必须以某种方式在这里)。 - 一旦 git 存储库包含大量引用,您不认为这些多次检出会导致性能下降吗?
谢谢大家
对于简单的 git,Jenkins 必须进行两次检查:一次是让 Jenkinsfile 知道在作业中执行什么,然后是为了构建目的而检查实际存储库内容。 从技术上讲,Jenkins 只需要从 repo 加载一个 Jenkinsfile,但 git 不允许签出单个文件。因此,使用多分支插件 git 无法避免双重签出。
如果您在 Bitbucket 或 GitHub 上托管 git,那么您可以通过使用其特定的 Jenkins 插件而不是多分支插件来避免双重签出。
请参阅 Jenkins 插件站点以获取相应的 Bitbucket and GitHub 插件。
这些插件使用各自的 Git 提供商的 REST API 加载单个 Jenkins 文件。所以从技术上讲,您仍然有双重检出,但第一个是简单的 REST 调用来下载单个文件,而不是对整个存储库进行完整的本机 git 检出。
我已经 运行 多次进入这个问题,我提出的可靠解决方案是在作业本身(没有 scm 源)中定义一个微小的 "launcher script" 来检出正确的源修订并从源加载实际管道。
如果您使用 DSL 插件来概括您的工作,您将以这种方式定义管道:
pipelineJob("myjob") {
...
definition {
cps {
script('''
node {
checkout scm
load("path/to/script.groovy")
}
''')
}
}
}
如果您使用 jenkins "Configure" 屏幕手动配置作业,这与选择 "Pipeline script" 而不是 "Pipeline script from SCM" 并复制里面的小型签出和加载脚本相同盒子。
这将管道 bootstrap 与实际的 SCM 分离,并允许您签出一次并同时拥有管道定义和要构建的源。不是最漂亮的方法,但绝对可以很好地完成工作。