背景目标

当前项目的后台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进去。

资料参考