git - Jenkins 管道 : is it possible to avoid multiple checkout?

标签 git jenkins jenkins-pipeline

我已经使用 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 插件站点以获取 BitbucketGitHub相应的插件。

这些插件使用各自的 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/

相关文章:

git - 如何读取 git-ls-tree 输出的模式字段

node.js - 为 Elastic Beanstalk 上的 github 私有(private)存储库访问设置 SSH key

jenkins - 如何通过网络 Hook 从 Docker Hub 与 Jenkins 通信?

function - Jenkins 将构建步骤作为函数发布

git - p4merge 错误 [GIT]

java - 为 Runnable Jars 使用不同的属性文件,Maven Eclipse

java - Jenkins 奴隶无法写入 jarCache

java - Groovy StreamingTemplateEngine 使用 withCredentials 函数给出错误

jenkins - Scripted Pipeline 语法中并行内部的顺序阶段

git - 登录时启动 ssh-agent