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' } }  // ARM
    agent { node { label 'amd-builder' } }  // AMD
  • 子 Job 中设置适当的 timeout,避免死锁;

  • 使用邮件或企业微信通知机制,快速告警失败情况。


总结收获

本次实践充分利用了 Jenkins Pipeline 的 Scripted 嵌套能力,绕过了 Declarative 对 failFast 的限制,实现了高效、高反馈速度的多架构并行构建方案。这种模式非常适合:

  • 多平台(arm64、amd64)构建;

  • 多版本(企业版 / 开源版)并行验证;

  • CI 构建任务中敏捷反馈、高效利用资源的场景。

相关推荐
七夜zippoe35 分钟前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
yunteng5211 小时前
通用架构(同城双活)(单点接入)
架构·同城双活·单点接入
麦聪聊数据2 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
Fcy6482 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满2 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠2 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
程序员侠客行2 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Harvey9033 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技4 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
bobuddy4 小时前
射频收发机架构简介
架构·射频工程