MBD开发过程中的持续集成应用

1. 概述

MBD ,model base design ,使用模型描述需求,并采用代码自动生成技术进行嵌入式开发。为当前汽车电子软件行业,AutoSAR架构下开发的主流技术。
随着DevOps概念的持续火热,以及在AutoSAR软件开发的标准性和分布性,行业内已经逐步开始使用jenkins等CI工具了,但是需要注意的是,在汽车电子这种纯嵌入式软件开发中,与现阶段流行的DevOps概念是有很大差异的,我们要做的是吸收融合能够提高软件开发效率和质量的工具和概念,而不是全盘挪用。
互联网软件行业中,DevOps主要解决的矛盾是 ,开发、运维、测试三者之间的非连续工作,以降低重复工作和开发人员的精力时间消耗,将三个环节以流程和自动化脚本及构建工具进行有机结合。如下图所示:
001
而汽车电子软件行业里,由于嵌入式开发的目标单一性,不需要运维一岗,且测试一项工作在整个产品周期的占比要远远重于其它软件行业,不仅需要满足MCDC覆盖度的纯软件级测试,还要进行整合控制的各种在环台架测试,以及整车测试,由于测试工作的复杂性和重要性,也没有办法完全使用DevOps中的工具和流程覆盖。
那么问题来了,既然有诸多的区别和不适,我们汽车电子,到底要引入DevOps中的哪些内容?

1.1. 思想引入

DevOps实施后,会将开发流程工具化,重复工作自动化,例如企业级工具码云/Gitlab等,会提供任务分配(子任务关联、看板、燃尽图...),源码版本管理-git,问题管理等软件开发过程中,相关任务和流程管理工具。
传统的汽车电子软件开发流程都是由项目经理或者系统工程师进行统筹管理,且大部分都是零散化,使用邮件或者当面沟通,然后在项目转阶段或者例会时进行工作任务及状态的统计和分析,而DevOps开发中,会将工作任务统一管理,在相应工具和系统中进行指派跟踪,后续项目的状态由工具实时显示(燃尽图等)和自动统计,消除了部分整理材料的重复工作。

1.2. 工具引入

关于自动构建类的工具可以很容易引入到当前AutoSAR架构下的软件开发,以CI/CD类工具jenkins为例,可以与码云, matlab(simulink,polyspace), gtest,cmake 组建一条完整的嵌入式CI工具链。
引入持续集成工具链后,针对MBD开发,首先的好处就是保证了代码和模型的一致性(由持续集成的构建系统进行模型到代码的自动生成),工程师仅管理模型版本即可,降低出错概率;其次持续集成会覆盖模型/代码的静态规范检查,以及单元测试,在工具和流程上保证了代码质量,避免传统开发过程中,人工审核单元测试、静态测试是否完成以及完成的情况,同时也增加了工程师的开发效率,可以步入白天软件开发,晚上服务器自动跑相关测试,第二天早上收邮件查看昨天的代码有哪些问题的开发模式。
002

本文中,笔者将会以AutoSAR 应用层软件开发为例,示例讲解持续集成的应用方法。

2. 知识储备

002
需要注意,不能采用docker进行jenkins安装和部署,因为在docker中,容器内的jenkins想要触发宿主机上的matlab会有调用部分命令失败,易崩溃等大坑存在,所以还是要老老实实的正常安装jenkins。

3. 配置和设定

采用如下分支策略进行软件开发,dev线作为开发分支,jenkins以dev分支为基准进行构建。
005

3.1. 设定gitlab 触发 jenkins

gitlab仓库创建好之后,需要设定webhook,用于触发jenkins开始构建,trigger可以采用push\merge\commit 等相关事件,本示例采用push事件,下图中URLSecret Token 两项内容,需要复制Jenkins中相关配置内容。
004
006

此项设定所要填写的内容在jenkins如下界面中:
007
008
009

3.2. 授权jenkins 调用 gitlab

在jenkins创建好构建项目之后,需要配置调用gitlab相关api,首先在gitlab中勾选可调用的权限,并生成token
010
011

jenkins中需要安装 Gitlab, Blueocean 插件,安好插件后,将上一步复制的Token粘贴到如下选项中
012
013
014

配置好之后,可以在jenkins打开blueocean,创建git项目,按照提示进行操作,创建好之后可以自行编辑持续集成构建流水线所进行的操作。
015
017
016

4. 脚本示例

按照如上操作可以搭建出Gitlab + Jenkins 的基础持续集成工具链,但是要实际工程化应用,还需要编写各类自动化脚本,如下为其中模型自动生成代码的脚本部分示例。
注意,调用本示例脚本,需要在服务器上安装对应版本的matlab,并进行相应基础设置,测试模型采用simulink project进行路径管理,需要把测试模型添加到simulink project下才行。
018

  • matlab
%------------------------------------------------------------------------------
%   Simulink scrip for devops code generated.
%   File Name    : SlkCodeGen.m
%   MATLAB       : R2017b
%   Author       : Tomato
%   Time         : 2020/1/21
%   Instructions : Creat initial version           2020/1/21           V0.1
%  
%------------------------------------------------------------------------------
function SlkCodeGen()
    % Open project
    proj_name = '../../Mbd.prj';
    open(proj_name);
    proj = simulinkproject;
    % Open the model
    target_mdl = 'testMdl';
    open_system(target_mdl);
    % Set model parameters
    set_param(target_mdl,'LaunchReport','off');
    try
        rtwbuild(target_mdl);
    catch
        warning(['Error while building model - ',target_mdl]);
        exit(1);
    end
    % Restore model parameters
    set_param(target_mdl,'LaunchReport','on');
    % Close all simulink model without save
    bdclose;
    exit(0);
end
%-----End of Function----------------------------------------------------------

  • shell
cd /var/lib/jenkins/workspace/mbdevops_dev/work/scripts
matlab -nosplash -nodesktop -noFigureWindows -r SlkCodeGen

在jenkins中设定运行如上shell脚本即可,具体生成哪个模型的代码,以及生成代码后将其拷贝到特定的目录下,可以使用python等脚本进行编写,这里笔者就不再演示。

5. 小结

本文仅采用了代码生成这一项进行示例,实际使用起来,还有单元测试,Cmake list文件等等自动化脚本和工具需要编写,但是基础框架是不会变的。
针对git还是svn的问题,希望各位早日切到git,抛弃SVN,git的生态已经完善到足以无痛切换了,相反若使用svn,首先分支管理就要繁琐10倍不止,merge和rebase等更是天方夜谭。
码云还是gitlab、github,这三个各有利弊,码云和github是一类,企业化应用需要购买相应的套餐,无法离线本地化搭建应用,码云较github更为实惠,网络条件更好,而且为国产软件,有比亚迪等车企背书;gitlab可以本地化搭建,所有代码完全掌握在企业内部服务器,这就需要公司内有专门的人员进行搭建和维护,且软件资产较为重要,要进行网路攻防安保以及实时镜像备份等操作。到底本地化构建应用更安全,还是购买云端SCM库,由专业人士进行维护更安全,这就完全依赖不同公司的实力和策略了,总体来讲,中小公司建议直接买码云,大公司可以买企业Gitlab进行自建,笔者个人建议,无脑买码云就完事了。