This is my life.

There are many like it, but this one is mine.

GitHub Actions で push の度にテストを動かす

GitHub Actions が public repository でも使えるようになりました!
(2018/12/24現在まだ public beta 版での提供です。)

早速、現在アクティブに開発しているリポジトリで試してみました。

対象のリポジトリには既に以下の様な Dockerfile があります。

FROM golang:1.11-alpine
MAINTAINER shunsuke maeda <duck8823@gmail.com>

RUN apk --update add --no-cache alpine-sdk

WORKDIR /go/src/github.com/duck8823/duci

ADD . .

ENV CC=gcc
ENV CI=duci

ENV GO111MODULE=on

ENTRYPOINT ["make"]
CMD ["test"]

必要な依存ライブラリなどをインストールし、 Makefile で定義されたタスクを実行するだけです。
ちなみに Golang で開発しているリポジトリなので、 Makefile では以下のようにテストの実行を定義しています。

test:
    go test -coverprofile cover.out $$(go list ./... | grep -v mock_)
    go tool cover -html cover.out -o cover.html

スクランナーでタスクを定義し、 Dockerfile で実行環境を定義するという方針で開発をしています。

さて、この DockerfileGitHub Actions で実行すれば、 Push の度にテストを実行してくれるということになりますね。

設定したいリポジトリActions タブをクリックすると、GUIで編集できる画面になります。
f:id:duck8823:20181220004237p:plain

Create a new workflow をクリックして編集してみましょう。 直感的に操作できるようになっています。
f:id:duck8823:20181220004539p:plain

最初からあるのはトリガーです。今はパブリックリポジトリでは pushしか選べません(2018/12/20 現在)。 f:id:duck8823:20181220004940p:plain 本能に従いトリガーの青い部分をドラッグ&ドロップすると、 Action を定義する箇所が現れます。

ここで、Dockerfile が存在するディレクトリの相対パスを指定することで、リポジトリ内の Dockerfile を利用することができます。
.duci/Dockerfile を実行したいとすると、 ./.duci/ となります。
f:id:duck8823:20181220005457p:plain

use をクリックすると更に詳細を設定できます。
GitHubの各リポジトリではSecrets が登録できるようになっており、ここで指定することでコンテナに渡すことができます。
f:id:duck8823:20181220005710p:plain

また、DockerflleENTRYPOINTCMD を上書きもできるようです。
ここではシンプルに何も上書き・設定しません。

GUI で編集したものは、定義ファイルとして保存されることになります。

workflow "New workflow" {
  on = "push"
  resolves = ["./duci/"]
}

action "./duci/" {
  uses = "./duci/"
}

なにやら見慣れない形式ですね。

リポジトリ.github/main.workflow というファイルが作成され、GUI上からコミットやブランチ&PRの作成までできてしまいます。
f:id:duck8823:20181220010322p:plain

これをコミットして実際に push すると、 Commit Status もつけてくれます。
f:id:duck8823:20181220010547p:plain

また、 Commit Status の details や Actions の log から、実行時のログを見ることもできます。
f:id:duck8823:20181220010720p:plain

本来、色々な Action を組み合わせて workflow を組み立てていくものですが、ここでは push の度にテストを回す方法を紹介しました。
テスト実行用の Dockerfile を用意してGitHub上でちょっと操作するだけで CIでテストが回せる時代になってしまいましたね。
書いたテストはガンガン実行していきましょう。