我最近设法将几个手动创建的作业转换为DSL脚本(内联到临时“种子”作业),并且惊喜地发现它是多么简单.现在我想摆脱多个种子工作,并尝试更清洁地构建事物.
为此,我创建了一个新的jenkins-ci repo并将所有Groovy DSL脚本提交给它.然后我创建了一个作业生成器Jenkins作业,该作业来自jenkins-ci repo并且具有单个Process Job DSLs步骤.此步骤勾选了Look on Filesystem框,并将DSL Scripts字段设置为jobs / * .groovy.随着全局推送通知已经到位,这或多或少按预期工作:如果我对jenkins-ci repo进行更改,则作业生成器作业会自动运行并重新生成所有作业 – 非常棒!
我不喜欢这个解决方案的是它具有较差的引用位置:作业的DSL脚本存在于与代码完全独立的存储库中.我真正喜欢的是将作业DSL脚本保存在每个单独的代码存储库中,在jenkins子文件夹中,并且只有一个种子作业可以处理它们.这样,对CI设置的更改可以在代码旁边进行代码审查.对我而言,这感觉就像一个理想的设置.
不幸的是,我对如何实现这一点并不清楚.如果我能找到一种方法让种子作业观察多个repos,这样对其中任何一个的提交都会触发它,也许我可以在Process Job DSLs步骤之前注入另一个构建步骤并且(以某种方式)脚本我的方式胜利,但……我不确定如何达到这一点. (我当然不希望在生成器工作中完成每个repo的完整克隆只是为了拉入DSL脚本!)
我怀疑我不是第一个希望他们可以将Job DSL脚本放在代码旁边的人,尽管我可能会高估它的好处.关于这个主题的任何建议将非常感谢 – 谢谢!
最佳答案 不幸的是,没有直接的解决方法.已经打开了几个功能请求(
JENKINS-33275,
JENKINS-37220),但AFAIK没有人正在处理它们中的任何一个.
作为一种解决方法,您可以使用Pipeline Multibranch Plugin并为每个存储库创建一个多分支项目.然后,您必须将一个简单的Jenkins文件添加到每个repo /分支,并使用Jenkinsfile来执行您的Job DSL脚本.有关详细信息,请参见Use Job DSL in Pipeline scripts.这需要最少的编码,但我认为必须克隆每个repo才能使用,因为Job DSL文件必须在文件系统上可用.
您可以使用Job DSL创建多分支作业,请参阅API查看器中的multibranchPipelineJob.这将是你的“根”种子工作.
如果您的存储库托管在GitHub上,您也可以签出GitHub Organization Folder Plugin.使用该插件,您只能为每个组织创建一个作业而不是多个多分支作业.