本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
一、背景介绍
近期公司研发侧提出,需要在 Golang 代码项目发起合并请求时,自动对代码语法等内容进行质量检查,用于替代人工检查、提升工作效率。经过调研和验证,笔者最终通过 gitlab-runner + golangci-lint 的方式实现了该需求。
本文将详细介绍 GitLab 实现 Golang 代码质量检查的相关过程,GitLab 服务相关信息如下:
-
版本信息:GitLab CE 17.4.2
-
部署组件:GitLab、PostgreSQL、Redis
-
部署方式:Kubernetes 环境下,部署为 StatefulSet 对象(后续找时间出部署教程)
-
镜像名称:sameersbn/gitlab:17.4.2
二、过程介绍
1、gitlab-runner 部分
1)新建实例 runner
-
使用管理员账号登录 GitLab 服务控制台,进入 Admin area 界面后依次点击:「CI/CD」->「Runner」->「创建实例 runner」

-
填写好相关信息后,点击「创建 runner」

-
记录下身份验证令牌后,直接返回即可


2)部署 gitlab-runner 并注册
由于当前部署的 GitLab 服务的版本高于 15.6,gitlab-runner 只能采用 Helm Chart 方式部署。
https://docs.gitlab.com/runner/install/kubernetes.html
-
下载 Helm Chart 文件(以 17.4.2 版本为例),命令如
helm repo add gitlab https://charts.gitlab.io --force-update
helm search repo -l gitlab/gitlab-runner | grep 17.4.2
helm pull gitlab/gitlab-runner --version 0.69.2 --untar
-
创建部署配置(在此配置注册信息),命令如下:
cat > values-config.yaml <<EOF
image:
registry: docker.io
image: gitlab/gitlab-runner
tag: alpine-v17.4.2
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
terminationGracePeriodSeconds: 30
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
gitlabUrl: https://gitlab.demo.com/ # GitLab 服务地址
runnerRegistrationToken: "glrt-xxxx" # 之前记录的身份验证令牌
runnerToken: "glrt-xxxx" # 之前记录的身份验证令牌
rbac:
create: true
generatedServiceAccountName: "gitlab-ci-runner"
serviceAccount:
create: true
name: "gitlab-ci-runner"
metrics:
enabled: true
securityContext:
allowPrivilegeEscalation: true
privileged: true
EOF
-
执行部署命令如下,等待部署完成后,实例 runner 状态将从「未连接过」变为「在线」
helm upgrade -i -f values-config.yaml gitlab-ci-runner ./gitlab-runner
# ⚠️ 若修改后再次执行,可能导致 gitlab-runner 实例被删除!
2、golangci-lint 部分
1)配置 GitLab 流水线
# 在 GitLab 项目目录下执行
cat > .gitlab-ci.yml <<EOF
lint:
image: golangci/golangci-lint:v1.62.2 # 直接使用官方镜像
script:
- export GOPROXY=https://goproxy.cn,direct
- golangci-lint run -v
only:
- merge_requests # 仅在代码合并时触发流水线
EOF
2)配置质量检查规范(非必需,以下为推荐规范)
# 在 GitLab 项目目录下执行
cat > .golangci.yml <<EOF
run:
timeout: "10m"
linters: # 配置开启或关闭的检查类型
disable-all: true # 禁用全部,通过 enable 精准控制开启的类型
enable:
# basic
- errcheck
- gosimple
- govet
- ineffassign
- staticcheck
- unused
# style
- dupl
- goconst
- gofmt
- goimports
- misspell
- stylecheck
- wsl
# complexity
- funlen
- gocyclo
- lll
# security
- gosec
linters-settings: # 针对linters中的具体检查类型配置该类型的参数
funlen:
lines: 80 # Checks the number of lines in a function
statements: 40 # Checks the number of statements in a function
ignore-comments: true # Ignore comments when counting lines
lines-in-file: 800
gocyclo:
min-complexity: 15 # # Minimal code complexity to report,default 30 recommend 10-20
lll:
line-length: 120 # # Max line length, lines longer will be reported,default 120
dupl:
threshold: 100 # # Tokens count to trigger issue,default 150
output:
format: colored-line-number
print-issued-lines: true
print-config: true
EOF
----------------------------------------------------------
🔔 若未单独配置检查规范,默认开启的检查类型如下:
deadcode errcheck gosimple govet ineffassign staticcheck structcheck typecheck unused varcheck
3、最终效果验证
-
为某个 Golang 代码项目提交 cr-test 分支到 cr-master 分支的合并请求,GitLab 服务将自动触发代码质量检查的流水线,合并请求详情如下图:

-
点击流水线 #826 可以跳转查看代码质量检查过程详情,如下图:

-
最终可以看到合并请求流水线的状态变为「已失败」,审批人可以根据代码质量检查结果决策是否继续执行合并操作

GitLab实现Golang代码质量检查
1168

被折叠的 条评论
为什么被折叠?



