为什么持续集成备受推崇?

软件开发过程中,开发方式及开发工具是至关重要的。

持续集成(Continuous Integration,CI)以使产品在快速迭代的同时保持高质量为目的,指开发人员定期将代码变更合并到一个中央存储库中,系统自动运行构建和测试操作的过程。持续集成出现之前,开发人员需要手动编译打包最新代码进行测试,费时费力;且往往要在模块集成的最后关头才能发现被遗漏的错误的存在,而定位错误的具体位置又将消耗大量时间。

引入持续集成的必要性显而易见。

如何从零构建一个嵌入式持续集成工具?

5upercircuits的创始人Pla讲述了他自建嵌入式持续集成工具的过程[1]。

在建立之初,Pla希望这个工具尽可能地高效有用,满足动化、高品质、足够精简但有效的性能。他希望成品能够:

1. 自动执行当前必须手动、缓慢繁琐的工作;

2. 只要不断电,全天候24小时可用;

3. 拥有监控功能,可以立即汇报代码存在潜在的bug——这将大大降低调试难度,尽可能地确保软硬件的整体质量。

在经过细致的考量后,Pla最终决定:先利用docker部署嵌入式开发环境,然后通过GitLab的CI面板(GitLab内置的持续集成工具)对编写好的程序进行一键编译、烧录、运行和自动测试,达到持续集成的目的。

嵌入式持续集成的难点在哪里?

持续集成的设置通常包括:构建、测试、部署。

仅使用一个开发平台(如Web开发)实现持续集成并不难,但在嵌入式系统中却大不相同。首先,从构建的角度来说,开发者必须处理PC(一般是x86或ARM)与持续集成系统所使用的不同的处理器架构、操作系统和硬件之间的关系。但一般只要使用 makefile 和交叉编译器(例如 GNU Arm Embedded Toolchain[2]),自动化构建问题便会迎刃而解。

再者是测试,需要支持不同硬件架构的嵌入式系统可以正常运行,但大多数情况下,持续集成设置和待测设备 (Device Under Test,DUT) 不是同一硬件架构。Pla必须找到合适的接口和协议来进行持续集成设置和DUT的通信。

其他嵌入式系统公式是怎么做测试的?

许多嵌入式系统公司都在嵌入式开发中使用持续集成。在目标硬件上进行构建和单元测试是惯用手段。单元测试有着下述优点:

1. 立即发现代码中的潜在错误;

2. 更容易重构和扩展代码——单元测试确保了不会产生意外中断;

3. 使团队合作更加高效。

但单元测试不适合像Pla这样的自由职业者、业余爱好者,或初创公司。单元测试必须在目标系统上运行,或将代码移植到X86平台并在持续集成系统上运行。如果需要对代码中的几乎每个函数进行测试,这意味着测试量与代码量相同,这将导致消耗目标系统大量内存。而如果将代码移植到X86平台来避免内存消耗问题,则不得不在移植、伪造驱动程序耗费大量额外的时间和精力。这么做的目的是欺骗代码,使之认为自己是在目标硬件上运行的。

对于Pla来说,这两种情况都过于费时费力,无法接受。

该使用怎样的持续集成测试方法?

Pla选择了将单元测试和冒烟测试相结合的测试方法,并将之命名为命令行界面(Command Line Interface,CLI)测试:为在 x86 上运行的持续集成系统提供了一个接口,以便直接在目标平台上运行测试。

CLI测试为尽可能详尽的测试,甚至能直接访问最隐秘的系统功能,不需要在持续集成面板上运行,也无需移植,预处理器指令甚至可以暂时排除一些 CLI 测试。

Pla借此为不同的模块设置了不同的测试集,并且仅在需要时将其包含在构建中,从而降低了CLI测试的内存占用。

Pla的持续集成设置是什么样的?

Pla使用Gitlab来进行控制修订、备份,项目规划和笔记记录。Gitlab有一个非常精简的持续集成功能。Gitlab CI面板可以在普通Gitlab实例上运行。Gitlab Runner是一个用来执行Gitlab CI脚本的工具。可以理解成,Runner就像认真工作的工人,GitLab CI就是管理工人的中心,所有工人都要在GitLab CI里面注册,并且表明自己是为哪个项目服务。当相应的项目发生变化时,GitLab CI就会通知相应的工人执行对应的脚本。Gitlab Runner负责执行所有持续集成任务(例如构建、测试等)。

▲Pla的Citlab CI控制台

▲Pla自制的简易持续集成设置。左侧是被测设备(DUT),右侧是连接设备。

是否有更好的测试工具?

从Pla自制图中可以看到,他将两个设备都放在了金属盒中,用以降低测试期间设备爆炸发生火灾的风险。有一个更好的测试工具,可以完美规避这个问题。

SkyEye(天目全数字实时仿真软件),是一款国产的基于可视化建模的硬件行为级仿真平台,可以帮助Pla实现测试。

▲SkyEye界面图

在Pla的持续集成工具搭建的过程中,只要将SkyEye部署在Gitlab Runner中,SkyEye便可模拟整个嵌入式系统,测试所需代码;也可将SkyEye运行在单独的容器中,直接将执行结果共享给Gitlab Runner。

Pla只需将代码提交至仓库,触发CLI测试的条件,SkyEye就会自动完成编译测试并输出报告。除了Gitlab CI外,Pla也可通过Jenkins与SkyEye的配合实现自动化测试。

