为了能够在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中解耦,并允许您检出一次,并同时拥有管道定义和要构建的源。这不是最漂亮的方法,但绝对可以很好地完成任务。