背景目标
当前项目的后台Go微服务日常没有使用静态代码扫描工具,故调研了相关的静态代码扫描工具和接入CI持续集成的方案。最终决定采用Golangci-lint接入Gitlab CI流水线并支持增量代码扫描,在Pre-merge any branch 时触发扫描并强制MR门禁
Golangci-lint 配置
- 在具体微服务项目的根目录下增加 .golangci.yaml文件,并配置对应的扫描规则或规则集,通过issues-->new-from-rev配置只是扫描最近5次提交来实现增量扫描
linters:
disable-all: true
presets:
- bugs
- complexity
- performance
issues:
new-from-rev: HEAD~5
- 配置makefile的lint扫描命令
lint: clean
golangci-lint run --timeout 10m ./...
- 执行make lint,可以看到运行成功
Gitlab CI配置
- Gilab CI运行需要runner运行环境+流水线配置。其中runner公司内支持共享的runner,流水线配置则根据项目需要来定,在代码根目录下增加.gitlab-ci.yaml文件,并且该项目需要上传vendor目录到库里
image:
name: "harbor.xx.com/xx/ci:v1"
before_script:
- ls
- go version
- export env="dev"
stages:
- lint
golangci-lint:
stage: lint
script:
- make lint
only:
- merge_requests
- 配置文件需要拉取带go环境的镜像,并配置在merge any branch时触发流水线运行
MR门禁
- 设置merge时,必须保证mr的pipeline通过(门禁)。
在项目的页面的settings中的general中的mergerequests标签下,在mergechecks中勾选,必须pipeline成功,这样在点击merge的时候,pipeline必须成功才能够顺利的merge进去。