アプリケーションテストのワークフローを見直して、実行時間を短縮した話

1. はじめに

こんにちは、SWEのあかりです。今年の4月に通知チームへ異動し、ANDPADの全プロダクトから利用される通知プラットフォームの開発に従事しています。この記事では、新しいチームにジョインしてから取り組んだ改善活動の一つである「CircleCI上で実行しているアプリケーションテストのワークフローを見直して、実行時間を短縮した話」をご紹介します!

2. 前提

通知チームでは、下図のようにANDPADの全プロダクトに対して通知機能を提供するプラットフォーム1の開発を行なっています。

ANDPADにおける通知プラットフォーム

この通知プラットフォームはgRPCサーバとして機能提供しており、Go言語で開発しています。このgRPCサーバが依存するインフラは全てAWS上に構築されており、インフラリソースはアプリケーションと同じリポジトリで2ほぼ全てをTerraform管理3しています。また、ローカルの開発環境用には、AWSをエミュレートするためにlocalstackを導入しており、このlocalstackコンテナ上にTerraformを利用してAWSインフラを再現することで、ローカルの開発環境からAWSリソースを利用できるようにしています。

3. 改善前のアプリケーションテストのワークフロー

CircleCI上で実行されていた改善前のアプリケーションテストのワークフローを下図に示します。改善前はワークフロー全体の実行時間が5分程度でした。決して長いわけではないのですが、このワークフローの本質であるビルドとテストの実行時間が合わせて2分弱であること踏まえると、それ以外の3分は本当に必要な時間なのか見直す余地がありました。

改善前のテストワークフロー
(赤枠:このワークフローで本質的なビルドとテストのステップ
青枠:見直す余地のあるステップ)

4. テストワークフロー内でのridgepoleとTerraformの必要性を調査

上図からわかるように、テストワークフローで特に時間がかかっているのは、ridgepole4のセットアップとTerraformによるlocalstackへのAWSリソース作成でした。よって、以下2点の調査を行いました。

  1. テストでは、ridgepoleによって作成したテーブルを利用しているのか。利用している場合は、テスト内でのAPI呼び出しによってテーブルの作成と削除を行うように変更できないか。
  2. テストでは、Terraformによってlocalstack上に作成したAWSリソースを利用しているのか。利用している場合は、テスト内でのAPI呼び出しによってAWSリソースの作成と削除を行うように変更できないか。

そして、上記2点を調査したところ、、、
テストではridgepoleで作成したテーブルを使っていないし、Terraformによってlocalstack上に作成したAWSリソースも利用していないことがわかりました......😇(ちゃんちゃん♪)

5. 改善後のアプリケーションテストのワークフロー

そうとわかればやることはシンプル。単にテストワークフローからridgepoleとTerraformのセットアップを取り除けば良いだけです。改善後のテストワークフローを下図に示します。改善後は無事、テストワークフローが2分以内で終わるようになりました💪

改善後のテストワークフロー

6. まとめ

この記事では、「テストワークフローを見直すと、不要なステップの存在に気づいたので、これを削除してワークフローの実行時間を短くした」という話を説明しました。結論はすごく呆気なかったのですが、ここには以下3点の教訓がありました。

  1. 既存の開発物には敬意を払いつつ、だけれども、改善の余地がないのかを常に疑うこと
  2. 改善の余地がありそうと感じたら、きちんとコードを読んで調査を行うこと
  3. 改善の余地ありと判断できたら、余力があって忘れないうちに実現すること

特に新鮮味のない教訓ですが、開発スケジュールに追われていると忘れてしまいがちになるので、今回の件で再認識した次第でした^^

7. 最後に

アンドパッドでは、「幸せを築く人を、幸せに。」というミッションの実現のため、一緒に働く仲間を大募集しています。 チーム一丸となって良いプロダクトを作りたい!と思われる方はぜひぜひご応募ください!

engineer.andpad.co.jp


  1. 現時点では、まだ全てのプロダクトからは利用されていません。施工管理サービス(= アンドパッドで最も古くから稼働しているサービス)にも通知機能が実装されており、この通知機能を利用しているサービスがまだ複数残っています。現在は、通知機能の提供を通知プラットフォームに集約させている途中です。近い将来には、通知プラットフォームが全プロダクトへの通知機能提供を行う予定です。
  2. 最近、社内のTerraformコードを一括管理するリポジトリの整備が進んでおり、将来的にはそちらのリポジトリにTerraformのコードを移植する予定です。
  3. 通知チームでは、RDSとIRSAはTerraform管理していません。
  4. ridgepoleはRubyで開発されているデータベースのスキーマ管理ツールです。アンドパッドはプロダクト開発をRailsで始めた経緯があるので、Go言語で開発されているプロダクトであってもridgepoleが採用されている場合があります。