この記事はフラーAdvent Calendar 2019の5日目の記事です。 4日目はふるふる先生の「GoでJSONを良い感じに使おうと思ってハマった話」でした。
さて、首を長くして待っていた GitHub Actions がついにGAになりましたね。 (日本語版ヘルプだとまだbetaになってますが)
さっそくActionを自作してちょっと前に公開してたんですが、この機会に紹介しようと思います。
使い方
coveralls.io はコードカバレッジの可視化サービスです。 実は公式でGitHub Actionsを提供しており、Coveralls GitHub Action を使うと 「JavaScriptのプロジェクトであれば」簡単にカバレッジを送信することができます。
しかし、Goが出力するカバレッジはJavaScriptと形式が違うので、そのままは使えません。 他のCIではmattn/goverallsにお世話になっていたので、 これを GitHub Actions として簡単に使えるようにしました。 最小限の設定はこれだけです。
# ここらへんにテストとかの設定ば別途描く
# coveralls.io に送信
- uses: shogo82148/actions-goveralls@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-profile: profile.cov
簡単ですね。
マトリックスビルド
され、後発なだけあって GitHub Actions では他のCIの便利な機能を簡単に使えます。 その中でも最も便利(偏見)なのがマトリックスビルドです。 例えば以下のように設定するだけで、Linux, macOS, Windows で同じテストを実行できます。
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
runs-on: ${{ matrix.os }}
・・・と、ここまではいいんですが、カバレッジをとって coveralls に送ると残念なことになります。 (例:https://coveralls.io/builds/27037772)
どれかがLinuxでどれかがmacOSで残った最後がWindowsの実行結果なのですが、 ジョブの名前が一緒なので区別が付きません。
parallel build webhook
coveralls にはこの問題を解決してくれるparallel build webhookというものがあります。 travis-ci だと coveralls側がいい感じにフックを挟んで処理してくれるんですが、GitHub Actions では自前でやらないといけません。 全部自前でやるのは面倒なので、actions-goveralls には補助する機能をいれてあります。
on: [push, pull_request]
jobs:
test:
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-go@v1
with:
go-version: "1"
- uses: actions/checkout@v1
- run: go test -v -coverprofile=profile.cov .
- name: coveralls にカバレッジを送る
uses: shogo82148/actions-goveralls@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-profile: profile.cov
parallel: true
job-number: ${{ strategy.job-index }}
# parallel build webhook を叩く
finish:
needs: test
runs-on: ubuntu-latest
steps:
- uses: shogo82148/actions-goveralls@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
parallel-finished: true
大事なのはここ。ジョブが複数あることを伝えるのと、ジョブ番号を含めること。
parallel: true
job-number: ${{ strategy.job-index }}
すべてのジョブが終わったら finish
ジョブが走って結果を集計してくれます。
結果はこちら https://coveralls.io/builds/27089216
ジョブ名の末尾に0,1,2と数字が入るので、GitHub Actions のログと突き合わせればパラメーターを特定できます。 (多分ジョブ一覧に並んでいる順番で採番されている気がするけど、保証されているのかは知らない)
GitHub Action の実装
現在のところ自作できる GitHub Action は Docker か JavaScript(TypeScript)の二択です。 DockerはLinuxでしか動かないので、クロスプラットフォームで動くものを作るには JavaScript を使う必要があります。 ところが mattn/goveralls の実装言語はGoです。
その連携をどうやっているかというと、各プラットフォームのバイナリをレポジトリにコミットして、 実行時にActionが動いているプラットフォームの情報を参照し、 適切なバイナリを実行しています。
クロスコンパイルが簡単でシングルバイナリなGoだからできる技・・・! 意外と便利かも?
まとめ
簡単にGoのカバレッジを可視化できる actions-goveralls の紹介でした。
もちろん他のCIサービスでも同じことはできるんですが、レポジトリと統合されているだけあって GitHub Actions だとすごく楽です。 この機会にカバレッジをとってみて、コードの品質を上げてみましょう。
フラーAdvent Calendar 2019 6日目の担当は @shogo82148 さんで「CloudFormationのテンプレートのLiner actions-cfn-lint のご紹介」です。