はじめに
本記事は個人開発でGitHub Actionsを用いた自動テスト環境を構築する際に調べた内容をまとめました。
個人開発でもチーム開発でも関係なく知っておくべき内容だと思うので、忘備録として書きました。
ゴール
最終的に達成したい内容は下記です。(mainブランチへの直pushは禁止している前提です)
- GitHub Actionsを用いてソースコードを
push
した際にテスト(Lintチェック, 型チェック)を実行する。 - テストが通らなければマージブロックする。
- マージブロックが解消されたらマージする。
GitHub Actionsとは
今回利用するGitHub ActionsとはCI/CDのプラットフォームです。
言葉だけでは何もわからないので実際にコードを書き、それぞれの用語について解説していきます。
ワークフローの作成
特定のイベント(特定のアクティビティが実行された時、スケジュールした時間)で実行したい内容を記述します。
今回はpush
された時にテストを走らせることが目的です。
ワークフローは以下の手順で作成します。
- 自身のリポジトリで、
ワークフロー
ファイルを格納するための.github/workflows/
ディレクトリをルート直下に作成します。 -
.github/workflows/
ディレクトリで、任意のファイル名.yml
という名前の新しいファイルを作成し、コードを追加します。 - これらの変更をコミットして、GitHubリポジトリにプッシュします。
それぞれ用語を解説していきます。
用語
-
name
について (1行目)
そのまま単純にこのワークフローの名前を表しています。
GitHubリポジトリのActionタブのワークフロー実行の一覧に表示されます。
-
on
について (2行目から5行目)
このワークフローのトリガーを指定しています。
今回はpush
イベントを使用しており、かつpaths
でsrc/**
と指定しています。
具体的に何をしているかと言うと「srcディレクトリ以下の変更内容がpushされた時」トリガーされます。 -
jobs
について (7行目から12行目)
このワークフローで実行される全てのジョブをグループ化します。
今回はbuild
という名前のジョブが実行されます。
実行環境は、runs-on
で指定することができ、最新のUbuntu環境を指定しています。
また、複数のマシンで実行する場合はstrategy
を指定する必要があり、10行目から12行目ではnode-version
で指定した16.x
と18.x
の各バージョンで実行することを意味しています。 -
steps
について (14行目から23行目)
このワークフローで実行される一連のタスクを指定しています。
uses: actions/checkout@v2
はリポジトリをチェックアウトするためのアクションで、事前定義されているものを使用しています。(v2はメジャーバージョンを表しています)
同じようにuses: actions/setup-node@v2
ではNode.jsの実行環境を作成しています。
run
はコマンドラインで実行する内容を表しており、今回はyarn tsc
とyarn lint
を実施しています。
(各name
は各アクションの名前です)
GitHub Actionsの挙動確認
上記のコードを実際に試します。
mainブランチに作成したワークフローがマージされていることを確認し、新しくブランチを切ってpushしてみます。
(paths
でフィルターをかけているのでsrc
ディレクトリ以下の変更内容でないとワークフローが実行されません)
test
ブランチを作成し、push
してPRを作成しました。
スクショのSome checks haven't completed yet
でテストが行われていることがわかります。
Checks
タブを開いてみます。
先ほどjobs
で設定したbuild
という名前で、Node.jsのバージョン[16.x 18.x]それぞれの環境で実行されていることがわかります。
これでGitHub Actionsの自動テストが正しく行われていることが確認できました。
ですが、テストが通らずエラーとなっていてもマージできてしまう状態です。
テストが通らなかった場合はマージできないように、マージブロックを設定します。
マージブロックの設定
まずはリポジトリのSettings
タブを開きます。
サイドメニューのBranches
を選択し、Add branch protection rule
を開きます。
Branch name pattern
を入力し、Require status checks to pass before merging
にチェックを入れます。
Require status checks to pass before merging
は「マージ前にステータスチェックに合格する必要がある」ことを意味しているので、どのステータスチェックに合格する必要があるのかを選択します。
ここでステータスチェックの検索にかけるワードは先ほど記述したワークフローのjobs
の名前です。
(今回はbuild
と設定しているのでbuild
で検索)
build(16.x)
とbuild(18.x)
がヒットしたので両方選択し、一番下のCreate
ボタンで作成します。
サイドバーのBranches
を選択すると、新たにルールが作成されていることが確認できます。
ルールが作成されたことを確認できたら、先ほどのPRを見てみます。
先ほどとは異なり、マージができないようになっています。
テストのエラーが解消された段階でマージが可能な状態になります。
これでマージブロックの設定が完了しました。
チーム開発であればテストの合否だけでなく、レビューをしてもらわないとマージできないようにも設定できます。
次は個人開発をしているときに重宝されるであろう(知らんけど)自動マージについて解説していきます。
自動マージの設定
テストでこけた(マージブロック)PRで自動マージを設定していきます。
自動マージの設定はリポジトリ単位ではなくPR単位になります。
まずは今までと同様にリポジトリのSetting
タブを開きます。
中盤から下の方にある、Pull Requests
セクションのAllow auto-merge
にチェックします。
これで先ほどマージブロックされたPRを見てみます。
Enable auto-merge
と表示されているのがわかります。
Enable auto-merge
をクリックするとマージする時と同じような画面が出るので必要なコメントを残しConfirm auto-merge
をクリックします。
これで自動マージの準備は完了しました。(Disable auto-merge
からいつでも設定解除できます。)
この状態でマージブロックを解消してやると自動でマージされます。
まとめ
今回記事を書いていく中で、GitHub Actionsのワークフローに関してはまだまだ理解が足りないなと実感しました。(できることが多すぎる)
ですが、自動テストに関してはこれから転職を目指す初心者の方にとっても知っていて損はないので実際に試していただきたいところです。
自動マージに関しましては、PRごとに設定する必要があり、必ず自動化の恩恵が受けられるとは思わないので必要に応じて使いこなしていければいいかなと思いました。
書けば書くほど雑になりましたが、最後にブランチ削除の設定だけ解説して終わりにしたいと思います。
興味のある方だけ読んでみてください。
オマケ
ブランチの自動削除の設定を行います。
基本的にマージされたブランチは必要ないものなので削除すると思うのですが、この操作も自動化してしまいます。(めちゃ簡単です)
先ほど自動マージの設定と同様にリポジトリのSetting
を開きます。
そして先ほどチェックを入れたAllow auto-merge
の下のAutomatically delete head branches
にチェックを入れます。
終わりです。
これでマージされたタイミングで自動でブランチが削除されるようになりました。
自動化できるところはどんどん自動化して開発スピードを上げていきましょう!