单个种子作业可以处理来自多个存储库的 DSL 吗?

Can a single seed job process DSLs from multiple repos?

我最近设法将几个手动创建的作业转换为 DSL 脚本(内联到临时 'seed' 作业中),并且惊喜地发现它是如此简单。现在我想摆脱 多个 种子工作并尝试更清晰地构建事物。

为此,我创建了一个新的 jenkins-ci 存储库并将所有 Groovy DSL 脚本提交给它。然后我创建了一个 job-generator Jenkins 作业,它从 jenkins-ci 存储库中提取并且有一个 Process Job DSLs 步骤。此步骤勾选了 Look on Filesystem 框,DSL Scripts 字段设置为 jobs/*.groovy。有了全局推送通知,这或多或少会按预期工作:如果我对 jenkins-ci 存储库进行更改,job-generator 作业会自动运行并重新生成所有作业——太棒了!

我不喜欢这个解决方案的地方在于它的引用位置很差:作业的 DSL 脚本位于与代码完全独立的存储库中。我 真正 喜欢的是将作业 DSL 脚本保存在每个单独的代码存储库中的 jenkins 子文件夹中,并有一个 single 处理它们的种子作业。这样,对 CI 设置的更改可以与代码一起进行代码审查。对我来说,这感觉像是 理想 设置。

不幸的是,我不清楚如何实现这一点。如果我能想出一种方法让种子作业监视多个存储库,这样对其中任何一个的提交都会触发它,也许我可以在 Process Job DSLs[=37= 之前注入另一个构建步骤] 步骤并(以某种方式)编写我的胜利之路,但是...我什至不确定如何 get 到那一点。 (我当然不想为了引入 DSL 脚本而对生成器作业中的每个存储库进行 完整 克隆!)

我怀疑我不是第一个希望他们可以将 Job DSL 脚本与代码放在一起的人,尽管我可能高估了好处。非常感谢有关此主题的任何建议 - 谢谢!

不幸的是,没有直接的方法来解决这个问题。已打开多个功能请求 (JENKINS-33275, JENKINS-37220),但 AFAIK 没有人处理其中任何一个。

作为解决方法,您可以使用 Pipeline Multibranch Plugin and create a multibranch project for each of your repositories. You must then add a simple Jenkinsfile to each repo/branch and use the Jenkinsfile to execute your Job DSL scripts. See Use Job DSL in Pipeline scripts 了解详细信息。这将需要最少的编码,但我认为必须克隆每个 repo 才能使其工作,因为作业 DSL 文件必须在文件系统上可用。

您可以使用作业 DSL 创建多分支作业,请参阅 API 查看器中的 multibranchPipelineJob。这将是你的 "root" 种子工作。

如果您的存储库托管在 GitHub 上,您还可以查看 GitHub Organization Folder Plugin。使用该插件,您只需为每个组织创建一个作业,而不是多个多分支作业。