背景
我正在使用 Jenkins 和 Build Pipeline 插件来构建一些需要多个编译步骤的相当复杂的项目:
- 构建源 RPM。
- 构建二进制 RPM(执行两次,每个平台一次)。
- 部署到 YUM 存储库。
我解决构建需求的策略包括将常见工作拆分为可跨项目和分支重用的参数化作业,每个作业代表管道中的一个阶段。每个阶段都由参数触发,并将构建工件传递给管道中的下一个作业。但是,我在使用这种策略时遇到了一些麻烦,并且真的可以使用一些技巧来了解如何以最优雅和最灵活的方式解决这个问题。
更具体地说,有两个公共库,由其他项目(但不是所有项目)共享。这些库的构建方式与依赖项目不同,但不必在 Jenkins 中指定依赖项目是什么。
有多个分支,主分支(每晚重建)、开发分支(轮询更改)、功能分支(也轮询)和发布分支(轮询,但为发布而构建)。分支在多个项目中以相同的方式构建。
我们每个月都会创建多个存储库,虽然期望为新项目进行一些设置是可行的,但通常我们希望它尽可能简单和自动化。
问题
我有许多具有多个分支的项目,我不希望以相同的方式构建所有分支甚至所有项目。因为大多数构建步骤都是相似的,我可以将这些常见步骤转换为参数化构建作业,并让每个作业触发链中的下一个,传递参数并沿着链构建工件。但是,如果需要跳过其中一个步骤,这将分崩离析,因为我不知道有条件地跳过构建步骤的方法。这意味着我需要复制构建作业,以便我可以为每个管道自定义它们,从而产生大量的构建作业。我可以使用插件组合来创建作业生成器(例如 dsl 流、dsl 作业等),并尽可能对用户隐藏,但最优雅的 Jenkins 解决方案是什么?有没有插件,或我可能错过的例子?你做这件事的经验是什么?
因为第 2 步可以分成两个可以并行运行的作业,所以这引入了一种复杂性,导致我的管道出现问题。我的第一次尝试会使用不同的参数触发参数化构建作业两次,然后使用 join 插件加入作业,但是从两个上游作业复制构建工件开始看起来很复杂。这很重要,因为我需要两个作业的构建工件用于第 3 阶段。加入并行作业并从它们全部复制工件的最优雅的解决方案是什么?有没有我可能错过的例子?
我需要将阶段 2 中两个作业生成的测试结果结合起来,并将它们复制到触发构建的作业中。处理这个问题的最佳方法是什么?
我很高兴阅读文章、演示文稿、技术文章、参考文档、编写脚本以及使这项工作正常工作所需的任何其他内容,但我不是 Jenkins 专家。如果有人可以就这三个问题给我一些建议,那将很有帮助。此外,如果相关,我将不胜感激有关如何在 Jenkins 中充分利用管道 CI 构建的任何建设性建议。