掘金 后端 ( ) • 2024-03-20 12:11

前言

作为一个敏捷开发者来说,当你充分理解完需求并完成了相应的模块设计拆分后,接下来最关键一步想必就是搞一搞基础设施,比如说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 或者源码文件中一些隐含的错误,主要包括:

asmdecl report mismatches between assembly files and Go declarations assign check for useless assignments atomic check for common mistakes using the sync/atomic package bools check for common mistakes involving boolean operators buildtag check that +build tags are well-formed and correctly located cgocall detect some violations of the cgo pointer passing rules composites check for unkeyed composite literals copylocks check for locks erroneously passed by value httpresponse check for mistakes using HTTP responses loopclosure check 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)