自行搭建嵌入式持续集成工具:从0到1
为什么持续集成备受推崇?
软件开发过程中,开发方式及开发工具是至关重要的。
持续集成(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相关推荐
- 持续集成工具 gitlab-runner 介绍
做为一个略微看过nodejs语法,但又不懂nodejs的攻城狮,搭建hexo环境很是麻烦,要考虑到FQ.版本兼容等问题.于是乎,博主每换一个电脑,为了能继续发博客,都需要在新电脑上花一天时间重新搞一下 ...
- 持续集成工具之Hudson
一.什么是持续集成 持续集成的核心概念 CI 过程会经常构建软件组件:在许多情况下,每当源代码存储库(比如 Subversion 或 ClearCase)中的代码发生变化时,都要构建软件组件.CI ...
- python 持续集成工具_持续集成工具: Jenkins学习
持续集成工具: Jenkins学习 -- 部分内容收集自网络,如有侵权,请联系作者删除 一. 概念 在过去的开发整体流程中,是所有人写好代码之后统一进行合并(svn,git),然后进行测试,确保准发布 ...
- 在CentOS7上安装Drone搭建CI持续集成环境
文章目录 在CentOS7上安装Drone搭建CI持续集成环境 前言 安装前规划 安装过程 配置域名解析 安装Docker 拉取Drone Server镜像 添加GitHub OAuth Applic ...
- 如何做好持续集成和部署?你不容错过的持续集成工具—Jenkins
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地 ...
- 持续集成工具 jenkins
研究比较深入的博客地址: http://blog.csdn.net/wangmuming/article/category/2167947 Jenkins安装与配置 2 Jenkins安装 在最简单的 ...
- Docker系列之搭建Jenkins持续集成Maven项目
持续集成(Continuous integration,简称CI)指频繁将代码集成到主干,持续集成的目的就是让产品可以快速迭代,同时还能保持高质量,一般包括代码拉取.构建.测试.部署等步骤.Jenki ...
- 【云原生 • DevOps】一文掌握持续集成工具 Jenkins
目录 一.持续集成工具 Jenkins 介绍 1. 什么是持续集成 2. Jenkins 介绍 二.Jenkins 的安装与部署 1. 安装 Jenkins 2. 本地访问 Jenkins 3. 插件 ...
- 持续集成工具 Jetbrains TeamCity 简介
目录 安装 Windows下安装 Docker下安装 使用TeamCity 初始化 配置数据库 新建项目 设置构建步骤 构建项目 测试项目 自动构建 邮件通知 大名鼎鼎的Intellij IDEA大家 ...
最新文章
- oracle日志备份少数据库,oracle 账号锁定日志Oracle数据库全量备份恢复和部分备份恢复...
- Java List部分截取,获得指定长度子集合
- 前端每日实战:114# 视频演示如何用纯 CSS 和混色模式创作一个 loader 动画
- int main() 与 void main()
- 软件构架则是软件之上的 飞鸽传书 软件
- 网站随机动态密码代码
- python--集合概念和实战(一)
- 现在每月五千块钱的收入,相当于七八十年代的多少钱?
- 部队计算机专业培训申请书,《计算机专业奖学金申请书》.docx
- 如何查看本地ip地址和外网地址
- yolov5 nms 源码理解
- 2016 年度开源中国新增开源软件排行榜 TOP 100
- Lesson16基于消息的异步套接字聊天室程序 VS2013 VC++深入详解 孙鑫
- 计算机系统应用的书,基于个性化图书推荐的协同过滤算法
- 【学习笔记】兄弟连Linux教程摘要
- KANO模型以及产品经理的素质模型
- 关于微软学术搜索项目
- Linux 第四章-文件管理
- 3-6岁经典绘本分级大推荐,给孩子先收藏起来
- idea中项目出现乱码的解决方式(包括tomat,maven,HttpServlet页面中文出现乱码等问题)
热门文章
- html第2天课堂笔记,第二天课堂笔记
- html网页如何引入用linkcss文件,[网页设计]link和@import url()引入外部css文件的区别...
- mycat分表之ER表分片、范围分片、取模分片、日期分片、全局表等
- oracle数据库11g完全卸载,oracle 11g完全卸载
- .net 数据存储 mysql_asp.net实现存储和读取数据库图片
- java daemon线程的作用_JAVA DAEMON线程的理解
- mysql 自动备份_如何将mysql备份自动存储到minio
- matlab输出lccde_Matlab与Visual C++混合编程处理全站仪数据的方法
- python json转dict(dict转json)
- python转str类型的列表为list格式