前言
作为一个敏捷开发者来说,当你充分理解完需求并完成了相应的模块设计拆分后,接下来最关键一步想必就是搞一搞基础设施,比如说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会对代码做以下几个方面检查:
- package注释 必须按照 "Package xxx 开头"
- package命名 不能有大写字母、下划线等特殊字符
- struct、interface等注释 必须按照指定格式开头
- struct、interface等命名
- 变量注释、命名
- 函数注释、命名
- 各种语法规范校验等
具体规则详见:
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