【2023年版】CircleCI で GitHub プロジェクトをビルド＆テストする

# 本記事で説明すること
CircleCI アカウント([Free プラン](https://circleci.com/ja/pricing/) でももちろんOK)を作成した後、ご自身の GitHub プロジェクトを CircleCI でビルド＆テストする方法をご紹介します。

# はじめに
[【2023年版】CircleCIにサインアップ(Sign up)](https://qiita.com/mfunaki/items/14080547b352be9d265c)に説明した方法で CircleCI アカウントを作成したら、次は、GitHub プロジェクトをビルド＆テストしてみましょう(サンプルでご紹介するのは Python プロジェクトなので、正確にはビルドはしていないのですが)。

# CircleCI で GitHub プロジェクトをテストする
## 1. 前準備
スムーズに作業を進めるため、次の準備をしておきましょう。

- CircleCI アカウントの作成 (やり方: [【2023年版】CircleCIにサインアップ(Sign up)](https://qiita.com/mfunaki/items/14080547b352be9d265c))
- GitHub アカウントの作成 (やり方: [GitHubにサインアップ(Sign up) - 新規ユーザ登録](https://qiita.com/mfunaki/items/e01762475967d4e05a1f))
- まだしていないのであれば、SSH キーを(必要に応じて)作成し、GitHub に認証鍵(Authentication Key) として公開鍵を登録する(GitHub サイトの[説明](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent))。`ssh -T git@github.com` で SSH 接続ができることを確認しておく(GitHub サイトの[説明](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection))
- parallel-pytest プロジェクト(https://github.com/mfunaki-circleci/parallel-pytest) を自分の GitHub リポジトリに fork して、ローカル環境に clone しておく

## 2. CircleCI アカウントに GitHub アカウントを接続
[【2023年版】CircleCIにサインアップ(Sign up)](https://qiita.com/mfunaki/items/14080547b352be9d265c)に従ってCircleCI アカウントを作成したばかりであれば、次のようにバージョン管理システムへの接続画面が表示されているかと思います。

また、アカウントはすでに作成済みということであれば、CircleCI ウェブアプリ(https://app.circleci.com)にアクセスしましょう(ログインが必要であれば、Login with Email からログインしてください)。(CircleCI でプロジェクトを未設定であれば)次の画面が表示されます。

![Screenshot_2023-09-08_at_18_50_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/43533a52-9fe7-c8c7-3ee6-c871bc394835.png)

いずれの場合でも、画面上の GitHub の右にある［Connect (接続)］ボタンをクリックすると、GitHub の画面に遷移します。

![Screenshot_2023-09-08_at_18_51_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/6ae7940e-1281-3c9e-b3cf-b1bd0ebfc18d.png)

Install & Authorize CircleCI App (CircleCI Appをインストール、認証する)という画面が表示されるので、［Install & Authorize(インストール、認証する)］をクリックします。次に Project (プロジェクト) 画面が表示されます。

## 3. GitHub プロジェクトを CircleCI プロジェクトとして登録
Project 画面から［Create Project (プロジェクトを作成)］ボタンをクリックします。

![スクリーンショット_2023-09-08_22_40_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/6fe928e2-b9e3-b58e-0fa6-25f644b6691a.png)

すると、Create New Project (新規プロジェクトを作成) 画面が表示されるので、Connect to (接続先) に GitHub.com を選択し、［Connect (接続)］ボタンをクリックします。

![スクリーンショット_2023-09-08_22_41_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/534f6824-62ac-9e02-0153-eb458fe18ae3.png)

GitHub に接続すると、画面表示が下のように変わります。Private SSH key にはSSH 秘密鍵の内容を貼り付けます。また、Repository には前準備で自分のレポジトリに fork しておいた cci-pytest プロジェクト(あるいは、自分が使いたいプロジェクト) を指定します。`.circleci/config.yml` ファイルが存在する場合、下のスクリーンショットのように、その旨、表示されます(.circleci/config.yml found)。また、Project Name (プロジェクト名) もここで指定します。リポジトリ上の名前をそのまま使用することも、別の名前を使用することも可能です。

![スクリーンショット_2023-09-08_22_43_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/5dab5da6-101a-7063-de62-6caaa4175823.png)

ここまで指定したら、［Create Project (プロジェクトを作成)］をクリックしましょう。

## 4. コンフィグファイル(config.yml) を編集し、テストを自動実行する。
それでは、前準備でローカル環境に clone しておいたプロジェクトを見てみましょう。

![スクリーンショット_2023-09-10_14_57_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/bd4d3528-08f8-60b8-e4a2-37deb71e9612.png)

Python で書かれたテストファイルが用意されており、テスト所要時間に対応したファイル名が付けられています(例えば、`fifteen_second_test.py` はテストに15秒かかる)。したがって、ここにあるテストを全て実行するには、15秒+50秒+5秒+40秒+100秒+60秒+10秒+30秒+20秒 = 330秒 かかると見込まれます。

一方、`config.yml` ファイルの8行目に `parallelism` (並列実行数) を指定する箇所があるので、ここに、1 や 3、5といった数字を指定して、`config.yml`の内容を保存し、commit した後、GitHub.com に push しましょう。push されたタイミングで、この `config.yml` 上で指定された自動化手順に沿ってテストが実行されます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/44BhdCb8J9Y?si=Ndk0HwKjZEXbCZP8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# さいごに

CircleCI を使った GitHub プロジェクトの自動テストを実行してみて、いかがだったでしょうか？

並列度を上げることで、どれだけテスト完了までの時間が短縮されるか、および、並列度を上げても必ずしも(大幅に)消費クレジットが増加しているわけではないことを示したのがこちらの図です。

![20230913-自動化→部品化すると社内開発は楽しくなる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/e46815ec-9c60-07f5-98c6-07c1c0824ac3.png)

ぜひご自身でも並列数を変えてみて、また繰り返し実行してみて(並列実行時のテストの割り振りは過去のテスト実行時の所要時間をもとにしているので)、必要に応じてテストを再構成してみて(現在のままでは、100秒かかるテストケースを分割等しないと、並列数を上げてもテスト完了時間が100秒を切ることはないため)、CircleCI を使った自動テストの効果を実感していただければと思います。Happy Building & Testing!