当前位置: 首页 > news >正文

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 构建任务中敏捷反馈、高效利用资源的场景。

http://www.dtcms.com/a/291656.html

相关文章:

  • 计算机网络:连接世界的数字脉络
  • Python爬虫实战:研究pymorphy2库相关技术
  • JVM:工具
  • 字节跳动视觉算法面试30问全景精解
  • Python爬虫实战:研究PyPLN库相关技术
  • PCIe之P2P应用
  • 从ZooKeeper到KRaft:Kafka架构演进与无ZooKeeper部署指南
  • Android perfetto 工具使用
  • 【前端】ikun-pptx编辑器前瞻问题二: pptx的压缩包结构,以及xml正文树及对应元素介绍
  • 从重复劳动到自动化:火语言 RPA 的实践与思考
  • python办自动化--读取邮箱中特定的邮件,并下载特定的附件
  • 物联网_TDengine_EMQX_性能测试
  • RabbitMQ-交换机(Exchange)
  • 【无标题】buuctf-re3
  • 解决pip指令超时问题
  • MCU中的总线桥是什么?
  • Windows PE文件内未用空间学习
  • Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章
  • wed前端简单解析
  • wangEditor5添加键盘事件/实现定时保存功能
  • 【文献笔记】ARS: Automatic Routing Solver with Large Language Models
  • SpringMVC快速入门之启动配置流程
  • C语言基础:函数练习题
  • 【洛谷】用两个数组实现静态单链表、静态双向链表,排队顺序
  • C#初学知识点总结
  • 假发行业数字化突围,外贸ERP重构外协管理引擎,助力效率飞跃
  • 智联智造:国内新能源汽车品牌AGV小车无线控制系统创新实践
  • 面试题:sql题一
  • 前端项目启动后,只有localhost地址,没有ip地址
  • vs2017 c++ 使用sqlite3数据库