打造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)

相关推荐
PieroPc5 分钟前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439693 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna3 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
向前看-3 小时前
验证码机制
前端·后端
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
高山我梦口香糖5 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
信号处理学渣5 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++