GoLang CI/CD的5个最佳实践

对于使用历史悠久的语言(如Java、JavaScript或Python)编程的开发人员来说,构建持续集成和持续交付(CI/CD)工作流的最佳方法是使用Artifactory很熟悉。一套成熟的依赖关系管理系统容器解决方案,如Docker提供一个清晰的路线图。

但是,如果您正在用GoLang编程应用程序,那么以同样的效率实践CI/CD有多难呢?

事实证明,它变得容易多了,特别是随着Go语言的一些最新创新。与Artifactory对GoLang的原生支持在美国,通往高质量CI/CD的道路要清晰得多。

有了Go的最新创新,比如Artifactory的原生支持,通往高质量CI/CD的道路就更加清晰了。点击Tweet

最佳实践

在JFrog,我们是GoLang的忠实粉丝,在我们的几个旗舰解决方案中使用它作为语言。我们也在实践我们所提倡的,在CI/CD的核心使用Artifactory。以下是我们可以推荐的一些做法:

1.使用Go模块

与许多已建立的编程语言不同,GoLang的初始版本没有提供管理版本化依赖的通用机制。相反,Go团队鼓励其他人开发Go包版本控制的附加工具。

这种情况随着2018年8月Go 1.11的发布而改变去模块。现在,作为GoLang的本机依赖管理解决方案,Go模块是相关Go包的集合,它们作为一个单独的单元进行版本控制。这使得开发人员可以共享代码,而无需重复下载。

一个Go模块由go.mod文件位于项目的根目录中,该文件指定模块名称及其模块依赖项。模块依赖关系由模块名和表示版本号

如果你还没有采用Go模块,那么你需要遵循以下步骤:

  1. 使用mod init生成go.mod如果使用了以前的包管理器。
  2. 使用Go mod tidy整洁如果没有使用其他包管理器。该命令将生成一个填充的go。国防部文件。
  3. 如果版本是v2及以上,那么这就需要在模块名称更改时添加相应的后缀,更新到导入路径,使用模块感知的静态分析工具,最后更新代码生成器等文件.proto文件以反映新的导入路径。

例如,这是一个go.mod文件为公开可用用于结构化日志记录器的Go模块

