前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打造Go开发流水线CICD

打造Go开发流水线CICD

原创
作者头像
于顾而言SASE
发布2024-03-21 10:33:29
910
发布2024-03-21 10:33:29
举报
文章被收录于专栏:golang与云原生golang与云原生

前言

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

CI流水线设计

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

Lint code

代码语言:javascript
复制
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)

静态代码检查

代码语言:javascript
复制
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/

跑测试用例

代码语言:javascript
复制
go test -race -count=1 -coverprofile=main.coverprofile

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

代码覆盖率

代码语言:javascript
复制
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.

构建编译

代码语言:javascript
复制
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)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • CI流水线设计
    • Lint code
      • 静态代码检查
        • 跑测试用例
          • 代码覆盖率
            • 构建编译
            • Reference
            相关产品与服务
            项目管理
            CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档