みなさん、こんにちは。
TeamSpirit EXのエンジニアリング・
マネージャをしている杉山です。
普段はマネージメント業務もしつつ、BEエンジニアとして勤怠機能の開発もしています。
こちらは チームスピリット Advent Calendar 2021 - Adventar の6日目の記事です。
今日は、リリースのリードタイムの70%削減に挑戦する話をします。
TeamSpirit EXのリリース
TeamSpirit EXは1年間に4回のメジャーリリースをしています。
マイナーリリースを含めると1年間に30回以上、月に2~3回のペースでリリースしていることになります。
LeanとDevOpsの科学 などで紹介されている、デプロイ頻度やデリバリーのリードタイムと照らし合わせると、私達はミディアムパフォーマーという括りに入るでしょうか。
※ こちらのDevOpsチェックでも診断できます www.devops-research.com
リリースプロセス
TeamSpirit EXは AppExchange に公開してるアプリケーションですが
リリースするために、パッケージ作成と呼ばれる作業をSalesforce上で行います。
下図はマイナーリリース作業を表したものです。
ご覧のように、パッケージの作成に多く時間がかかっています。
パッケージの作成時間に幅がありますが、作成に失敗することがあり、その場合は再作成が必要になるためです。
これだけ時間がかかると、緊急リリース時など修正は1日で終るのに、リリースできるのは3~4日後という事態になってしまいます。
ボトルネックはどこか
パッケージの作成時にはすべてのテストクラスが実行されます。
TeamSprit EXには5000弱のテストケースがあり、それらがパッケージ作成時に実行されますが、
ここに4時間弱 かかってしまいます。
この問題を解決する方法を考えていきましょう。
解決策1. テストを並列実行する
Salesforceではテストクラスのアノテーションにプロパティを指定することでテストを並列実行できます。
しかし、この方法だけでは問題を解決できません。
なぜなら、多くのテストがDBアクセスしているため、並列実行するとレコードのロックエラーが発生するためです。
解決策2. Mockを利用して、DBアクセスするテストを減らす
DBアクセスするテストが多いのであれば、テストを修正しましょう。
ApexのMockを利用すればDBアクセスを減らすことができ、実行時間の短縮も見込めます。
しかし、、この方法でも問題は解決できません。
なぜなら、、修正対象があまりにも多すぎて時間がかかってしまうためです。
(本当は少しずつでも対応するのが望ましいですが)
では、どうするか・・
開発用とパッケージ作成用のテストクラスをわける
パッケージ作成に必須ではないテストをパッケージから除外しましょう。
私達のチームでは、CIで定期的に全てのテストを実行しているため、パッケージ作成のタイミングに必要になるテストは極めて少ないです。
名前空間にまつわる不具合はパッケージ作成のテスト時に発見されることもありますが、これもCIのテスト組織で名前空間を利用すれば早期に発見が可能です。
パッケージを作成するためには最低限75%のカバレッジが必要ですが、そのテストだけであれば大幅に実行時間の短縮を見込めます。
さいごに
まだ発案段階ではありますが、プロダクト開発に注力できる環境を作ることがお客様にの価値につながると信じて、粘り強く挑戦していきたい次第です。
チームスピリットでは一緒にはたらく仲間を探しています。
興味を持ってくれた方は是非お声がけをお願いします!!