模块github.com/sirupsen/logrus require (github.com/davecgh/go-spew v1.1.1 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.1 github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.1.1 // indirect github.com/stretchr/testify v1.2.2 golang.org/x/sys v0.0.0-20190422165155-953cdadca894)

请注意,版本号必须符合semver公约(例如,v1.2.1,而不是20190812或1.2.1),这是go命令所要求的。您应该避免使用上面所示的伪版本(v0.0.0- yyyymmddhhmss -abcdefabcdef)—尽管引入了提交哈希伪版本来为未标记的项目提供Go模块支持,但它们应该仅用作回退机制。如果您需要的依赖项有release标签,请在require语句中使用这些标签。

在你自己的代码中,你可以导入这个Go模块和其他依赖项:

import ("fmt" "io/ioutil" "net/http" "os" // Public Go Module用于日志"github.com/sirupsen/logrus")

然后你可以在你的GoLang代码中引用模块函数:

//向日志日志发送文本。Printf (" Hello日志!”)

2.使用GOPROXY来确保不可变性和可用性

一旦将GoLang依赖项维护为版本化模块,就可以通过设置GOPROXY将其保持为不可变实体。通过这种方式,您始终可以保证模块的特定版本包含的内容,因此构建始终是可重复的。

你会使用公开可用的开源包的Go模块吗?您创建并与OSS社区共享的?你只对你的团队保密的模块?这里有一些方法可以一次完成每个或全部,并确保那些未更改的版本模块始终可用于构建。

GOLANG。ORG

谷歌的Go团队为公开可用的模块维护一组GOPROXY服务。从Go 1.13开始,模块镜像proxy.golang.org在安装或更新Go时自动设置为默认的GOPROXY。该服务还得到用于发现新模块的索引服务的支持(index.golang.org),以及全球性的发展。用于验证模块内容的Sum数据库(sum.golang.org).

go.dev网站也由Go团队维护,是Go用户的中心,提供来自整个Go生态系统的集中和策划资源。2022世界杯阿根廷预选赛赛程在这个站点中,您可以进行探索pkg.go.dev通过友好的UI在数千个开源Go包中进行搜索。

人工Go注册表

虽然共享是件好事,但您可能还需要将您创建的一些Go模块的使用限制在组织内部。使用Artifactory,您可以设置本地和远程去注册,使公共和私有模块对您的构建同样可用。

您可以将Go镜像服务代理为Artifactory中的远程Go注册表,为构建系统提供本地缓存,从而进一步加快构建速度并帮助防止网络连接中断。设置一个很容易。

人工智能注册中心

您还可以为需要在组织内部私下维护的模块配置一个或多个本地Go注册表。

将本地和远程注册中心组合成虚拟存储库,您的构建可以从公共源和您创建和维护的私有模块中解析Go模块依赖关系。

您可以通过本文了解更多关于如何为Artifactory存储库配置GOPROXY的信息为Go模块选择GOPROXY

3.使用人工存储库布局

在构建应用程序时(使用去建立),生成的二进制工件将存储在哪里?您的构建过程可以将这些中间结果推送到像Artifactory这样的二进制存储库管理器中的存储库。

对于这些中间的Go构件,您将使用Artifactory的通用存储库。以一种聪明的方式构建这些存储库可以帮助您控制开发、测试和生产过程中的二进制文件流,并为每个阶段使用单独的存储库。为了帮助您做到这一点,请使用自定义存储库布局使用这些通用存储库的Artifactory的t特性。

创建一个自定义布局,如下所示:

[机构]/[名称< + >]。/(模块)-[拱< + >]。[baseRev]。[ext]

当你配置自定义布局,您应该测试工件路径解析,以确认Artifactory将如何使用布局定义从路径构建模块信息。

4.一次建设,促进发展

在为Go构建正确设置了存储库之后,您就可以开始在管道阶段高效地移动它们了。

许多软件开发过程需要在开发、测试和生产的每个阶段转换中进行全新的完整或部分构建。但是,随着开发人员不断更改共享代码,每次新的构建都会引入新的不确定性;你不能确定里面有什么。即使有了确保确定性构建的保障措施,可能仍然需要在每个阶段重复相同的质量检查。

相反,应该先构建基于go的微服务,然后在满足测试或扫描等推广标准后将其推广到下一阶段。如果你打算将Go微服务容器化,同样的原则也适用:构建每个Docker映像一次,然后通过一系列存储库来提升它。通过这种方式,您可以保证所测试的正是将要发布到生产环境中的内容。

建立促销

5.避免整体管道

与其为你的应用设置一个单一的整体管道,不如设置多个管道,每个管道分别构建、测试、扫描和推广不同的层面。这有助于使您的CI/CD过程更加灵活,由不同的团队负责每一层,并培养一个“快速失败”系统,帮助及早发现错误。

例如,部署一个容器化的应用程序通常可以由五个管道组成:

  1. 使用JFrog CLI构建Go应用程序。这个管道提取源代码;使用依赖项和输出二进制文件的人工存储库构建应用程序;在Artifactory中从开发仓库测试和升级到登台仓库。
  2. 构建容器化应用的基础层,例如Docker框架。根据公司的风险和升级策略,可以使用静态或动态标签。例如,如果一个动态标签,如高山:3.10作为Docker框架的基础层,那么每次构建Docker框架时都会包含所有的补丁更新。该管道将包括构建、测试和推广阶段。
  3. 拉出由先前管道生成的已提升工件,并构建一个容器化的应用程序,这也将有构建、测试、扫描和推广阶段。
  4. 创建Helm图这指向由先前管道生成的容器化应用程序的静态标记和提升版本。
  5. 使用Helm图表将容器化的Go应用程序部署到Kubernetes。

Artifactory充当Go构建的“真实来源”,为公共和私有模块提供GOPROXY,以及存储编译后的二进制文件。使用JFrog CLI来构建Go应用程序有助于构建过程与Artifactory交互,并捕获构建信息,使您的构建完全可跟踪。下面是一个示例片段:

//配置Artifactory jfrog rt c //配置项目的存储库jfrog rt go-config //使用go构建项目并从Artifactory解决项目依赖关系。jfrog rt go build——build-name=my-build——build-number=1 //将我们构建的包发布到Artifactoryjfrog rt gp go v1.0.0——build-name=my-build——build-number=1 //收集环境变量并将它们添加到构建信息中。jfrog rt bce my-build 1 //发布构建信息到Artifactory。Jfrog rt - my-build 1

要了解更多,请查看我们的GoLang CI/CD的示例演示文件我们将在GopherCon上使用。

大胆地去

正如您所看到的,管理您的GoLang应用程序的一些简单的最佳实践可以简化实现有效CI/CD的方式。而Artifactory,作为您的软件工件供应链的基本管理者,可以在帮助将这些方法引入您的软件开发管道中发挥核心作用。

有什么问题吗?我们很乐意在Gophercon上回答这些问题;与我们一起探索快速发布Go应用程序的所有最佳方法,并达到最高质量。或者你可以试着把它们付诸实践Artifactory免费试用