Jenkins+Keil自动化编译实战:如何用bat脚本实现版本信息自动提取与打包
Jenkins+Keil自动化编译实战:如何用bat脚本实现版本信息自动提取与打包
在嵌入式开发领域,版本管理和自动化构建一直是提升效率的关键环节。想象一下这样的场景:每次代码提交后,系统自动完成编译、版本信息记录、打包发布的全流程,同时确保每个版本都能精确追溯源代码状态。这正是Jenkins与Keil结合带来的魔法。
对于使用MDK-Keil进行嵌入式开发的团队来说,手动编译、记录版本信息不仅耗时,还容易出错。一个典型的痛点:当现场反馈某个版本出现问题时,开发人员可能需要花费大量时间确认当时使用的确切代码版本。而通过自动化脚本,这些问题都能迎刃而解。
1. 环境准备与基础配置
1.1 Jenkins与Keil环境搭建
在开始编写自动化脚本前,需要确保基础环境就绪:
- Jenkins安装:推荐使用长期支持版(LTS),安装时勾选"安装建议插件"选项
- Keil路径配置:记录UV4.exe的完整路径,通常位于
C:\Keil_v5\UV4\目录下 - 版本控制工具:根据团队使用习惯安装Git或SVN客户端,并配置环境变量
提示:Jenkins在Windows系统上建议以服务方式运行,避免因用户注销导致构建中断
1.2 基础目录结构规划
合理的目录结构能大幅降低后期维护成本:
项目根目录/ ├── scripts/ # 存放所有bat脚本 ├── projects/ # Keil工程文件 ├── build/ # 构建输出目录 ├── tools/ # 打包工具如rar.exe └── doc/ # 版本说明文档2. 版本信息提取脚本开发
2.1 构建信息头文件生成
创建prebuild-git.bat脚本,自动生成包含编译信息的头文件:
@echo off set HEADER_PATH=%cd%\projects\firmware\include\build_info.h :: 生成编译时间信息 echo #define FIRMWARE_COMPILE_TIME "%date:~0,10%-%time:~0,8%" > %HEADER_PATH% :: 获取编译者信息 for /f "tokens=2 delims==" %%A in ('whoami') do set "USER=%%A" echo #define FIRMWARE_COMPILE_BY "%USER%" >> %HEADER_PATH% :: 获取Git提交哈希 for /f "delims=" %%i in ('git rev-parse --short HEAD') do set "GIT_HASH=%%i" echo #define FIRMWARE_VERSION "1.0.%%GIT_HASH%" >> %HEADER_PATH%2.2 多版本控制系统适配
对于使用SVN的团队,可添加如下逻辑:
:: SVN版本信息获取 for /f "tokens=2 delims= " %%i in ('svn info ^| findstr "Revision"') do set "SVN_REV=%%i" echo #define FIRMWARE_SVN_REVISION "%SVN_REV%" >> %HEADER_PATH%3. Keil自动化编译实现
3.1 基础编译脚本
创建keil_compile.bat控制编译流程:
@echo off set UV_PATH=C:\Keil_v5\UV4\UV4.exe set PROJECT_PATH=%cd%\projects\firmware\firmware.uvprojx :: 更新代码库 git pull --rebase :: 生成版本信息 call prebuild-git.bat :: 执行编译并记录日志 %UV_PATH% -j0 -b %PROJECT_PATH% -o %cd%\build\compile_log.txt :: 检查编译结果 findstr /C:"* TOOLCHAIN NOT INSTALLED *" build\compile_log.txt if %errorlevel%==0 ( echo 错误:Keil工具链未正确安装 exit /b 1 )3.2 编译结果验证
添加智能结果检查逻辑:
:: 检查hex文件是否生成 if not exist "%cd%\build\output\firmware.hex" ( echo 错误:编译输出文件未生成 exit /b 1 ) :: 检查文件大小是否合理 for %%F in ("%cd%\build\output\firmware.hex") do set "size=%%~zF" if %size% LSS 1024 ( echo 警告:生成的固件大小异常 )4. Jenkins集成与高级功能
4.1 Jenkins任务配置关键点
在Jenkins中创建自由风格项目时,需注意:
- 构建触发器:配置GitHub webhook或定时构建
- 构建环境:添加
Path to Keil环境变量 - 构建步骤:添加"Execute Windows batch command"步骤
4.2 版本打包自动化
扩展编译脚本实现自动打包:
:: 准备版本包目录 for /f "delims=" %%i in ('git describe --tags') do set "VERSION_TAG=%%i" set RELEASE_DIR=%cd%\releases\%VERSION_TAG% mkdir "%RELEASE_DIR%" :: 复制必要文件 copy "%cd%\build\output\firmware.hex" "%RELEASE_DIR%" copy "%cd%\doc\release_notes.pdf" "%RELEASE_DIR%" :: 使用7zip进行压缩 "C:\Program Files\7-Zip\7z.exe" a -tzip "%RELEASE_DIR%.zip" "%RELEASE_DIR%\*" :: 生成MD5校验文件 certutil -hashfile "%RELEASE_DIR%.zip" MD5 > "%RELEASE_DIR%.md5"4.3 构建通知机制
添加构建结果通知:
:: 构建成功时发送通知 curl -X POST -H 'Content-Type: application/json' \ -d '{"text":"构建成功: %VERSION_TAG%","channel":"#firmware"}' \ http://内部消息系统/webhook5. 常见问题排查指南
5.1 路径相关问题处理
当遇到路径错误时,检查:
- 所有路径引用使用绝对路径
- Jenkins工作目录与脚本预期一致
- 网络驱动器映射在服务模式下可用
5.2 权限问题解决方案
典型权限问题及处理:
| 问题现象 | 解决方案 |
|---|---|
| 无法创建文件 | 以管理员身份运行Jenkins服务 |
| Git操作失败 | 配置Jenkins用户的SSH密钥 |
| 打包工具报错 | 将工具目录加入系统PATH |
5.3 编译环境一致性保障
确保环境一致性的技巧:
- 在Jenkins节点上使用Docker容器
- 编写环境检查脚本:
:: 检查Keil版本 reg query "HKEY_CLASSES_ROOT\Applications\UV4.exe\shell\open\command" if %errorlevel% neq 0 ( echo Keil未正确安装 exit /b 1 )6. 进阶优化方向
6.1 构建缓存优化
通过增量编译提升速度:
:: 只重新编译修改过的文件 %UV_PATH% -j0 -c %PROJECT_PATH% -o %cd%\build\incr_log.txt6.2 多配置并行构建
利用Jenkins的矩阵项目支持不同编译选项:
:: 根据参数选择编译配置 if "%BUILD_TYPE%"=="DEBUG" ( set TARGET=Debug ) else ( set TARGET=Release ) %UV_PATH% -j0 -%TARGET% %PROJECT_PATH%6.3 自动化测试集成
在构建流程中加入静态检查:
:: 使用PC-lint进行代码分析 "C:\lint\lint-nt.exe" -i"C:\lint" %cd%\projects\firmware\firmware.lnt if %errorlevel% neq 0 ( echo 静态检查未通过 exit /b 1 )在实际项目中,我们发现最耗时的往往不是脚本编写,而是处理各种边缘情况。比如某次构建失败是因为Windows更新后临时目录权限变化,后来我们在所有脚本开头都添加了环境检查逻辑。另一个经验是:版本信息中除了提交哈希,最好加入构建序号,这样现场反馈问题时定位更快。
