Jenkins Pipeline:是否可以避免多次结帐?

Jenkins Pipeline: is it possible to avoid multiple checkout?

为了能够将 Jenkins 配置集成到 git 存储库中,我已经使用 pipeline feature 将一些旧的 Jenkins 作业转移到了新的作业上。 它工作正常,但我在问自己是否有办法减少构建时发生的结帐次数。

设置

问题

当我推送到我的远程分支 BRANCH_1 时,多分支 jenkins 作业被触发,我的理解是发生了以下步骤:

因此,为了构建我的分支,我最终得到了一个 git fetch 和两个 git checkout

问题

谢谢大家

对于简单的 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 分离,并允许您签出一次并同时拥有管道定义和要构建的源。不是最漂亮的方法,但绝对可以很好地完成工作。