CIの実行時間を15%短縮した話はじめまして、エンジニアリンググループの山口です。9月にjoinし、クラウド型電子カルテ「デジカル」を開発しています(今後「エムスリーデジカル」として本格展開することがプレスリリースで発表されました!)。CIの実行時間を15%短縮した話です。複数の言語を組み合わせてサービスを構成しています。チームの開発スタイルは以下の通りで、比較的安全に開発が進められるようになっています。Wikipedia)誰もレビューしていない状態でマージしないCIが通らない状態でマージやリリースをしないただし、改善の余地は山ほどあります。そのひとつは、"CIの遅さ"でした。CIが遅いことによる弊害CIは、全ジョブ合計で1時間半近く掛かっていました。依存関係のないジョブを複数ランナーで並列実行しても40分。CIの遅さによって、主に2つの問題が生じていました。hotfixリリースに時間が掛かる好ましくはありませんが、何らかの理由で急いでリリースする場合があります。その際、CIが通ってからリリースするようにしているため、CIの遅さはそのままリリースの遅さに直結します。仮に不具合の修正だとすると、修正の適用がそれだけ遅れます。それを認識した上でCIを待たなければならない、という精神的な辛さもあります。コンテキストスイッチに時間が掛かる時々CIの通らないpushをしてしまうこともあります。その失敗が通知されるのは、最悪の場合1時間半後です。内容はほとんど覚えていません。なんだっけ、と思い出す時間が積み上がります。CIが遅いのか?この問題に対処することを決め、早速原因を探っていきます。Jobsからジョブ単位の実行時間を確認することができます。3分24秒(他省略)一見、テストを早くすれば良いように見えます。本当に「テスト」自体が原因でしょうか?例えば、rspecジョブには、rspec以外にもDockerコンテナの生成やリポジトリのクローンなど様々な処理を含んでいます。結論づけるには早計です。どの"セクション"が遅いか?では、処理ごとの実行時間を調べていきましょう。エスケープシーケンスで隠されている部分があります。そこに、処理(セクション)開始/終了時のタイムスタンプが記録されているのです。EditionのCIログを見てみましょう。タイムスタンプは見当たりません。Raw"をクリックして生のログを見てみます。見えなかった部分が見えてきます。エスケープシーケンスが混ざっていて分かりにくいですが、反転している箇所がまさにタイムスタンプです。セクションごとの時間を表示するさて、タイムスタンプから実態を明らかにしましょう。ドキュメントがないため推測を含みますが、こういったセクション構成のようです。ジョブのRawログから所要時間を抽出してみます。今回は一旦置いておきます。他を見てみると、restore_cacheとarchive_cacheにも多少時間が掛かっています。調べてみると、どのジョブもrestore_cacheとarchive_cacheにほぼ一定の時間を消費していることに気づきました。キャッシュに時間が掛かるか?早速、.gitlab-ci.ymlのキャッシュ設定を確認してみます(以下、一部抜粋)。engine/.ivy2インデントのない部分でのcache定義、つまり全ジョブ共通で1個のキャッシュを持っており、そこにRuby/Scala/Node.jsのライブラリが全部入っていることが読み取れます。これをジョブごとに復元・保存するので、時間が掛かるわけです。キャッシュを適切に原因は「巨大な」「ひとかたまり」のキャッシュでした。これを「複数の」「小さな」キャッシュに分割します。cache:keyでキャッシュを分割rspecを実行するのにNode.jsのライブラリは不要で、逆も然りです。よって、ジョブごとに必要なライブラリのみをキャッシュとして持つように変更します。よってキャッシュに名前を付けて使い分け/使い回しすることが出来ます。今回は言語ごとにキーを分け、キャッシュを分割しました。gemのドキュメントはインストールしないgemはデフォルトでドキュメント類もインストールされますが、CIには不要なのでついでに省きます。15%短縮この変更を適用した結果です。(74分12秒)約13分、15%の実行時間短縮が出来ました。ジョブが並列実行される場面では、調子が良いと30分を切るくらいになりました。いえ、まだ全然早くありません。10分未満が理想です。hiring!こうした地道な改善も、チームリーダのUSA出張のような大きなイベントも、「やりたい」と言えば入社歴や立場に関係なくチャレンジできるのがエムスリーの魅力です。AI・機械学習チームの笹川です。エンジニアの岩本です。月別アーカイブ注目記事はてなブログをはじめよう!m3techさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。