【问题标题】:Jenkins Pipeline: is it possible to avoid multiple checkout?Jenkins Pipeline:是否可以避免多次结帐?
【发布时间】:2019-02-08 06:02:59
【问题描述】:

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

设置

  • 我有一个与我的 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 时,他们都将结帐单片机作为第一步。我个人认为我不必这样做,因为 jenkins 工作已经必须进行结帐以检索 Jenkinsfile(所以我的来源必须以某种方式在这里)。
  • 您不认为一旦 git 存储库包含大量引用,这些多次签出会导致性能下降吗?

谢谢大家

【问题讨论】:

  • 如果您没有设置使用多分支管道,您可以使用 Jenkins 中的 Jenkinsfile 创建一个普通(单分支)管道作业,该作业执行单个结帐,然后加载您的实际通过load 'ci/build-script-in-your-repo.gy' 从签出的存储库构建脚本。不幸的是,在这种情况下,您将失去每个分支的单独工作。
  • 我知道你的意思,但我想: - 将我的 ci 配置保存在我的存储库中,而不是我的 jenkins 工作配置中 - 使用不错的多分支功能(比如每个分支一个工作,所以一个人可以轻松查看哪个分支失败)

标签: git jenkins jenkins-pipeline


【解决方案1】:

使用普通的 git,Jenkins 必须进行两次检查:一次让 Jenkinsfile 知道在作业中要执行什么,然后检查实际存储库内容以用于构建目的。 从技术上讲,Jenkins 只需要从 repo 中加载一个 Jenkinsfile,但 git 不允许检出单个文件。因此,使用 multibranch 插件的普通 git 无法避免双重结帐。

如果您在 Bitbucket 或 GitHub 上托管 git,那么您可以通过使用他们特定的 Jenkins 插件而不是多分支插件来避免双重签出。

请参阅 Jenkins 插件站点以获取相应的 BitbucketGitHub 插件。

这些插件使用各自的 Git 提供者的 REST API 来加载单个 Jenkins 文件。所以从技术上讲,你仍然有一个双重签出,但第一个是一个简单的 REST 调用来下载单个文件,而不是对整个存储库进行完整的原生 git 签出。

【讨论】:

  • 感谢您的解释。我会检查 Jenkins Bitbucket 插件
  • 有什么方法可以使用 github 插件而不扫描整个组织?我希望从更少的结帐中受益,但我无法扫描组织中的每个 repo...
  • 确实 git 不允许检出单个文件。但是,可以使用 git archive 来“签出”单个文件。我正在使用这样的东西来检查我的 Jenkins 管道中的单个文件: sh "git archive --remote=ssh://${gitUser}@${gitServer}/${view}/${someProject}.git $ {env.BRANCH} -- ${specFile} | tar xf -"
  • 我基本上有同样的问题,但我很困惑,因为据我了解,您链接的“GitHub”插件首先是拥有多分支作业的要求。那我如何使用这个“GitHub”插件,以避免第二次结帐?
  • 这个答案是否真的适用于链接的 Github 组织文件夹插件的其他人?对我来说,它仍然执行 2 次结帐,并且不只是得到 jenkinsfile,正如这个答案所建议的那样......
【解决方案2】:

我已经多次遇到这种情况,我提供的强大解决方案是在作业本身(没有 scm 源)中定义一个微小的“启动器脚本”,它检查正确的源修订并从中加载实际管道来源。

如果您使用 DSL 插件来概括您的工作,您将这样定义管道:

pipelineJob("myjob") {
  ...
  definition {
    cps {
      script('''
        node {
          checkout scm
          load("path/to/script.groovy")
        }
      ''')
    }
  }
}

如果您使用 jenkins 的“配置”屏幕手动配置作业,这与选择“管道脚本”而不是“来自 SCM 的管道脚本”并复制框中的小结帐和加载脚本相同。

这将管道引导程序与实际的 SCM 分离,并允许您签出一次并拥有管道定义和要构建的源。不是最漂亮的方法,但绝对可以很好地完成工作。

【讨论】:

  • 能否提供更完整的代码示例,包括启动器脚本?
猜你喜欢
  • 2014-11-18
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多