最新版⭐︎CircleCI活用テクニックを一挙大公開！


# はじめに
皆さんこんにちは！
CircleCIカスタマーサクセスマネージャーの小島です。
CircleCIカスタマーサクセスチームでは、お客様がCircleCIを最大限、効率良く、お客様の目標に合わせて活用していただけるよう、日々お手伝いをしております。
今回は、私たちカスタマーサクセスチームがお客様のCircleCI活用をお手伝いするための指標やテクニックをご紹介させていただきたいと思っております。

# 目次
- Insight Dashboardを活用し、問題点を可視化しよう
- 適切なリソースクラスが使われているか確認しよう
- テストジョブで並列実行、テスト分割、テスト結果の保存を確認しよう
- ビルドジョブでキャッシュ、ワークスペース、DLCが効いているか確認しよう
- おわりに

# Insight Dashboardを活用し、問題点を可視化しよう
カスタマーサクセスチームでは社内のデータダッシュボードを活用し、お客様の指標や利用状況を分析しております。
皆さん、Insight Dashboardを活用されていますか？
Insight DashboardはCircleCIが提供するワークフロー可視化ツールです。
Insight Dashboardでは、最大過去90日間のプロジェクトごとの様々な指標が確認できます。
CircleCIでは、以下の4つの指標の改善に取り組んでいただくよう推奨しております。
![スクリーンショット 2022-10-20 17.25.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/0c510dcb-48a9-56fd-aee8-7e84a38be7f3.png)
特に実行時間の改善に取り組んでいらっしゃるお客様が多く、私たちも実行時間の長いワークフローがないかを、Insight Dashboardで確認しています。


それではInsight Dashboardを利用した活用方法を紹介していきます。
まず、実行時間が長く、クレジット消費数が多いワークフローを見つけ出すためにソートしましょう。
![スクリーンショット 2022-10-20 17.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/29c6c744-8271-86de-ec49-cc1203b83715.png)

実行時間が長く、クレジット消費数が大きいワークフローが見つかったらワークフローの中身を確認しましょう。 
![workflowmetrics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/fd0d52ef-0377-f0b7-6c67-80c926dc6b90.png)

ワークフローの中に入ると過去30/60/90日のワークフローに動かしたワークフローが全て表示されるので、最新のものを開いてみましょう。
![mostrecentworkflowrun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/24dca633-3ba7-4b44-0b94-3e34b737585d.png)

最新のワークフローを開くと、実行時間が長いジョブを特定できます。
![slowjob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/fb62015f-bd32-09ea-7363-a72114417c3e.png)




# 適切なリソースクラスが使われているか確認しよう
Insight Dashboardで実行時間に時間がかかっているジョブを特定したら、まずは使用中のリソースクラスのサイズが適切か確認してみましょう。
ジョブをクリックするとDockerまたはMachine ExecutorでビルドしているとRESOURCESタブが出現します。(macOSにはまだ対応しておりません)
このタブをクリックするとCPUとRAMの使用率が確認できます。

![resources.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/e389306e-69cb-eadc-2137-a25eb470ed2a.png)

使用率が25％以下であるのであれば、リソースクラスのサイズを一つ下げてみてもいいでしょう。
![underutilizeresourceclass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/583ac4b5-4b57-e2ee-4f8e-7516fb488557.png)

使用率が100％に近く、実行時間が遅ければサイズアップを行い、再度ジョブを実行してみてください。
![underprovisionedresource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/12a5f6d6-878e-8caa-7754-d5affe3b5c6d.png)



# テストジョブでCircleCIの機能が活用されているか確認しよう
E2Eテストなどを実行しているテストジョブでは、テストの数が多くなり、実行時間も長くなりがちです。
リソースクラスを変更するだけでなく、以下の機能もぜひ一緒に利用してみてください。
<strong>テスト分割</strong>
![testsplittingnodes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/aa2b8df8-3260-ba9b-05dc-1b0745f6905e.png)
<strong>並列実行</strong>
![parallelismlevel80configfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/85fc65ba-617a-5d91-c5b9-01d9b073b48e.png)
テスト時間を短縮するには、テストを実行するマシンのスペックを確認していただきサイズを上げていただくよう、前章で紹介いたしました。
もう一つの方法として、テストの並列実行があります。
、テストを実行するマシンのスペックを上げるのではなく(むしろ、多くの場合は下げてもよい)、テストを実行するメンバー(マシン)を増やし、同時に実行することです。テストにおいて相互依存がなければ、１人(一台)よりは２人(二台)でテストすることでテスト時間の半減、３人(三台)であれば三分の一になることが期待されます。

<strong>テスト結果の保存</strong>
![uploadtestsui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/a3be776a-9519-9c21-3b84-dd544cd57708.png)

テスト結果を保存することで、テストをタイミングで分割、Flakeyテストの検出が容易となるため、実行時間だけでなく成功率の改善や平均復旧時間の改善にも繋がるので、ぜひ利用してみてください。

# ビルドジョブでCircleCIの機能が活用されているか確認しよう
ビルドジョブにおいては、以下の３点が活用されているか確認してみてください。
<strong>Docker Layer Caching</strong>（1つのジョブで利用ごとに200クレジット消費）
![f96f82b8-e838-4e89-b745-558c9d28d7ae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/0d8de10b-3e4d-ced5-55fe-8694c5256d82.png)
Docker Layer Cachingは一度作成されたDockerイメージのレイヤーを再利用することで、Dockerのスピンアップタイムを縮小できます。
コンフィグファイルから検索をかけ、DLCが利用されているのにも関わらず時間がかかっている場合はうまく効いていない可能性があります。
一度DLCがうまく活用されているか、利用する必要があるか確認してみてください。


<strong>キャッシュ</strong>
![56bf637e-22ee-489c-b62a-a06e70d89cd0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/6fe00351-0158-a3aa-4835-e07579524b6f.png)
キャッシュでビルドを高速化しましょう。この機能により、時間のかかるフェッチ操作のデータを再利用できます。
キャッシュ機能を利用すると、npmやyarnなどの依存関係を毎回インストールする必要がなくなります。

<strong>ワークスペース</strong>
![7acb1f36-da26-46d3-9919-beeb287627cb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634965/ed3987b3-45e3-f8bc-669b-ddeffadec338.png)
ワークスペースを利用することによって、ジョブで一度生成したデータを他のジョブへ渡すことができます。
毎回データを生成する必要がなくなり、ワークスペースのアーカイブ、アップロード、ダウンロードに要する時間が節約されます。



# おわりに
今回紹介した機能はごく一部であり、この他にもCircleCIを活用する機能はたくさんあります。
カスタマーサクセスチームでは日々製品情報のアップデートや、基礎知識の向上を図っております！
「こういう使い方をしているのだけれど、どうやったらもっと効率的に使えるかな？」などのご相談ございましたら、いつでもカスタマーサクセスチームまでご意見ご要望をお聞かせください。
 
参考記事
さらに実行時間のみではなく、適切な Executor の選択、ジョブの並列処理、キャッシュ、ワークスペースの使用、シークレットの管理、Orbs の使用という6つのポイントから活用方法を公式ブログでは紹介しております。
[CI 構成を最適化する 6 つのヒント](https://circleci.com/ja/blog/six-optimization-tips-for-your-config/)

その他、実際に実行時間の最適化に取り組まれたANDPAD様の事例もとても参考になるかと思います。
こちらもぜひご参照ください。
[CircleCI上のRSpecによるテスト実行時間を25min -> 12minに短縮する技術](https://tech.andpad.co.jp/entry/2022/05/11/100000)