Jenkins 多架构并发构建实战
背景介绍
在我们的 C++ 应用 的构建过程中,随着业务对异构架构(如 ARM 和 AMD)支持的需求不断增长,我们希望能够:
-
同时构建出适用于 ARM 和 AMD 架构的应用包;
-
两者构建过程独立但并发执行,节省整体构建时间;
-
如果任意一个架构构建失败,立即终止另一个任务,尽早失败反馈,节省资源和时间。
传统的 Jenkins 构建方式是串行或全部并行执行后再汇总结果,这与我们**“快速失败”**的目标相悖。因此,设计了以下解决方案。
技术目标
-
使用 Jenkins Pipeline 实现主 Job(app)触发两个子 Job 并发构建(如
app-arm
和 app-amd
); -
任意一方失败,立即终止所有构建任务;
-
具备可复用性、参数传递完整、流程清晰的 Pipeline 结构。
问题挑战
Jenkins 的 parallel
默认行为为:
等待所有分支完成,再汇总结果。即使某个子任务失败,也不会立刻终止其他任务。
我们需要主动启用一个选项来改变这一行为。
解决方案:使用 failFast
参数 + Scripted parallel
在 Jenkins Declarative Pipeline 中,我们使用 script
块嵌入 Scripted 风格的 parallel(failFast: true)
,达到“谁先失败就立刻全局失败退出”的效果。
实现代码
主 Job(app)Jenkinsfile 关键段如下:
pipeline { agent { node { label \'multi-build\' } } stages { stage(\'Parallel Build for ARM & AMD\') { steps { script { parallel( \'Build AMD\': { build job: \'app-amd_daily_v3\', parameters: [ string(name: \'appType\', value: \"${params.appType}\"), // ...其他参数略 ] }, \'Build ARM\': { build job: \'app-arm_daily_v3\', parameters: [ string(name: \'appType\', value: \"${params.appType}\"), // ...其他参数略 ] }, failFast: true // 关键参数 ) } } } }}
效果
-
构建开始后,两个子任务并行执行;
-
如果 ARM 构建失败,AMD 构建立刻被中止;
-
如果两者均成功,主任务成功;
-
故障可立即感知并反馈,避免浪费编译资源。
附加优化建议
-
对子 Job 设置不同的 node 标签,实现架构隔离,例如:
agent { node { label \'arm-builder\' } } // ARMagent { node { label \'amd-builder\' } } // AMD
-
子 Job 中设置适当的
timeout
,避免死锁; -
使用邮件或企业微信通知机制,快速告警失败情况。
总结收获
本次实践充分利用了 Jenkins Pipeline 的 Scripted 嵌套能力,绕过了 Declarative 对 failFast
的限制,实现了高效、高反馈速度的多架构并行构建方案。这种模式非常适合:
-
多平台(arm64、amd64)构建;
-
多版本(企业版 / 开源版)并行验证;
-
CI 构建任务中敏捷反馈、高效利用资源的场景。