用 Github Actions 幫你的 Go Repository 加上 Codecov
Codecov (opens new window) 是一個服務可以幫你把 coverage report 加到 Github 上面,這篇將利用 Github Actions (opens new window) 來對每個 Pull Request 都加上 Codecov 的比較結果。
在寫 go 的時候可以利用 go test
來看 coverage 也可以產生一個 report 檔案:
go test -short -coverprofile coverage.txt -covermode=atomic $(PKG_LIST)
我們可以把這個 coverage.txt
傳到 Codecov 上面,如此一來我們就可以比較每一個 Pull Request 是增加還是減少現在的 unittest 的 coverage 。
# Github Actions
Codecov 有提供 Github Action (opens new window) 讓我們可以很簡單的利用 Github Action 上傳 coverage report (./coverage.txt
):
- name: Upload Coverage report to CodeCov
uses: codecov/codecov-action@v1.0.0
with:
token: ${{secrets.CODECOV_TOKEN}}
file: ./coverage.txt
fail_ci_if_error: true
更多詳細設定可以看 https://github.com/codecov/codecov-action#arguments (opens new window)
要注意的是,這邊的 secrets.CODECOV_TOKEN
必須先去 codecov 的設定頁面找到你 repository 的 token:
然後到 Github 你的 repository 的 Settings > Secrets 中去新增一個 CODECOV_TOKEN
的 secret:
# Pull Request
對每一個 Pull Request 我想知道這一個修改影響了現有的 unittest coverage 多少,所以我在 workflow 設定針對每一個 Pull Request 都去上傳 coverage report:
on:
pull_request:
branches:
develop
接著在 jobs 的部分也很簡單,只要先想辦法產生 coverage report 就可以了:
steps:
- name: Set up Go
uses: actions/setup-go@v1
with:
go-version: 1.13
- name: Check out code
uses: actions/checkout@v1
- name: Run Unit tests.
run: make test-coverage
- name: Upload Coverage report to CodeCov
uses: codecov/codecov-action@v1.0.0
with:
token: ${{secrets.CODECOV_TOKEN}}
file: ./coverage.txt
fail_ci_if_error: true
上面總共有四個步驟:
- 準備 Go 1.13
- 切換到當前 commit
- 產生 coverage.txt
- 上傳到 Codecov
其中第三個步驟我是用 Makefile 來產生 coverage report:
PKG = github.com/mkfsn/mizukinana
PKG_LIST = $(shell go list $(PKG)/...)
test-coverage: generate ## Run unittests with coverage
@go test -short -coverprofile coverage.txt -covermode=atomic $(PKG_LIST)
完整的 workflow 如下所示:
name: Test
on:
pull_request:
branches:
develop
jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- name: Set up Go
uses: actions/setup-go@v1
with:
go-version: 1.13
- name: Check out code
uses: actions/checkout@v1
- name: Run Unit tests.
run: make test-coverage
- name: Upload Coverage report to CodeCov
uses: codecov/codecov-action@v1.0.0
with:
token: ${{secrets.CODECOV_TOKEN}}
file: ./coverage.txt
fail_ci_if_error: true
# 成果
設定完以後,每當開一個新的 Pull Request,就可以看到 Covercov 會留下這一次的比較結果: