Go 语言持续交付流水线

Go 语言的依赖管理

Go 语言发展至今,其依赖管理机制一直被人诟病,从 go get 到 go dep,再到现在的 VGo。随着 Go 模块化支持的引入,大家逐渐开始接受由 Google 主导的 VGo 作为其官方依赖管理工具。VGo 顾名思义,Version of Go,就是为解决 Go 的版本化问题。

VGo 是一种语义化(Semantic)的依赖描述方式,在.mod文件中描述模块及其依赖。mod 文件顾名思义就是模块(module)的意思,在 GO 1.11 及以上版本需要通过功能开关GO111MODULE=on 来打开,也就是说默认还是兼容的传统模式,并没有强制用户切换,但后续可能会变成默认打开。

VGo 虽然目前还算不上成熟,但 VGo 已经兼容了原生Go的很多命令,比如 install/build/run 等等,这里值得一提的是原来的tool相关命令也一并兼容了过来,对于原来经常使用 format/vet 等工具来做基础检查的开发者来说,确实还是很贴心友好的。

VGo 的安装很简单,执行 go get -u golang.org/x/vgo ,然后编译其成二进制,export 到环境变量即可。通过 vgo -h 即可查看所支持的命令,我们可以通过一个示例来感受下 VGo 的使用,该示例的链接:https://research.swtch.com/vgo-tour ,这里不再赘述。

Go 语言制品仓库

Go 语言开发通常也是在开源框架或组件的基础上进行的,因此也需要一个Go制品库来为开发团队提供统一的依赖源及构建产出管理。对于开发团队而言,某个开发者的依赖可能来自于外部,也可能来自于内部其他团队,因此制品库还需要能屏蔽这种后端依赖源的易变性,为开发者提供统一不变的 Endpoint。

在这里插入图片描述

目前 JFrog Artifactory 产品提供了Go语言制品仓库的支持,能够满足上述对于依赖解析、制品存储及多团队协同的需求。本文后续的 CI&CD Pipeline 就将采用 Artifactory Go 仓库,站在交付过程的角度看,制品仓库还需要管理持续集成过程,例如构建任务及其历史,制品的元数据(生命周期关键事件及其结果),制品的构建依赖、环境参数等,为线上问题的快速排查提供基础数据保障。

因此,Artifactory 制品仓库不仅仅是只有解析依赖和存储制品这两个基础能力,还需要为实际上线发布提供过程跟踪保障,例如持续集成差异的快速对比。

在这里插入图片描述

Go CI&CD with Jenkins Pipeline

JFrog Artifactory 提供了 CLI 工具,此工具支持 Go 语言单元测试、构建、打包、上传及升级(Promotion)、元数据管理以及质量关卡等 CI&CD Pipeline 全生命周期的标准操作。相对于API 操作更加简单,而且不必暴露认证信息在 Jenkins Pipeline 中,安全性更好。关于Go语言制品仓库的介绍 ,请点击:https://www.jfrog.com/confluence/display/RTF/Go+Registry

一个完整的 Go Jenkins CI&CD Pipeline 应包含的任务如上所述,在 Jenkins Job 定义时采用 GitLab 托管 Jenkinsfile 的方式,一方面保证 Jenkins Job 的高可用性,另一个方面也是确保其变更的可追踪性。

在这里插入图片描述

Jenkins Pipeline 托管在 GitLab 后,任何对 Jenkins Job 的定义的变更都需要通过 Git Commit/ Pull Request / Merge 等步骤来进行,当代码被Merge之后跑一次 CI&CD 的过程以检验 Jenkins Pipeline 定义的变更是否符合预期设计。如果将 CI&CD 的流程当做基础设施看待,那么这也是一种基础设施即代码思想的落地实践。

在这里插入图片描述

Jenkins Pipeline 运行后,Artifactory 会记录整个CI&CD过程中的构建产出物及其相关的元数据信息,将二者绑定在接下来的部署提供数据决策支撑。

在这里插入图片描述

在记录元数据的同时,还会记录整个过程,将发布模块、依赖、环境参数等一并记录下来,提供反向依赖解析、发布详情对比等支持,帮助快速定位、分析问题。

在这里插入图片描述

除了支持正向依赖的查看之外,还可以快速反向排查某个依赖组件被其他那些模块所依赖,在那些构建任务的哪一次所引用等详细情况。对于老版本组件升级、微服务拆分都是非常有帮助的功能特性,可以快速节省排查时间且提升准确度。

在这里插入图片描述

最后的部署动作,我们采用质量关卡对即将部署的组件进行筛选,确保其满足上线部署(通常默认是测试环境)条件,如果满足则直接部署,否则发送邮件或者直接阻断流程。

在这里插入图片描述

总结

Go 语言基于 Jenkins Pipeline 的持续交付不仅仅只是自动化测试、构建和发布,而且还包含了元数据收集、发布Promotion及质量关卡等运用,在保证了效率的同时能够做到灵活的质量管控。于此同时,Artifactory 还考虑到了构建过程的管理,提供了底层依赖变化带来的影响范围分析能力,两次发布参数(依赖、环境信息等)的快速对比能力等等,大幅度降低了上线发布时问题排查的时间成本。

作者:
付 辉 JFrog 中国解决方案架构师,主要关注CI&CD,容器技术及微服务。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页