仅执行自上次 运行 以来修改过的 DSL 脚本的 Jenkins 种子作业?

Jenkins seed job that executes only DSL scripts modified since the last run?

我有几个源代码存储库,其中包含 Jenkins 构建的各种代码,在 Jenkins 作业和源存储库之间具有一对一的映射。除了这些,我还有一个 single 存储库,其中包含用于构建其他存储库的 creating/updating Jenkins 作业的作业 DSL 脚本。情况看起来像这样:

我曾希望找到一种方法将作业 DSL 脚本存储在各个源存储库中,就在代码旁边,并有一个单一的种子作业,可以通过推送通知触发 any 的其他存储库。不幸的是,这似乎目前没有得到很好的支持(参见 的已接受答案)。鉴于此,目前看来最简单的做法是将所有 DSL 保留在一个单独的存储库中,并让推送到该存储库的通知触发 groovy 脚本的重新处理。这一切都或多或少地工作得很好。

也就是说,我有点担心种子作业在触发时会重新运行 所有 DSL 脚本,而不仅仅是那些实际更改过的脚本。 (老实说,我不确定这是否是 'problem',我只是担心它会在以后导致令人惊讶的行为。)

有没有什么方法可以重组种子作业,使其只重新运行触发构建的提交修改的脚本?或者……这不值得担心吗?

作业 DSL 只会在生成的配置更改时更新作业。它将生成的 XML 与现有配置进行比较,以查看是否需要更新。参见 JenkinsJobManagement.java。因此,如果您不手动更改作业或 运行 恶意插件在后台修改作业的配置,那么 re-running 脚本时应该没有问题。

并且 Job DSL 在 运行 多个脚本时重用 Groovy 脚本引擎,因此对性能的影响应该很小。参见 DslScriptLoader.groovy

因此,如果您的脚本没有副作用(例如进行 REST 调用或修改文件系统),那么即使不必要,re-run 脚本也应该没有问题。