Golang Gitlab CI 的二、三事

背景

随着项目逐渐庞大,需求日益增长,我们开始考虑引入 CI ,帮助我们进行 代码的 review 以及 测试。

目的

  1. 实现 自动化的 lint
  2. 实现 自动化的 测试
  3. 只测试 DEV,并且只在 MR 时 测试,在我们的设定里面,代码只能合并到 DEV 再由 dev 分发到 各自 分支

测试的目标

  1. 阅后即焚(测试完成以后不会对环境产生影响,测试数据被清理,可以重复使用相同的数据测试)(通过 docker 实现)

Lint 的目标

  1. 可以显式的知道,哪个位置的 代码 触发了 lint(reviewdog)

CI 配置

gitlab CI 配置

before_script:
  - pwd
  - export COVERAGE=true
  # 这个配置可以让 私仓 代码可以正常 checkout
  - git config --global url."http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.gitlab.com/".insteadOf http://gitlab.gitlab.com/
	# go 环境配置
	- go env -w GO111MODULE=on
  - go env -w GOPROXY="https://goproxy.cn,direct"
  - go env -w GOPRIVATE="*.gitlab.com"
  - go env -w GOINSECURE="*.gitlab.com"

stages:
  - test
  - lint
  - build

# 测试
go_test:
  tags:
    - test
  # 只在 MR 进行
  only:
    - merge_requests
  # dev 以外的合并 不执行
  except:
    variables:
      - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "dev"
  stage: test
  image: golang:latest
  # 定义 所需的 集成服务 在此处作为样例的是 ETCD 服务
  services:
    - name: bitnami/etcd:latest # 镜像名
      alias: etcd # 别名用于在 测试代码中连接服务 例如 Dial("etcd:2379")
  # 定义集成服务的 整体 环境变量
  variables:
    ALLOW_NONE_AUTHENTICATION: "yes" # 这个变量用于 ETCD 让其初始化时无需密码也能登录
  script:
    - go test -p 1 -race -v -timeout 30m ./... -v  | grep -v 'no test files'

# 语法检查 
go_lint:
  tags:
    - lint
  only:
    - merge_requests
  except:
    variables:
      - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "dev"
  stage: lint
  image: ccheers/reviewdog:latest
  script:
    - export GITLAB_API="http://gitlab.gitlab.com/api/v4"
    - export REVIEWDOG_INSECURE_SKIP_VERIFY=true
#    - golangci-lint run --out-format=line-number --timeout=5m ./...
    - reviewdog -reporter=gitlab-mr-discussion
  allow_failure: true

# 构建检查
go_build:
  tags:
    - build
  only:
    - merge_requests
  except:
    variables:
      - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "dev"
  stage: build
  image: golang:latest
  script:
    - go build -race ./...

reviewdog 配置

? Automated code review tool integrated with any code analysis tools regardless of programming language

.reviewdog.yml

runner:
  golangci:
    cmd: golangci-lint run --out-format=line-number --timeout=20m ./...
    errorformat:
      - '%E%f:%l:%c: %m'
      - '%E%f:%l: %m'
      - '%C%.%#'
      - "%f:%l:%c: %m"
    level: warning

gitlab 配置(project > setting > CI/CD > Variables)

key: REVIEWDOG_GITLAB_API_TOKEN

Value: User Settings > Access Token

(配置CI环境变量)

image-20220817182438189

(获取 API token)

image-20220817182324800

golang-ci lint 配置

issues:
	# 排除的一些 lint 
	# 也可以在 go代码 上加注解 
	# eg://nolint:unused
	# 表示 此行 跳过 unused lint 检查
  exclude-rules:
    - linters:
        - staticcheck
      text: "SA5001|SA6002"
    - linters:
        - errcheck
      text: "defer"
      
linters:
  disable-all: true
  enable:
    - deadcode
    - errcheck
    - gosimple
    - govet
    - ineffassign
    - staticcheck
    - structcheck
    - typecheck
    - unused
    - varcheck
    - bodyclose
    - misspell
    - structcheck
    - typecheck
    - varcheck
    - gofmt
    - goimports
    - unconvert
    - exportloopref

linters-settings:
  govet:
    check-shadowing: true
    check-unreachable: true
    check-rangeloops: true
    check-copylocks: true



好好学习,天天向上