CI/CD自动化——GitHub Actions/Jenkins在机器人项目中的应用
上篇聊了clang-tidy、cppcheck这些代码质量工具最后提到要把它们串进CI流水线。今天就把CI/CD这件事展开讲透。面试的时候被问你们代码提交之后怎么保证编译通过、测试能跑我当时说本地跑一遍没问题就push。面试官又问那多人协作呢每个人本地都跑一遍我想了想好像确实不太对。这就是CI/CD要解决的问题。CI是持续集成Continuous IntegrationCD是持续交付Continuous Delivery或者持续部署Continuous Deployment。说白了就是代码一提交自动跑编译、跑测试、跑代码检查全过了才算合格。不用人盯着机器帮你把关。在机器人项目里CI/CD特别重要。因为机器人软件依赖复杂ROS2、各种第三方库、编译时间长、测试需要仿真环境如果没有自动化流程光靠人工检查根本管不过来。GitHub Actions轻量级CI首选GitHub Actions是目前最流行的CI方案之一。配置简单和GitHub仓库深度集成开源项目免费用。在项目根目录创建.github/workflows/ci.ymlname: CI on: [push, pull_request] jobs: build-and-test: runs-on: ubuntu-22.04 container: ros:humble steps: - uses: actions/checkoutv4 - name: Install dependencies run: | apt-get update rosdep update rosdep install --from-paths src --ignore-src -y - name: Build run: | source /opt/ros/humble/setup.bash colcon build --cmake-args -DCMAKE_BUILD_TYPERelease - name: Run tests run: | source /opt/ros/humble/setup.bash source install/setup.bash colcon test colcon test-result --verbose每次push或者创建PRGitHub自动启动一个Ubuntu容器装好ROS2 Humble编译你的项目跑测试。编译失败或者测试不通过PR上会显示红叉reviewer一看就知道。GitHub Actions的优势在于配置简单、生态丰富。社区有大量现成的Action可以复用比如checkout代码、缓存编译产物、上传测试报告等。说说实际用的几个技巧。Matrix策略同时测试多个ROS2版本和Ubuntu版本。比如你的项目要支持Humble和Iron两个LTS版本可以配成matrixstrategy: matrix: ros_distro: [humble, iron] ubuntu: [22.04, 24.04]这样每次提交会同时跑4个job确保代码在所有目标环境上都能编译通过。缓存加速ROS项目编译一次可能要10-20分钟每次都从头编译太慢了。用ccache可以缓存编译结果第二次编译只编译改动过的文件。配置大概是这样- uses: hendrikmuhs/ccache-actionv1.2 with: key: ${{ matrix.ros_distro }}加上缓存以后增量编译通常只要1-2分钟。这个优化对开发体验的提升是巨大的——你提一个PR等2分钟就知道结果和等20分钟完全是两种心态。Artifact上传编译产物可以上传为GitHub Artifact方便下载和部署。测试报告也可以上传在PR页面上直接看到哪些测试通过了、哪些失败了。机器人项目中的CI实践机器人项目的CI比纯软件项目复杂主要因为几点。依赖管理ROS2项目依赖大量系统包CI环境需要预装。常见做法是用Docker镜像把ROS2和常用依赖都装好。仿真测试很多测试需要Gazebo仿真环境。CI里可以用gz sim -s跑无渲染模式或用xvfb模拟显示。测试分层很重要。单元测试Google Test、pytest每次提交都跑几十秒出结果。集成测试Gazebo仿真在PR合并前跑一次。系统测试在真实硬件上跑每天定时一次。硬件在环测试由测试工程师手动执行。编译缓存用ccache缓存编译结果增量编译只要1-2分钟比从零编译快好几倍。一个实际的CI流水线说一个我参与搭建的CI流程供参考。代码push到feature分支后GitHub Actions自动触发clang-format检查代码格式、clang-tidy静态分析、编译用ccache加速、跑单元测试。全部通过大概3-5分钟。创建PR时额外触发集成测试在Docker容器里启动Gazebo无头模式跑几个预定义的测试场景。通过后才允许合并。合并到main分支后Jenkins接手交叉编译ARM版本、打包成deb包、推送到内部制品仓库。同时通知运维团队由他们决定什么时候部署到现场机器人上。这套流程跑了一年多整体还不错。唯一的问题是Gazebo集成测试偶尔会超时——仿真环境启动太慢。后来我们把测试场景简化了从5分钟缩短到2分钟超时问题基本解决了。CD从代码到机器人CI解决了代码对不对的问题CD解决怎么把代码部署到机器人上的问题。最简单的CDCI编译测试通过后自动把可执行文件scp到机器人上。正式的CD流程会更规范编译→测试→打包Docker镜像或deb包→推送到制品仓库→机器人拉取更新。在机器人产品中OTAOver-The-Air更新是标配。关键要求是原子更新——更新要么完全成功要么完全回滚。常见做法是A/B分区当前运行在A分区新版本写到B分区写完后切换启动分区。启动失败则自动切回。面试中怎么聊CI/CD面试官问CI/CD你可以说我们用GitHub Actions做CI每次PR自动在Docker容器里编译和测试。容器镜像预装了ROS2 Humble和常用依赖。编译用了ccache加速测试包括单元测试和集成测试。通过后自动打包成Docker镜像部署时用docker-compose在机器人上启动。这种回答好在有具体工具、有完整流程、有机器人特色。CI/CD在机器人项目中的实践机器人项目的CI/CD有个特殊挑战编译时间长。一个完整的ROS2 workspace编译可能需要十几分钟。优化策略包括用ccache缓存编译结果、用Docker镜像预装依赖、只编译改动的包。另外单元测试在CI中很重要可以用colcon test运行所有包的测试。一个实用的pipeline是代码提交、lint检查、编译、单元测试、打包Docker镜像、部署到测试机器人。补充一点在CI中运行ROS2测试时可以用launch_pytest框架来编写集成测试验证多个节点之间的交互是否正确。给你的建议如果你还没用过CI从GitHub Actions开始。创建一个仓库写一个最简单的workflowcheckout代码、编译、跑测试。第一次看到绿色的对勾出现在PR上你会觉得特别有成就感。机器人项目的CI可以从简单开始先保证每次提交能编译通过再逐步加测试、加代码检查、加部署。不要一上来就搞复杂的流水线团队维护不过来。最后CI的价值不只是自动化是信任。有了CI团队成员可以放心提交代码因为机器会帮你检查。code review也能更专注在逻辑和架构上不用操心编译能不能过。上一篇第104篇 代码质量工具——clang-tidy/cppcheck和机器人代码规范下一篇预告第106篇 ROS的前世今生——从ROS1到ROS2的进化逻辑有任何问题欢迎评论区留言我会尽量回复。

