gitlab仓库release版本生成与管理
gitlab仓库release版本生成与管理
〇、背景
RVIcamera 即将进入正式服, 现有版本号管理依赖于gitlab papline id, 目前每次构建都会造成版本号步进, 膨胀速度过快, 且生成的升级包太多, S3 存储成本过高. 为了方便正式服版本管理, 需要一套新的版本号管理方法. 另外要确定, 哪些包是需要长时间存储(S3)的, 哪些是暂存的.
一、发布机制
利用gitlab提供的release接口进行发布, 其实在最早创建CI的时候有测试过相关功能, 后来并没有实际启用.
启用release分支, 所有在develope或master生成的包, 都算作开发者包, 只有在release分支打tag并publish的才是正式包.
后续提测和发布可能需要两套版本号策略. 详见1.2
1.1 工作流程
- 提交代码
- 触发CI构建
- 使用pipline id 生成一个内部版本号
- 用内部版本号打包并制品
- 内部包作为alpha版提测
- 测试组打回或通过测试
- 通过测试则将develop分支合并进release分支, 并打tag.
- release制品上传S3
以上所有流程均自动完成
1.2 版本号管理
版本号分为内部版本号和发布版本号, 内部版本号即为pipline id, 每次合并都会造成版本号步进; 发布版本号为用户最终在设备信息列表中可见的版本号.
ex:
release version: 6.15.1.20
inside version: 1874
设备app.ver中需要记录inside version, 固件实际使用时需要考虑设备升级时对于版本号的判断.
注: 内部版本号机制是一个还在构思的方案, 主要目的是便于追踪版本和CI工作流的关系, 降低版本号膨胀速度. 并非必须使用. 如果我们能接收release版本号有跳跃, 那么可以直接在release版本号基础上步进
release版本号将从这个管理措施启用的一刻起, 步进第三位版本号,x.x.2.0, 并打tag v6.15.2.0; 后续CI出包会先读取服务器上现有的tag,然后+1作为版本号来步进.
1.3 升级包管理
以下列出CI pipeline触发的几种情况和处理方式
触发 | 处理 |
---|---|
日常开发分支推送 | 不会触发任何CI |
网页端手动触发 | 执行编译并生成包, 不上传S3 |
提交merage request | 执行编译检查, 不生成包 |
master分支产生更新 | 执行编译并生成包, 不上传S3,不打tag |
release分支产生更新 | 执行编译并生成包, 上传S3, 打tag |
开发分支产生的升级包, 以制品的形式在Gitlab仓库服务器中保存30天, 这个时间已足够提测\开发者自测的要求. release分支产生的包是将会发布给用户的包, 将会永久保存在S3服务器上. 所以后续要保证所有的推线上的包, 都是在S3上下载的.
注: 这里存在一个问题, 在master分支或develope分支进行提交后产生的包, 通过之后, 代码合并回release分支, 将会产生一个新的包. 那么这个包是否还需要测试? 需要和测试组沟通.
二、仓库及服务器管理
2.1 代码仓库相关
此管理方案启用后, 为避免旧的CI脚本继续推送包到S3, 现有开发分支全部CI脚本将全部认为失效(通过仓库设置来控制). 开发者需要重新rebase release分支.
develop\master\release分支需要设置保护, 禁止直接推送. 必须经过mr才允许合并.
关于多个产品公用同一个仓库的问题, 我个人倾向于不要这么做. 否则影响release时打包, 因为无法指定是为哪些产品做release. 最好fork出一个新仓库.
如果一定要用同一个仓库, 请在分支后加后缀, 如release_sigmastar\release_rvi等类似形式, 便于CI脚本判断.
2.2服务器相关
Gitlab仓库服务器需要注意存储空间, 目前RVI项目生成包较多. 可能造成存储压力过大.
S3服务器建议立即删除现有存储的所有RVI未release的升级包. 因为大部分包都是在gitlab服务器上有30天备份, 同时又没有发布给用户的, 没有长时间保留的必要.
Docker服务器请关注是否存在镜像未释放造成空间占用的问题, 如果正常则忽略.