Golang CI 配置

Automated code analysis/quality tool that helps developers ship better software, faster.

想写出好项目,肯定要在项目的初期就把架子搭好。所以我们的目标就是:如何在不花钱的前提下,给 Github Private 仓库的项目集成 CI, Code Review 等功能。

免费 APP

先去 Github Marketplace 中选购一番。

Dependabot

Every day, Dependabot checks your dependency files for outdated requirements and opens individual pull requests for any it finds. You review the PRs, merge them, and get to work on the latest, most secure releases.

监控项目的 go.mod, go.sum 中是否存在不安全的 package,并自动 PR 帮忙修正。Github 自己也在用的东西,免费当然要加上。

从 Github 的 Marketplace 找到这个服务,一路点下去,各种授权就行。选择要监控的项目和语言。我选择了 Go ModulesDocker

进入到 dependabot 的站点上可以进行一些更详细的设置,比如更改时间为每周检查一次。

添加徽章

细节可以看这个讨论。既可以装逼,又能直观的显示仓库目前的健康状态。

[![Dependabot](https://api.dependabot.com/badges/status?host=github&repo=<YourName>/<Repo>&identifier=<Number>)](https://app.dependabot.com/accounts/YourName/repos/<Number>)

注意上面例子中的 <XXX> 需要替换成你自己项目的,关于如何找到 Number,可以参考 How does one find out one’s own Repo ID?

CodeFactor

CodeFactor instantly performs Code Review with every GitHub Commit or PR.

它集成了 Yamllint, Hadolint, Vet, stylelint, Duplication checker 几项功能,并且免费版支持一个 Private 仓库。

安装方法和 Dependabot 一样,从 Github Marketplace 中一路点下去,最后去 codefactor 的网站进行一些设置。

添加徽章

进入 CodeFactor 网站,对应项目的右上角提供各种格式的徽章代码。

NewRelic

免费版的请求分析,数据事务,机器运行状况,错误报警等足够用了。

注册一个免费帐号,根据官网 Get Start 选 Go 一路走下去,拿到 LicenseKey。

安装 go get -u github.com/newrelic/go-agent,然后参考官方的例子添加如下代码:

// Middleware creates a Gin middleware that instruments requests by New Relic.
cfg := newrelic.NewConfig("Gin App", conf.NewRelicLicense)
// You can print log by: cfg.Logger = newrelic.NewDebugLogger(os.Stdout)
app, err := newrelic.NewApplication(cfg)
if err != nil {
  log.Printf("failed to make new_relic app: %v", err)
} else {
  router.Use(nrgin.Middleware(app))
}

第一次用 Go + Gin 安装 NewRelic 的探针,参考了一些文章:

CircleCI

基础配置

想找个免费好看的且跟 Golang 集成比较完美的 CI 不容易啊。在 Marketplace 中发现 CircleCI 的免费套餐支持一个 Private 仓库,每个月有 1000 分钟的时间。

一路点点点,之后在项目的根目录下新建 .circleci/config.yml 并根据 官方 Golang 例子 进行修改:

# Golang CircleCI 2.0 configuration file
version: 2
jobs:
  build:
    working_directory: /go/src/github.com/User/Repo

    docker:
      - image: circleci/golang:1.12
      - image: circleci/mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: test_db

    steps:
      - checkout

      - run:
          name: Wait for DB
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 1m

      - run: go get -v -t -d ./...

      - run:
          name: Unit test
          command: go test -v ./...

在配置 MySQL 时遇到了一些问题,在连接数据库时候报密码错误。

在开始之前,先复习了一下 Rails 的配置 CircleCIでmysql8を使用する設定

然后就是参考官方例子 MySQL 配置 Database Configuration Examples 结果并不能正常工作。我查看了下 CircleCI 可用的 MySQL 镜像 换了几个也不行。后来看到了 circleci-mysql-testing-database 这个例子中用的 MySQL 版本是 5.7,我也替换成同样的版本,就可以正常连上数据库了。顺便从这里学会了如何 import 测试数据库。

因为只有免费的 1000 分钟,为了节省时间,从 官方例子 学会了如何增加缓存。

CircleCI + dredd

不了解 dredd 的先看一下 Testing your API with Dredd,我是打算用 dredd 来代替 Rails 世界的集成测试,只测试 API 的返回值,这样能少写点测试代码。

dredd 需要 node 和 npm,本来是想用 npm install dredd -g 全局安装,先按照 Sample CircleCI Configuration with Prisma 的方案,手动安装 node 提示权限有问题。

后来找到 circleci-golang-node-image 这个镜像同时支持 golang 和 node,就是版本有点老。去 docker hub 上面找了个更新的 https://hub.docker.com/r/sebastianoo/circleci-golang-node 来用。

但全局安装仍然有问题,后来只能通过添加 package.json 的方案,不用全局安装的方式。

- run:
    name: npm install dredd
    command: npm install dredd@11.2.1

GolangCI-Lint

可以手动安装 Install script fails on CircleCI。但我没用这个方案,参考了下面这篇,直接 go get 安装的。

补充

  1. 参考 CircleCI2.0でGoをCIする 添加一些配置,可以测试 server 是否运行起来。
  2. 参考 Publishing a Go package to GitHub with CircleCI 2.0 区分多套环境。
- run:
    name: Validate service is working
    command: curl --retry 10 --retry-delay 1 --retry-connrefused http://localhost:8080/contacts/test

参考

  • https://shields.io/
  • https://www.codefactor.io/features
  • https://golangci.com/product
  • Awesome Go Linters

需要手动安装的 CI

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Aug 10, 2019

奉献爱心