高嵩,现就职于武汉智能设计与数控技术创新中心,研发效能(DevOps)工程师(中级)认证学员
摘要:
嵌入式系统因其具有高集成度、高稳定性、低成本等特点,广泛应用于各行各业。嵌入式软件开发需要深度考虑与硬件及相关环境的兼容性。开发团队需要更高效、更灵活的方法来开发、部署和维护嵌入式产品。DevOps作为一种流程和文化的理念,已经在软件开发领域取得了显著的成果。本文将分析DevOps如何应用于嵌入式产品开发,并探讨其中的挑战和解决方案。通过对实际案例的分析和总结,本文将为嵌入式产品开发团队提供有益的启示和指导。
关键词:DevOps、嵌入式系统、嵌入式软件开发、持续集成、持续交付
1、引言
随着信息技术的不断发展,嵌入式系统已经成为了现代生活中不可或缺的一部分。从智能手机到汽车,从家用电器到工业自动化,嵌入式系统的应用无处不在。然而,随着嵌入式产品的复杂性和功能需求的不断增加,传统的开发方法已经无法满足快速交付市场的挑战。DevOps作为一种整合开发和运维的理念,提高软件产品和质量的先进方法论,在软件开发领域得到广泛应用[1]。但目前关于DevOps的最佳实践大多集中在互联网和应用软件开发领域,在嵌入式软件开发领域实践受到一定的限制[2]。本文将探讨DevOps在嵌入式软件开发领域的实践,以期为嵌入式软件开发团队提供更高效、更灵活的开发流程。
2 、DevOps概述
DevOps是Development(开发)和Operations(运维)两个词的组合,旨在消除开发团队和运维团队之间的壁垒,实现软件开发、部署和维护的自动化和持续化[3]。DevOps强调的是一种文化和流程的转变,其中包括以下核心关键实践:
(1) 自动化:通过自动化工具和脚本来执行开发、测试、部署等过程,减少人工干预,提高效率和一致性。
(2)持续集成(CI):持续将开发人员的代码集成到共享存储库中,并自动进行编译和测试,以确保代码的质量和稳定性。
(3)持续交付(CD):持续将通过CI流程测试通过的代码部署到生产环境中,以实现快速、可靠的软件交付。
(4)监控与反馈:通过监控系统的运行状态和用户反馈,及时发现和解决问题,持续改进产品质量和用户体验。
DevOps的核心目标是持续高效低成本地交付价值。以精益生产思想为核心,融合敏捷开发方法,通过缩短软件开发周期,提高交付速度和质量,降低故障率和成本,以满足不断变化的市场需求,在高速发展的互联网行业得到广泛应用。随着开源生态的发展,出现了一系列开源自动化工具,如:Jenkins、Gitlab、Kubernetes等。但是,这些工具具备较强的单元特性,实践中往往需要有信息化集成和维护的能力,这无疑提高了DevOps的实践门槛。近几年,一些互联网技术大厂在内部成功实践DevOps的前提下,也推出了一系列商业化的DevOps系统,如Microsoft Azure、Huawei CodeArts、Tencent Coding DevOps等,其集成度更高、界面更友好,为中小企业及其他领域实施DevOps转型提供了有力支撑。
3、嵌入式软件开发的挑战
与传统的软件开发相比,嵌入式软件开发具有以下特点:
(1)硬件依赖[4]:嵌入式软件通常与特定的硬件设备集成,开发过程需要考虑硬件和软件之间的兼容性和交互。
(2)实时性要求:通常嵌入式软件需要满足严格的实时性要求,嵌入式系统各模块之间有严格的时序要求,需要确保系统在预定的时间内响应和处理各种事件。
(3)资源受限:嵌入式软件通常具有有限的存储空间和计算资源,开发团队需要优化代码和资源利用率,以保证系统性能和产品成本之间的平衡。
这些特点使得用于传统软件开发的DevOps框架和工具难以在嵌入式软件开发中实践,主要存在以下挑战:
(1)产品版本管理的挑战。软硬件耦合性太强,导致不同的硬件配置,软件都需要有配套的版本。会存在数十种硬件配置的产品同时维护的场景。
(2)测试效率的挑战。嵌入式系统软件的测试必需要进行软硬件联调,通常通过手工执行。在嵌入式设备上部署自动化测试的代理服务是很难实现的,同时也可能影响嵌入式系统的性能。
(3)知识产权安全的挑战。嵌入式系统软件通常存在根据硬件特调的技术参数,得出这些参数的背后,往往需要大量的经验和实验,是企业的重要数字资产。如何管控嵌入式系统软件源代码的流通也是一项重要挑战。
4、嵌入式软件开发模式设计
针对以上挑战,本文将从组织协作和CI/CD两个方面探讨嵌入式软件开发的模式,以实现嵌入式软件的持续集成与持续交付,缩短嵌入式产品上市周期。
4 .1 面向嵌入式软件的反脆弱组织构建
嵌入式软件产品上层面向终端用户,底层对接硬件板卡,用户主要关注产品的功能和体验,而硬件则是产品成本的重要组成部分。在产品设计中,既要以用户为中心,充分满足用户的使用需求,也要满足低硬件成本的需求,避免不必要的成本浪费。因此,必须要有明确的总体架构设计才方便需求层层分解与落地。
总体架构设计要以高内聚和低耦合为基本目标,采用分层设计思想,通常将嵌入式软件分为应用层、业务逻辑层、功能模块层、硬件驱动层、操作系统层。其功能模块层还可以拆分出用户态功能模块层和内核态功能模块层。在总体设计阶段,还需要规划出每一层的API模块,明确接口,确保层与层之间的依赖关系,避免下层依赖上层的情况发生。分层架构设计将为DevOps的实践带来以下好处:
(1)便于产品需求分解。各层之间可以看作是"甲方"与"乙方"的关系,底层作为"乙方",为上层"甲方"提供服务。因此,产品需求的分解可以看作是各层分工协作的过程。
(2)明确团队工作的边界,让合适的人做合适的事。反脆弱的组织要求当团队中角色出现"缺口"时,其他成员能快速"补位"。通过打造学习型的组织,让成员之间互相学习是一种有效的手段。但是,在嵌入式软件开发中需要注意团队的边界。例如,让做应用层开发的成员去了解驱动层开发可能会适得其反。因此,将团队边界限定在每一层内,更容易形成反脆弱组织。
(3)方便拆分CI/CD的粒度。模块的划分有助于减少持续构建的工作量,减少不必要的构建;依赖关系的明确有助于划分流水线的执行顺序;明确的接口设计有助于制品的规划与集成。
总体架构确定后,可采用SoS(Scrum of Scrums)的规模化敏捷开发模式,Scrum团队在每一层内组建。指定PO、SM及团队成员,PO不仅需要维护本团队的产品需求,还负责向底层提出需求。
在整个嵌入式系统层面,组建SoS团队,由产品负责人、SoS Master、市场VP、架构专家及Scrum团队的PO组成。每周组织2-3次会议,来调整、改进和清除障碍。每个团队的代表或产品负责人应该集中讨论团队的进度、达成目标的风险或对其他团队的依赖,然后分享其他团队可以利用的改进方法。
4 .2 考虑软硬件测试的C I/CD 设计
首先,面对嵌入式软件系统知识产权安全的挑战,引入制品管理机制。制品管理从文件访问权限方面很好的实现了编译时和运行时的解耦,使得企业只需要关注编译时相关文件(如源代码)的流转。可以通过在研发环境内部设置不同的工作域来定义权限,如划分开发域、测试域、发布域。可以通过云桌面等产品将源代码等限制在开发域中,以达到保护知识产权的目的。
其次,需要尽量开发虚拟调试工具。一方面,利用虚拟调试工具避免在嵌入式硬件上进行Debug工作,将Debug工作限制在开发域中,避免源码流转到嵌入式硬件中;另一方面,随着工业领域数字孪生概念的持续发展,虚拟调试工具可以成为数字孪生产品的重要单元技术积累,为产品后期接入数字孪生场景打下基础。
再次,要建立分支开发-主干发布的代码管理工作流,如图1所示。选用Git分布式版本管理工具以适应规模化团队协作。研发工程师通过根据需求或BUG来源基于develop分支建立Feature和Bugfix分支进行开发,开发完成后通过PR(Pull Request)合并到develop分支中。项目管理员根据发布计划和进度,将develop分支通过合并到main分支中。
图1 Git分支开发-主干发布工作流示意图
值得注意的是,在大型团队转型过程中,难免出现架构解耦不彻底的阶段,存在多个功能耦合的情况。这使得所有修改都从main中合并到release可能面临时效性不足以及影响稳定性的风险。所以,保留"热修复"机制,先通过hotfix分支优先解决release分支的问题,再确认修复后,将更改pick到bugfix分支中,进而逐步合并到develop和main分支中。流程如图2所示。
图2 热修复工作流示意图
在此基础上建立CI/CD流水线如图3所示。由开发人员完成开发和自测后,通过发起PR触发CI构建流水线,CI流水线生成制品并进入制品库Local区。制品库Local区在收到制品版本更新后触发测试流程,经过测试质量门禁后,将测试结果反馈给PR。PR根据结果为触发制品提升任务,将当前制品从Local区提升到PreRelease区。在下次develop分支合并到main分支时,PR将触发PreRelease区制品的UAT测试,同样在测试通过后,将自动完成分支合并和制品提升到release区。该区域的制品在经过用户测试后,才允许作为版本发布。
图3 嵌入式软件CI/CD流程示意图
5、DevOps在国产智能数控系统产品开发中的实践效果
该数控系统产品为典型的嵌入式系统产品,该产品的硬件最小集包括工控机(IPC)、人机交互面板(HMI),如图4所示。IPC并通过HDMI和USB接口与HMI进行I/O通信。在IPC中运行实施操作系统(RTOS)及功能软件产品。
经测算,使用本文所提出的研发模式一个月后,价值流动效率提升接近30%,且故障率减少接近56%。随着团队成员对新模式的逐渐熟练,以及持续反馈持续改进,有望在1年内实现平均每天发布一次。
6、结论
本文从理论和实践的角度探讨了DevOps在嵌入式产品开发领域的应用。通过分析DevOps的核心概念和实践原则,以及嵌入式产品开发的特点和挑战,探讨了如何将DevOps应用于嵌入式产品开发,并提出了相应的解决方案。通过实践案例的分析和总结,本文验证了DevOps在嵌入式产品开发中的可行性和有效性,为开发团队提供了有益的启示和指导。
然而,需要注意的是,将DevOps应用于嵌入式产品开发并不是一蹴而就的事情,需要开发团队和运维团队共同努力,逐步改进和完善开发流程和工具,不断提高团队的能力和水平。期望本文的研究成果能够为嵌入式产品开发团队提供参考和借鉴,推动DevOps在嵌入式产品开发领域的进一步应用和发展。
参考文献
[1] 金泽锋,张佑文,叶文华,等.面向完整价值交付的文档DevOps应用研究[J].软件学报,2019,30(10):3127-3147.
[2] 童向杰, 郑武, 谢凤玲, 等. 企业数字化转型中的硬件DevOps实践[J/OL]. 价值工程, 2020, 39(1): 1-5.
[3] 荣国平,张贺,邵栋,等.软件过程与管理方法综述[J].软件学报,2019,30(01):62-79.
[4] 黄铮,周洁,朱学海.一种基于Azure DevOps的面向嵌入式软件的持续集成及自动测试环境[J].工业控制计算机,2022,35(09):17-19+23.