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

时间:2016-09-12 13:55:35

标签: git jenkins jenkins-pipeline

我使用pipeline feature将一些旧的Jenkins作业移动到新作业,以便能够在git存储库中集成Jenkins配置。 它工作正常,但我问自己是否有办法减少建设时结账的数量。

设置

  • 我有一个与我的git存储库相关的Jenkins multibranch作业
  • 我的git存储库中有一个Jenkins文件

    #!groovy
    node {
    
      stage 'Checkout'
      checkout scm
    
      // build project
      stage 'Build'
      ...
    }
    

问题

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

  • multibranch作业为分支索引创建git fetch并触发与我的远程分支对应的作业: BRANCH_1_job
  • BRANCH_1_job 使git checkout检索已触发分支的Jenkins文件
  • 执行Jenkins文件并自行生成checkout scm。如果我不这样做,我就无法构建我的项目,因为没有可用的源。

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

问题

  • 我是否正确理解了这个过程?或者我错过了什么?
  • 有没有办法减少git checkout的数量?当我检查official examples时,他们都会将结帐scm作为第一步。我个人认为我不必这样做,因为jenkins工作已经不得不进行检查以检索Jenkins文件(所以我的来源必须以某种方式在这里)。
  • 一旦git repo包含大量引用,你认为这些多次结账会不会导致性能下降?

谢谢大家

2 个答案:

答案 0 :(得分:5)

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

如果您在Bitbucket或GitHub上托管git,那么您可以通过使用特定的Jenkins插件而不是multibranch插件来避免双重结帐。

相应地查看Jenkins插件网站BitbucketGitHub个插件。

这些插件使用相应的Git提供程序的REST API来加载单个Jenkins文件。所以你在技术上仍然有一个双重结账,但第一个是一个简单的REST调用来下载单个文件,而不是对整个存储库进行完整的本机git签出。

答案 1 :(得分:0)

我已经遇到过几次了,而随之而来的可靠的解决方案是在作业本身(没有scm源)中定义一个小的“启动脚本”,以检出正确的源版本并从中加载实际的管道来源。

如果您使用DSL插件来完成您的工作,则可以通过以下方式定义管道:

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

如果您是使用jenkins的“配置”屏幕手动配置作业,则等同于选择“管道脚本”而不是“来自SCM的管道脚本”,然后在框中复制小的结帐和加载脚本。 / p>

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