相关新闻

代码质量工具——clang-tidy/cppcheck和机器人代码规范

代码质量工具——clang-tidy/cppcheck和机器人代码规范

面试的时候被问:"你们团队怎么保证代码质量?" 我当时说了句"靠code review"。面试官点点头,又问:"除了人工review,有没有用什么自动化工具?"我又卡了。 后来进了一个正规团…

2026/10/13 17:25:40 阅读更多 →
格鲁吉亚名义雇主的雇佣方式对企业全球扩展的影响

格鲁吉亚名义雇主的雇佣方式对企业全球扩展的影响

本文将围绕格鲁吉亚名义雇主的雇佣方式展开讨论、重点阐述其如何推动企业的全球扩展。名义雇主成为一种灵活的雇佣模式、能够帮助企业快速适应新等市场环境,规避合规风险。通过与当地名义雇主合作,如万领钧Knit People,企业可以简化招聘过程、…

2026/10/1 11:31:27 阅读更多 →
Java AI 实现 RAG 踩坑记:文档分块与向量检索的 3 个关键参数

Java AI 实现 RAG 踩坑记:文档分块与向量检索的 3 个关键参数

基于 Java 技术栈构建生产级 RAG 系统的深度实践 上周用 Spring Boot 给内部知识库接 RAG 时,原以为 90% 工作量在调模型 API,结果 80% 时间耗在文档预处理阶段。当测试用户问"飞算JavaAI的计费模式"时,系统竟返回了无关的产品架构…

2026/10/1 11:37:14 阅读更多 →

最新新闻

高效离职面谈:四种实战方法搞定主动与被动离职

高效离职面谈:四种实战方法搞定主动与被动离职

离职面谈这事儿,说大不大,说小不小。很多业务负责人和刚入行的HR伙伴把它当成一个“过场”,员工提离职了,约个时间聊二十分钟,问问“为啥走啊”“下家去哪啊”,然后填张表就算交差了。但真正在组织里待久了…

2026/10/13 17:30:42 阅读更多 →
离职面谈怎么做?四类场景实操方法与避坑指南

离职面谈怎么做?四类场景实操方法与避坑指南

做离职面谈这些年,我最大的感触是:大多数HR和管理者根本不会谈。不是话术不行,而是脑子里只有一套模板——不管是核心骨干提离职,还是试用期员工说走就走,开口都是"为什么离职啊,有什么困难可以沟通嘛…

2026/10/13 17:30:42 阅读更多 →
ANSYS模态分析+对称边界:让汉字‘春节快乐’振动起来

ANSYS模态分析+对称边界:让汉字‘春节快乐’振动起来

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 17:30:42 阅读更多 →
FPGA图像缩放与移动实战:坐标变换、DDR3带宽与调试解析

FPGA图像缩放与移动实战:坐标变换、DDR3带宽与调试解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 17:30:42 阅读更多 →
前端面试刷题:把题库变成面试模拟器的正确方法

前端面试刷题:把题库变成面试模拟器的正确方法

简介:面向准备前端求职面试的开发者,资料包系统覆盖Html、Css、JavaScript、Vue、React、Node、TypeScript、Webpack、算法、网络与安全、浏览器等前端核心方向,既适合刚入门的新人建立知识框架,也适合有一定项目经验的开发者针对…

2026/10/13 17:30:42 阅读更多 →
PL/SQL智能补全插件实战:解决Oracle开发命名、跳转与上下文感知难题

PL/SQL智能补全插件实战:解决Oracle开发命名、跳转与上下文感知难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 17:29:40 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →