传统汽车电子软件开发流程中,HMI开发往往占据了整个开发过程中很大一部分时间。由于HMI处于整个软件的最顶层,不仅会随着UI、UE的变更而变更,同时也会随着业务逻辑、中间件等的变化而不停变更,所以改进HMI开发在整个软件开发流程中至关重要。
HMI软件从零开始到最终交付,大概包括以下几个阶段:规划、需求分析、设计、编码、构建、测试、发布、部署和维护。

软件开发人员通常花费数周和数月来编写代码,然后进行集成,解决集成问题后打包交给测试团队进行功能测试,测试最终通过后将发布版本交给发布团队去布署。所有这些可以大概总结为三个阶段,即开发、测试和布署。在这个过程中,每个阶段都需要等本阶段所有工作完成之后,再进入下一阶段。
但事实上,开发过程中又不可避免地夹杂着需求变更、设计变更;测试过程中发现问题很难及时得到修复;软件在部署后又可能会产生不可预知的问题而不得不重新变更设计。这些问题在传统的HMI开发流程中让人颇为头疼,实际上,项目不可能是单向运作的,客户的需求也是随着认识加深而变化的,产品也需要随着需求的不断变化而持续改进。
于是,我们需要使用新的流程模型,那就是敏捷开发(Agile Development)。

敏捷开发在2000年左右开始被世人关注,是一种能应对快速变化需求的软件开发能力,其实简单来说,就是把大项目变成小项目,把大时间点变成小时间点,然后进行持续集成、持续交付和持续部署。通常敏捷开发会把上述过程变成一个小的迭代,每个迭代大约持续2~6周。每一次迭代都包含规划、设计、编码、测试、评估五个步骤,不断改进产品,添加新功能,通过频繁的迭代、增量开发、发布,以及跟踪对前一次迭代的反馈,最终变成客户真正想要的产品。
而敏捷开发的持续集成、持续交付和持续部署需求,催生了DevOps的出现。DevOps是什么?DevOps其实就是Development和Operations两个词的组合。DevOps是一组过程、方法与系统的统称,用于促进开发、部署和质量保障(QA)部门之间的沟通、协作与整合。

从上图可以看出,在DevOps下,HMI开发可以形成敏捷开发的自动化与闭环。从需求与计划,到编码、集成、测试、部署,都是自动化的流水线。每一次代码的提交,都将关联相应的需求,自动进行目标平台的交叉编译、静态代码检测、单元测试等,通过代码Review控制,进而自动集成形成HMI软件版本,提交到测试部门触发测试任务,最终进行部署,快速完成一次完整的集成、交付与部署。从结果来看,每一次代码提交,都能得到一个可测试、可部署的交付物,并且可以及时看到此次提交在目标平台的实际效果与反馈。

上图可见,通过DevOps的配置,我们还很好地控制了软件的质量,不管是Gerrit Review、静态代码检测还是单元测试不通过,软件工程师都无法真正把提交代码提交到主分支。即便以上都通过了,自动进入持续集成与构建中任何一个环节不通过,都会发出警报,或者自动回滚至正常版本。整个流程,软件工程师只能进行更标准化的操作,才能确保自己的代码能正常集成进去,而测试与部署团队更早更快结合到了开发中,软件工程师也更早参与到部署中发现问题,使整个HMI的开发更高效。
DevOps大幅提高了开发团队的工作效率,让需求、开发、部署团队结合得更紧密,版本的更新速度变得更快。但很多人可能会担心,“更新版本的速度快了,风险不是更大了吗?”

其实,DevOps可以帮助更快地发现问题,产品被更快地交付到用户手中,团队可以更快地得到用户的反馈,从而进行更快地响应。而且小步快跑的形式带来的版本变化是比较小的,风险会更小。即使出现问题,修复起来也会相对容易一些。
由此,生产力得到了大大的提高。DevOps让HMI更快流向了实际环境,而不是开发者设想的空中楼阁,开发,测试,布署变得更加紧密与迅速。
DevOps的包括项目管理平台、源代码库、代码审查、构建服务器、配置管理、部署工具、管道编排等,下面简单介绍几个关键部分。
源代码存储库是开发人员签入和更改代码的地方。源代码存储库管理签入的不同版本的代码,因此开发人员不必重写彼此的工作。流行的源代码存储库工具有Git、Subversion、Cloudforce、Bitbucket和TFS。
构建服务器是一种自动化工具,它将源代码存储库中的代码编译为可执行代码库。流行的工具有Jenkins、 SonarQube和Artifactory。
配置管理定义服务器或环境的配置。流行的配置管理工具有Puppet和Chef。
【管道编排】
管道就像一条生产装配线,从开发人员说“我想我已经完成”一直到代码被部署到生产或后期预生产环境中为止一直发生。
以下是DevOps平台搭建常用的工具:
项目管理:JIRA
代码管理:GitLab,SubVersion
静态代码检测:CppCheck,ParaSoft
代码 Review:Gerrit
持续集成(CI):Jenkins
脚本语言:Python,Shell
关于DevOps我们今天就介绍到这里,如果大家对DevOps比较感兴趣,可以在下方评论区留言,也请大家持续关注小怿,我们下期见啦~
