我使用pipeline feature将一些旧的Jenkins作业移动到新作业,以便能够在git存储库中集成Jenkins配置。 它工作正常,但我问自己是否有办法减少建设时结账的数量。
设置
我的git存储库中有一个Jenkins文件
#!groovy
node {
stage 'Checkout'
checkout scm
// build project
stage 'Build'
...
}
问题
当我推送到我的远程分支 BRANCH_1 时,会触发multibranch jenkins作业,我的理解是发生以下步骤:
git fetch
并触发与我的远程分支对应的作业: BRANCH_1_job git checkout
检索已触发分支的Jenkins文件checkout scm
。如果我不这样做,我就无法构建我的项目,因为没有可用的源。因此,为了构建我的分支,我最终得到一个git fetch
和两个git checkout
。
问题
git checkout
的数量?当我检查official examples时,他们都会将结帐scm作为第一步。我个人认为我不必这样做,因为jenkins工作已经不得不进行检查以检索Jenkins文件(所以我的来源必须以某种方式在这里)。谢谢大家
答案 0 :(得分:5)
使用普通的git,Jenkins必须进行两次检查:一种是让Jenkinsfile知道在作业中执行什么,然后另外检查实际的存储库内容以进行构建。 从技术上讲,Jenkins只需要从repo加载一个Jenkins文件,但是git不允许签出单个文件。因此,使用multibranch插件使用普通git无法避免双重结账。
如果您在Bitbucket或GitHub上托管git,那么您可以通过使用特定的Jenkins插件而不是multibranch插件来避免双重结帐。
相应地查看Jenkins插件网站Bitbucket和GitHub个插件。
这些插件使用相应的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脱钩,并允许您签出一次并拥有管道定义和要构建的源。不是最漂亮的方法,但是绝对可以很好地完成工作。