关于软件发行版本与代码管理
1. 今天看到一个问题,问如何保证软件发行版本与开发人员代码一至性的问题。
1.1 我觉得需要从两个方面入手:
- 软件的编译发行需要制度化管理,最好专人负责并配置专用编译环境。
- 也是我准备重点说明的,把软件代码版本编译到发行版本中,供查证需要。
1.2 version.h
在编译软件时,我会通过调用一个脚本获取git的代码提交信息,生成version.h文件,这其中就是当前编译的代码的版本信息和当前编译时间。
在你需要确认当前发行版本所对应的代码版本时,就可以查看此信息进行比对。
1.3 build_ver.sh
- 获取代码提交信息
git rev-list HEAD | sort > config.git-hash
- 版本计数可以按git的提交次数来生成
git rev-list origin/master | sort | join config.git-hash - | wc -l | awk '{print $1}'
- 如果当前代码设置git tag,则直接取当前最新tag做为版本信息
git describe --always --tags \`git rev-parse HEAD\` | awk -F "-1-" '{print $1}'
- 对于当前编译代码中存在未提交代码也要做判断
if LANG=en_GB git status | grep -q "modified:" ; then MOD="M" fi
1.4 样例
//! @wfeii@163.com
//!
#ifndef __WII_SVC_LOADER_VERSION_H__
#define __WII_SVC_LOADER_VERSION_H__
#define VER_MAJOR "2" /* 自定义的主版本号 */
#define VER_MINOR "0"
#define VER_MICRO "34" /* 根据commit次数年计算的子版本号 */
#define BUILD_VERSION "master - r2.0.34M 5452a9b" /* master是代码分支 r2.0.34是版本号 M代表有未提交代码 5452a9b是commit的id值前7位 */
#define BUILD_TIME "2021-03-22#12:11:43" /* 编译时间 */
#endif //! __WII_SVC_LOADER_VERSION_H__
$ ./release/sapiloader -V
2.0.34
$ ./release/sapiloader -vV
sapiloader(13979) -- master - r2.0.34M 5452a9b -- 2021-03-22#12:11:43
1.5 调用
这个脚本的调用最好加到Makefile中,或CMakeLists.txt中,加在Makefile中是最保险的。