はじめに
みなさんCIしてますか?
ちなみに僕はCIは大好きですが、それの環境構築をするのは大嫌いです。
毎回細かい設定をしたり、ごちゃごちゃといろんなことをやらなければいけないのは本当に憂鬱です。
ということで今回は新しくサービスを作成するときに必要であろうGoのアプリケーションのCIをGithub Actionsで簡単にやりたいと思います!
Github Actionsについて簡単に、、、
Github ActionsはGitHubが2019年11月に正式に公開したGitHub上のリポジトリやイシューに対するさまざまな操作をトリガーとしてあらかじめ定義しておいた処理を実行できる機能です。
これまでの
- Circle CI
- Jenkins
の兄弟みたいな物だと思ってもらえるといいと思います!
またGithub Actionsは .github/workflows/
配下にymlファイルを作成することで処理を実行してくれます
├── .github
│ └── workflows
│ └── ci.yml
今回のゴール
今回はあくまで最低限のci環境を構築するだけなのでやることは
- buildできる
- lintを通す
- testを通す
この3つだけです!
もちろんこのあとDockerHubにあげたり、リリースまで行ったりと、やれることはたくさんあると思いますがいったん今回は省略です。
Actionを実行するファイルの実装
name: go-ci
on: [push]
jobs:
# 共通処理
setup:
runs-on: ubuntu-latest
steps:
- name: set up
uses: actions/setup-go@v2
with:
go-version: ^1.13
id: go
- name: check out
uses: actions/checkout@v2
# 処理を高速化するために環境をキャッシュ
- name: Cache
uses: actions/cache@v2.1.0
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
# buildテスト
build:
needs: setup
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: build
run: go build ./...
# testを通す
test:
needs: setup
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: test
run: go test ./... -v
# lintを通す
lint:
needs: setup
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
with:
version: v1.29
パッと見かなりいろんなパラメータがあって0から全てを作っていくのはとても難しそうなイメージがありますが、、、
実はそんなことありません。Github Actionsは既にかなりの数のテンプレートが存在するので基本的にそれらのテンプレを組み合わせるだけです。
(上記のコードもほぼそれらのテンプレートをそのまま使っています。)
具体的には、、、
# 共通処理
-> setup-go
# 処理を高速化するために環境をキャッシュ
-> actions/cache
# lintを通す
-> golangci/golangci-lint-action
を参考にしています。
(build, test処理はGoの標準コマンドを活用しているので省略します)
上記actionsでやってることとしては、、、
# 共通処理
となってるところでgoの環境のセットアップ
↓
共通処理終了後build
, test
, lint
の処理を並行で実行
というような感じです
最終的にプルリクエストを出したときにこのようにワークフローが回っていることが確認できれば成功です!おわりに
Github Actionsがリリースされてからまだ日が浅いこともありベストプラクティスが確立されてないところや、OSSのスター数がどれも少ないところなど多少不安な点もありつつもCIをもGithub内で完結できるのはとても魅力的ですし、他のCIツールを使ったことがある方であれば学習コストもほとんどかからないと思うので、1度は触った方がいいのかなと思っています。