打造Go开发流水线CICD

本文介绍了如何为Go项目建立一个完整的CI流水线,包括代码规范检查、静态代码分析、测试执行、代码覆盖率分析和最终的构建编译。通过遵循最佳实践,提高开发效率和代码质量。
摘要由CSDN通过智能技术生成

前言

作为一个敏捷开发者来说,当你充分理解完需求并完成了相应的模块设计拆分后,接下来最关键一步想必就是搞一搞基础设施,比如说gitlab代码仓库、harbor镜像仓库以及CI/CD等等,这些基础设施会成为提升后续项目质量以及开发效率坚实的护城河。那么,让我们先从打造一条Go项目开发的CI流水线开始吧。

CI流水线设计

简单设计了一个流水线结构图,共分为5个部分,详情如下:

Lint code

go install golang.org/x/tools/cmd/goimports@latest
gofiles=$(find ./ -name '*.go') && [ -z "$gofiles" ] \
        || unformatted=$(goimports -l $gofiles) && [ -z "$unformatted" ] \
        || (echo >&2 "Go files must be formatted with gofmt. Following files has problem: $unformatted" &&  true);
diff <(echo -n) <(gofmt -s -d .)
go install golang.org/x/lint/golint@latest
golint ./...

第一个部分是代码规范的检查,一份遵循代码的仓库,是可以降低维护成本和code review的,甚至会让你降低某些情况编码出错的可能,比如说C语言里,如果养成判断时常量再前的习惯,那么即使误写出 if (NULL = p),编译器也会帮我们检查出来,扩展到多人合作开发的大型项目,更是如此。

Golint会对代码做以下几个方面检查:

  1. package注释 必须按照 “Package xxx 开头”
  2. package命名 不能有大写字母、下划线等特殊字符
  3. struct、interface等注释 必须按照指定格式开头
  4. struct、interface等命名
  5. 变量注释、命名
  6. 函数注释、命名
  7. 各种语法规范校验等

具体规则详见:

Go Code Review Comments 译文(截止2018年7月27日) - 白细胞 - 博客园 (cnblogs.com)

Effective Go - The Go Programming Language (google.cn)

静态代码检查

export PATH=$PATH:$(go env GOPATH)/bin
go install github.com/gordonklaus/ineffassign@latest
ineffassign .
go vet ./...

第二个部分是静态代码检测,这里边使用的工具是ineffassign和go vet。ineffassign可以检测Go代码中的无效赋值。如果赋值的变量此后没有被使用,则赋值是无效的。vet 是 golang 中自带的静态分析工具,可以让我们检查出 package 或者源码文件中一些隐含的错误,主要包括:

asmdeclreport mismatches between assembly files and Go declarations
assigncheck for useless assignments
atomiccheck for common mistakes using the sync/atomic package
boolscheck for common mistakes involving boolean operators
buildtagcheck that +build tags are well-formed and correctly located
cgocalldetect some violations of the cgo pointer passing rules
compositescheck for unkeyed composite literals
copylockscheck for locks erroneously passed by value
httpresponsecheck for mistakes using HTTP responses
loopclosurecheck references to loop variables from within nested functions

具体可详见https://golang.org/cmd/vet/

跑测试用例

go test -race -count=1 -coverprofile=main.coverprofile

第三个部分是跑存量测试用例。测试用例不必多说,有了它,我们才能大胆的重构之前的代码,增加新的特性,因为只要你之前的用例跑过,就证明新的代码改动没有影响老的功能。可以说一份覆盖率很高的自动化测试用例,才是敏捷开发的基础。

代码覆盖率

go install github.com/masakurapa/gover-html@latest
go test -coverprofile=coverage.out ./...
gover-html
open coverage.html

第四个部分是代码覆盖率,它是一种通过计算测试过程中被执行的源代码占全部源代码的比例,进而间接度量软件质量的方法。代码覆盖率越高,这就意味着你的测试用例设计的越全面,那么后续出bug的可能性就越低。我之前的公司非常注重测试用例的编写,代码合入的门限要求代码覆盖率达到90%以上。当然,覆盖率也不是越高越好,毕竟我们是无法在代码覆盖率的帮助下,测试完新功能的所有可能值的,因此找个测试专家帮你做好测试设计才更加靠谱。

这里面用到的工具是gover-html,This is a tool for outputting Golang coverage in HTML format.

构建编译

go build -v .

最后一步就是编译出进程了,后续可以制作镜像并上传,或者直接部署到环境中运行等等,都是可以的。

至此,流水线打造完毕。

Reference

搭建基于 Docker 的 CI/CD_猫鱼薄荷_她的博客-CSDN博客_docker搭建cicd

Docker 搭建 Jenkins 实现自动部署-阿里云开发者社区 (aliyun.com)

golang race 竞态检测_i-neojos的博客-CSDN博客_golang race

Go test 详解 - 简书 (jianshu.com)

【Go】Golint代码规范检测_玄苦大师233的博客-CSDN博客_go all_caps camelcase

go vet 工具的使用 - 简书 (jianshu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于顾而言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值