前章では、テストコードの書き方について解説しました。
しかし、せっかくテストコードを書いても、そもそもテストを実行し忘れていたりすると、本番環境にバグが含まれるコードがリリースされてしまう危険性が高まります。
そこで、この章では、GitHub Actionsを使用してCIをセットアップし、テストやリンタ、型チェックなどの実行を自動化する方法について解説します。
GitHub Actionsとは?
GitHubが提供している機能の一つで、主にCI/CDのセットアップなどに使用されます。
GitHubのpublicリポジトリであれば、基本的に無料で使用できます。[1]
GitHub Actionsのセットアップ
まず、GitHub Actionsを使用するためには、プロジェクトディレクトリにワークフローファイルを配置する必要があります。
ワークフローファイルは、.github/workflows
ディレクトリにYAML形式で配置します。
.github/workflows
ディレクトリに以下の内容のYAMLファイルを用意してください。(ここでは仮にci.yml
とします)
name: ci
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: denoland/setup-deno@main
with:
deno-version: "1.21.0"
- name: Run fmt
run: |
deno fmt --check
- name: Run lint
run: |
deno lint
- name: Check mod.ts
run: |
deno check mod.ts
- name: Run tests
run: |
deno test -A
このファイルをGitHubリポジトリにプッシュすると、以降、プッシュやプルリクエストの作成などを行う度に、テストやリンタ、型チェックなどが自動で実行されるようになります。
試しに、GitHubでプルリクエストを作成してみましょう。
以下のようにGitHub Actionsの実行結果が表示されていれば、適切にセットアップができています。
解説
ワークフローのトリガ
on: [push, pull_request]
この宣言によって、プッシュまたはプルリクエストイベントが発生する度に、このワークフローが実行されます。
Denoのセットアップ
- uses: denoland/setup-deno@main
with:
deno-version: "1.21.0"
denoland/setup-denoアクションを使用して、Denoをセットアップしています。
ここでは、deno-version
パラメータによってDenoのv1.21.0
をセットアップするように指定しています。
deno-version
パラメータを編集することで、異なるバージョンのDenoを使用することもできます。
テストやリンタの実行
- name: Run fmt
run: |
deno fmt --check
- name: Run lint
run: |
deno lint
- name: Check mod.ts
run: |
deno check mod.ts
- name: Run tests
run: |
deno test -A
ここでは、以下の処理を順番に実行するように定義しています。
-
deno fmt --check
でファイルが適切にフォーマットされていることを確認する -
deno lint
でリントを実行する -
deno check
でmod.ts
の型チェックを実行する [2] -
deno test -A
でテストを実行する [3]
このうちどれか一つでも失敗した場合、ワークフローそのものが失敗と判断され、処理が停止します。
ポイント
- CIをセットアップして、テストやリンタの実行を自動化しましょう。
- GitHub ActionsでCIをセットアップする際は、denoland/setup-denoを使うと便利です。
リンク
-
プライベートリポジトリについては、お使いのGitHubアカウントのプランに応じて制限が異なります。詳しくはこちらのページを参照ください。 ↩︎
-
Deno v1.23以降のバージョンでは、
deno run
コマンドでは型チェックが実行されません。そのため、CIでdeno check
コマンドを実行して型チェックを行っておくと、型エラーのリスクを軽減できます。 ↩︎ -
ここでは
-A
(--allow-all
)を指定してますが、実際には必要なパーミッションのみを指定することをおすすめします。 ↩︎