先说说我们最终确定的工具选型。版本控制毫无疑问是GitLab,自建服务器放在内网,既安全又能做代码审计。CI/CD核心用的是Jenkins,虽然现在很多云原生方案很火,但考虑到团队现有技术栈和插件生态,还是选择了这个老牌工具。镜像仓库用Harbor,监控用Prometheus+Grafana组合,容器编排当然是Kubernetes。这里要提个坑:刚开始尝试用GitLab自带的CI,发现复杂流水线配置起来反而更费劲,又退回Jenkins了。
具体搭建过程分这几个阶段实施。首先是代码管理阶段,我们在GitLab设置了保护分支,main分支必须通过MR才能合并,并且需要至少两个代码审查。还在pre-commit钩子里配置了ESLint和SpotBugs检查,这一步就拦下了不少低级错误。
Jenkins流水线设计成了多阶段模式。触发条件设置为main分支有推送时自动启动,但也会手动保留触发入口。编译阶段最头疼的是依赖缓存问题,后来通过挂载NFS共享目录解决了重复下载依赖导致的构建缓慢。单元测试阶段要求覆盖率必须达到80%以上,否则自动失败,这个阈值是团队吵了三天才定下来的。
Docker镜像构建有个值得分享的细节:最初我们用latest标签,结果线上出问题时回滚特别麻烦。后来改成用Git提交哈希作为标签,再配合生产环境用的stable标签,稳定性大大提升。Harbor仓库设置了自动扫描漏洞策略,检测到高危漏洞会自动阻断部署。
Kubernetes部署环节采用了蓝绿部署方案。通过修改service的selector来切换流量,预留了五分钟观察期,确认无误后才删除旧版本Pod。这期间如果监测到错误率飙升,30秒内就能切回上个版本。
监控方面我们在关键节点埋了数据采集点。Prometheus收集的指标通过Grafana展示在大屏上,当响应时间P95超过800毫秒就会自动告警。有次大促期间就是靠这个及时发现了数据库连接池瓶颈。
过程中遇到的坑真不少。有次Jenkins凭据泄露差点导致生产数据库被清空,后来严格限制了凭据权限。还有次因为YAML文件缩进错误导致整个集群服务中断,现在团队都养成了用yamllint验证配置的习惯。
这套流程跑顺之后效果立竿见影。原本需要两小时的发布过程现在缩短到20分钟,生产环境故障数下降了60%。最重要的是团队形成了标准化意识,新成员入职一周就能独立完成功能上线。不过现在还有优化空间,比如正在试验的Tekton能否替代Jenkins,还有如何降低K8s集群的资源消耗。
工具链建设最深的体会是:没有最好的方案,只有最适合团队的方案。关键是要建立反馈机制,我们每周五都会复盘当周的流水线运行数据,持续调整优化。下一步打算把安全扫描左移到开发阶段,毕竟等问题到生产环境就太晚了。