Jenkins Pipeline:是否有可能避免多次签出



为了能够在git存储库中集成Jenkins配置,我已经使用管道特性将一些旧的Jenkins作业移到了新的作业中。它工作得很好,但我问自己是否有一种方法可以减少在构建时发生的签出次数。

设置>
  • 我有一个Jenkins多分支作业,它与我的git仓库有关
  • 我有一个Jenkinsfile在我的git仓库

    #!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的数量?当我查看官方示例时,它们都将checkout scm作为第一步。我个人认为我不必这样做,因为jenkins作业已经必须进行签出以检索Jenkinsfile(所以我的源必须在这里)。
  • 你不认为这些多次签出会导致糟糕的性能,一旦git仓库包含大量的refs?

谢谢大家

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

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

请参阅Jenkins插件网站上相应的Bitbucket和GitHub插件。

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

我已经遇到过几次了,我想到的健壮的解决方案是在作业本身(没有scm源代码)中定义一个小的"启动脚本",它检出正确的源代码修订并从源代码加载实际的管道。

如果您正在使用DSL插件来通用您的作业,您将这样定义管道:

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

如果您正在使用jenkins的"Configure"屏幕手动配置作业,这与选择"Pipeline script"而不是"Pipeline script from SCM"并复制小的签出和加载脚本相同。

这将管道引导从实际的SCM中解耦,并允许您检出一次,并同时拥有管道定义和要构建的源。这不是最漂亮的方法,但绝对可以很好地完成任务。

相关内容

  • 没有找到相关文章

最新更新