Golang项目如何集成 circleci
转自 http://wjp2013.github.io/go/golangci
想写出好项目,肯定要在项目的初期就把架子搭好。所以我们的目标就是:如何在不花钱的前提下,给 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 Modules
和 Docker
。
进入到 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 的探针,参考了一些文章:
- Gin应用添加newrelic监控 - 过时了,不用看
- gin-gonic/examples - 社区的这个比较靠谱
- 官方例子 - 最终还是用的官方的例子
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 时遇到了一些问题,在连接数据库时候报密码错误。
然后就是参考官方例子 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 安装的。
补充
- 参考 CircleCI2.0でGoをCIする 添加一些配置,可以测试 server 是否运行起来。
- 参考 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
参考
CircleCIでmysql8を使用する設定
https://shields.io/
https://www.codefactor.io/features
https://golangci.com/product
Awesome Go Linters
需要手动安装 CI