SkyEye还可以使软件工程师通过可视化图形的硬件建模方式,快速搭建硬件模型,在硬件模型上运行和调试与真实硬件相同的二进制文件,并支持自动化测试。同时,SkyEye也可查看和修改处理器寄存器或设备寄存器的数据、查看反汇编、内存值、进行故障注入等。

▲SkyEye产品矩阵

总体来说,SkyEye使开发人员可以在软件集成前尽可能地发现错误,大大缩短了产品的研发周期,提高了软件调试效率,有效地降低了开发成本。

更多SkyEye相关内容,欢迎点击查看详情或访问www.digiproto.com进行了解!

参考文献

[1] Continuous Integration for embedded developers - Starters (5upercircuits.com)

[2] Arm GNU Toolchain | GNU Arm Embedded Toolchain Downloads – Arm Developer

自行搭建嵌入式持续集成工具:从0到1相关推荐

  1. 持续集成工具 gitlab-runner 介绍

    做为一个略微看过nodejs语法,但又不懂nodejs的攻城狮,搭建hexo环境很是麻烦,要考虑到FQ.版本兼容等问题.于是乎,博主每换一个电脑,为了能继续发博客,都需要在新电脑上花一天时间重新搞一下 ...

  2. 持续集成工具之Hudson

    一.什么是持续集成  持续集成的核心概念  CI 过程会经常构建软件组件:在许多情况下,每当源代码存储库(比如 Subversion 或 ClearCase)中的代码发生变化时,都要构建软件组件.CI ...

  3. python 持续集成工具_持续集成工具: Jenkins学习

    持续集成工具: Jenkins学习 -- 部分内容收集自网络,如有侵权,请联系作者删除 一. 概念 在过去的开发整体流程中,是所有人写好代码之后统一进行合并(svn,git),然后进行测试,确保准发布 ...

  4. 在CentOS7上安装Drone搭建CI持续集成环境

    文章目录 在CentOS7上安装Drone搭建CI持续集成环境 前言 安装前规划 安装过程 配置域名解析 安装Docker 拉取Drone Server镜像 添加GitHub OAuth Applic ...

  5. 如何做好持续集成和部署?你不容错过的持续集成工具—Jenkins

    持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地 ...

  6. 持续集成工具 jenkins

    研究比较深入的博客地址: http://blog.csdn.net/wangmuming/article/category/2167947 Jenkins安装与配置 2 Jenkins安装 在最简单的 ...

  7. Docker系列之搭建Jenkins持续集成Maven项目

    持续集成(Continuous integration,简称CI)指频繁将代码集成到主干,持续集成的目的就是让产品可以快速迭代,同时还能保持高质量,一般包括代码拉取.构建.测试.部署等步骤.Jenki ...

  8. 【云原生 • DevOps】一文掌握持续集成工具 Jenkins

    目录 一.持续集成工具 Jenkins 介绍 1. 什么是持续集成 2. Jenkins 介绍 二.Jenkins 的安装与部署 1. 安装 Jenkins 2. 本地访问 Jenkins 3. 插件 ...

  9. 持续集成工具 Jetbrains TeamCity 简介

    目录 安装 Windows下安装 Docker下安装 使用TeamCity 初始化 配置数据库 新建项目 设置构建步骤 构建项目 测试项目 自动构建 邮件通知 大名鼎鼎的Intellij IDEA大家 ...

最新文章

  1. oracle日志备份少数据库,oracle 账号锁定日志Oracle数据库全量备份恢复和部分备份恢复...
  2. Java List部分截取,获得指定长度子集合
  3. 前端每日实战:114# 视频演示如何用纯 CSS 和混色模式创作一个 loader 动画
  4. int main() 与 void main()
  5. 软件构架则是软件之上的 飞鸽传书 软件
  6. 网站随机动态密码代码
  7. python--集合概念和实战(一)
  8. 现在每月五千块钱的收入,相当于七八十年代的多少钱?
  9. 部队计算机专业培训申请书,《计算机专业奖学金申请书》.docx
  10. 如何查看本地ip地址和外网地址
  11. yolov5 nms 源码理解
  12. 2016 年度开源中国新增开源软件排行榜 TOP 100
  13. Lesson16基于消息的异步套接字聊天室程序 VS2013 VC++深入详解 孙鑫
  14. 计算机系统应用的书,基于个性化图书推荐的协同过滤算法
  15. 【学习笔记】兄弟连Linux教程摘要
  16. KANO模型以及产品经理的素质模型
  17. 关于微软学术搜索项目
  18. Linux 第四章-文件管理
  19. 3-6岁经典绘本分级大推荐,给孩子先收藏起来
  20. idea中项目出现乱码的解决方式(包括tomat,maven,HttpServlet页面中文出现乱码等问题)

热门文章

  1. html第2天课堂笔记,第二天课堂笔记
  2. html网页如何引入用linkcss文件,[网页设计]link和@import url()引入外部css文件的区别...
  3. mycat分表之ER表分片、范围分片、取模分片、日期分片、全局表等
  4. oracle数据库11g完全卸载,oracle 11g完全卸载
  5. .net 数据存储 mysql_asp.net实现存储和读取数据库图片
  6. java daemon线程的作用_JAVA DAEMON线程的理解
  7. mysql 自动备份_如何将mysql备份自动存储到minio
  8. matlab输出lccde_Matlab与Visual C++混合编程处理全站仪数据的方法
  9. python json转dict(dict转json)
  10. python转str类型的列表为list格式