我有几个源代码存储库,包含Jenkins构建的各种代码,Jenkins作业和源存储库之间有一对一的映射。与这些不同,我有一个单存储库,其中包含用于创建/更新构建其他存储库的Jenkins作业的Job DSL脚本。情况看起来像这样:
我曾希望找到一种方法将Job DSL脚本存储在各个源存储库中,与代码一起存储,并且只有一个种子作业可以通过推送通知来触发任何其他存储库。不幸的是,目前似乎没有得到很好的支持(请参阅this question的已接受答案)。鉴于此,现在将所有DSL保留在单个独立的存储库中似乎是最简单的,并且允许向该存储库发送推送通知会触发groovy脚本的重新处理。这一切都很好,或多或少。
那就是说,我有点担心种子作业 - 当被触发时 - 重新运行所有的DSL脚本,而不仅仅是那些实际已经改变的那些。 (老实说,我不确定这是否是一个'问题'本身,我只是担心以后会导致令人惊讶的行为。)
我是否可以通过某种方式重新构建种子作业,以便它只重新运行由触发构建的提交修改的脚本?或者......这不值得担心吗?
答案 0 :(得分:4)
如果生成的配置发生更改,作业DSL将仅更新作业。它将生成的XML与现有配置进行比较,以查看是否需要更新。见JenkinsJobManagement.java。因此,如果您不手动更改作业或运行在后台修改作业配置的恶意插件,则重新运行脚本时应该没有问题。
Job DSL在运行多个脚本时重用Groovy脚本引擎,因此性能影响应该很低。请参阅DslScriptLoader.groovy。
因此,如果您的脚本没有副作用(例如,进行REST调用或修改文件系统),那么即使没有必要也可以重新运行脚本。