打造Go开发流水线CICD

前言

作为一个敏捷开发者来说,当你充分理解完需求并完成了相应的模块设计拆分后,接下来最关键一步想必就是搞一搞基础设施,比如说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)

相关推荐
听情歌落俗18 小时前
MATLAB3-1变量-台大郭彦甫
开发语言·笔记·算法·matlab·矩阵
用户490558160812518 小时前
lvs会话同步
后端
用户490558160812518 小时前
linux内核网络协议栈报文的处理过程
后端
夜宵饽饽18 小时前
上下文工程实践 - 工具管理(上篇)
javascript·后端
ERP老兵_冷溪虎山18 小时前
Python/JS/Go/Java同步学习(第十三篇)四语言“字符串转码解码“对照表: 财务“小南“纸式转码术处理凭证乱码崩溃(附源码/截图/参数表/避坑指南)
java·后端·python
努力的小郑18 小时前
MySQL索引(四):深入剖析索引失效的原因与优化方案
后端·mysql·性能优化
智商偏低18 小时前
ASP.NET Core 中的简单授权
后端·asp.net
练习时长一年18 小时前
搭建langchain4j+SpringBoot的Ai项目
java·spring boot·后端
bobz96518 小时前
Proxmox qemu-server
后端
zhangfeng113318 小时前
在 R 语言里,`$` 只有一个作用 按名字提取“列表型”对象里的单个元素 对象 $ 名字
开发语言·windows·r语言