说白了,Git在云原生时代早就不只是代码版本管理那么简单了。先说最核心的GitOps吧,这玩意儿现在真是火得不行。我们团队去年开始把应用声明和配置都扔进Git仓库,k8s集群里的ArgoCD就自动同步。有次线上配置出问题,直接git revert上个提交,五分钟就搞定了,要搁以前手动改yaml文件,估计得折腾半小时。不过这里有个坑得提醒各位,记得把.gitignore配置好,那些敏感文件可千万别手滑推进去了,别问我怎么知道的。
分支策略这块我们也踩过不少雷。现在固定用三套环境对应三条主线:develop对应开发环境,release对应预发,master对应生产。特性分支统统从develop切,测试完就合并回develop。关键是要在CI流程里加钩子,确保往release和master合并必须走Pull Request,而且至少得两个人审过代码。上周就靠这个机制拦下了一个有问题的Helm Chart更新。
镜像标签跟Git提交关联这个事儿,建议各位早点搞起来。我们现在是每次往develop合并就自动打上{git-short-sha}的标签,release分支打语义化版本号。这样出问题的时候,只要看一眼Pod描述里的镜像标签,立马就能定位到对应的Git提交,查起问题来特别顺手。
说到配置管理,有个骚操作值得分享。我们把不同环境的kustomize配置放在同一个仓库的不同目录,通过CI流程里的环境变量决定用哪套配置。这样既保证了配置版本和代码版本同步,又避免了配置漂移。不过记得要给生产环境的配置目录设置保护规则,别让随便什么人都能直接改。
存储库结构这块建议按项目分组,每个微服务独立仓库。我们之前把十几个服务塞一个monorepo里,结果CI跑一次要二十多分钟,现在拆开后平均三分钟就能完事。大文件用Git LFS管理,特别是那些Helm Chart的tar包,不然仓库体积涨得太吓人。
hook这玩意儿真是大有用处。我们在pre-receive阶段做代码规范检查,post-receive触发CI流水线。最实用的是在服务器端加了个hook,禁止任何人直接push到master分支,从此再也没出现过绕过代码审查的情况。
备份方案也得未雨绸缪。除了主仓库,我们在另外两个云厂商那儿都设了镜像仓,每小时自动同步一次。有次主仓库所在区域网络故障,我们直接切换镜像仓地址,开发工作基本没受影响。
其实玩转Git云原生的关键就十二个字:流程标准化、自动化全覆盖、变更可追溯。现在我们都养成肌肉记忆了,任何对环境的改动必须通过Git提交来触发。虽然前期搭建费点劲,但后面真的省心太多。最近正在琢磨把安全扫描也集成到Git流程里,争取在代码提交阶段就把漏洞揪出来。
对了,最后给各位提个醒,记得定期清理废弃分支和缓存。上周我们有个项目构建突然失败,查了半天发现是Git仓库体积太大把磁盘撑爆了。现在每月定时跑清理脚本,算是吃了亏长记性。