热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go语言持续交付流水线

Go语言的依赖管理Go语言发展至今,其依赖管理机制一直被人诟病,从goget到godep,再到现在的VGo。随着Go模块化支持的引入,大家逐渐开始接受由Google主导的VGo作为

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。

Go 语言持续交付流水线

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

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

Go 语言持续交付流水线

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 的高可用性,另一个方面也是确保其变更的可追踪性。

Go 语言持续交付流水线

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

Go 语言持续交付流水线

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

Go 语言持续交付流水线

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

Go 语言持续交付流水线

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

Go 语言持续交付流水线

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

Go 语言持续交付流水线

总结

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

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


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文讨论了B360主板是否可以安装win7系统的问题。由于B360主板不支持win7系统且缺乏官方驱动的支持,安装win7系统可能存在兼容性和稳定性问题。然而,通过借助USB3.0转接卡,B360主板仍然可以安装win7系统,但USB接口无法使用。相比之下,B365主板可以直接支持win7系统,并提供了相应的驱动,具有更好的稳定性和兼容性。选择合适的主板对于安装win7系统至关重要。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了开关稳压器设计中PCB布局布线的重要性,并提供了相应的准则。开关稳压器作为一种高效的电源,逐渐取代了线性稳压器。开关模式电源的工作原理是通过一定的开启时间和关闭时间来实现电压转换。开关频率并不是影响系统的最大因素,而开关转换的速度才是关键。在系统噪声方面,开关频率或其谐波可能会对系统产生影响。严格遵守PCB布局布线的准则,可以将开关模式电源的相关问题降到最小。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • PatchODAX8: ... [详细]
author-avatar
chen-yu2502881617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有