我已经使用 pipeline feature 将一些旧的 Jenkins 作业转移到新作业上为了能够将 Jenkins 配置集成到 git 存储库中。 它工作正常,但我在问自己是否有办法减少构建时发生的 checkout 次数。
设置
- 我有一个与我的 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 ,他们都将 checkout scm 作为第一步。我个人认为我不必这样做,因为 jenkins 工作已经必须进行 checkout 以检索 Jenkinsfile(所以我的来源必须以某种方式在这里)。 - 您不认为一旦 git 存储库包含大量引用,这些多次 check out 会导致性能不佳吗?
谢谢大家
最佳答案
对于普通的 git,Jenkins 必须进行两次 check out :一次是让 Jenkinsfile 知道在作业中执行什么,然后是为了构建目的而 check out 实际存储库内容。 从技术上讲,Jenkins 只需要从 repo 加载一个 Jenkinsfile,但 git 不允许 checkout 单个文件。因此,使用多分支插件的普通 git 无法避免双重 checkout 。
如果您在 Bitbucket 或 GitHub 上托管 git,那么您可以通过使用它们特定的 Jenkins 插件而不是多分支插件来避免双重 checkout 。
请参阅 Jenkins 插件站点以获取 Bitbucket和 GitHub相应的插件。
这些插件使用各自的 Git 提供商的 REST API 加载单个 Jenkins 文件。所以从技术上讲,您仍然有双重 check out ,但第一个是简单的 REST 调用来下载单个文件,而不是对整个存储库进行完整的 native git check out 。
关于git - Jenkins 管道 : is it possible to avoid multiple checkout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452030/