こんにちは。18新卒でサービスインフラチームの小笠原 (@0gajun) です。
今日はCircleCIのPerformance Planを用いて、CI環境の改善を行った話をします。 (決してCircleCIの回し者ではありません :wink: )
Summary
- 今までJenkinsをCI環境として用いており、様々な問題を抱えていた
- CI環境を改善するためにCircleCIに移行した
- CircleCIにはPerformance Planという従量課金プランが存在する
- コンテナの並列実行数に制限がなく、実行時間ベースでの従量課金
- ただし、まだ Early Accessの段階。
- CircleCIにはPerformance Planという従量課金プランが存在する
- JenkinsからCircleCIに移行することで、次のメリットが得られた
- CI時間の短縮
- CIジョブがキューイングされる問題からの開放
- CI環境のメンテナンスコスト削減
- CIコストの削減
- CircleCIのPerformance Plan最高
マネーフォワードにおけるCI環境のこれまで
マネーフォワードでは長い間、JenkinsをCI環境として用いてきました。 しかしながら、社内のJenkinsを用いたCI環境では以下の問題が生じていました。
- 長いCI時間
- 簡単に並列度を上げて短縮できるような仕組みがない
- キューイング問題
- CI混雑時には他のCIの終了を待たなければCIが走らない
- お金
- アイドル時間にもかかるEC2インスタンス料金
- メンテコスト
- 構成管理されずに長く使われてきたCIノードが頻繁に不調を来す
- インフラが頻繁に対応に当たり、改善のための時間が削られてしまう
- Jenkins自体のアップデートも面倒
このままでは社内の DX(Developer Experience)も悪いしインフラも辛い。ということで、CI環境の改善に取り掛かりました。
(勿論Jenkinsおじさんでも上記の問題は解決できないことはないと思います。
R.I.P. Jenkinsおじさん。Hello, CircleCI!!!
様々なCIサービスを比較検討した結果、マネーフォワードでは CircleCI をメインのCI環境として用いることとしました。
大きな理由は次の2点です。 1点目はマネージドであることに依るメンテコスト削減です。但し、これは他のCI as a Serviceでも同様のメリットは得ることが可能です。 2点目は Performance Plan の存在です。このプランの存在が決め手となりました。 CircleCIのCustomer Successの方とメールする中で教えてもらい、すぐにトライアルを開始し現在に至ります。
Performance Plan
Performance Planとは、 ビルド時間、及びチームの人数に応じて課金される 従量課金プラン です。 このプランの最大の特徴は同時実行コンテナ数が 無制限な点にあります。 この特徴により、簡単にテストの並列度を上げることが可能になるとともに、他のJobによってキューイングが生じることがなくなります。
課金体系
課金体系は次のように、アクティブユーザ数と消費クレジットから計算されます。
月額料金 = アクティブユーザー数 * $15 + 消費クレジット * $0.0006
特徴的なのは消費クレジットです。Performance Planにおいては実行環境のスペック (Resource Class) が選択可能で、Resource Classによって実行時間1分当たりの消費クレジットが変動します。
以下にResource Classと消費クレジットの対応表を示します。
Resource Class | vCPU | Memory (GB) | Credit / Min |
---|---|---|---|
S | 1 | 2 | 5 |
M | 2 | 4 | 10 |
M+ | 3 | 6 | 15 |
L | 4 | 8 | 20 |
XL | 8 | 16 | 40 |
上の表が示すように、vCPUとMemoryの量に応じて1分あたりの消費クレジット料が変動します。 例として以下のケースのテスト1回あたりの料金を計算してみます。
- 並列数 : 4並列
- テスト実行時間 : 5分
- Resource Class : M
テスト一回あたりの消費クレジットは、10 credits / min * 5 min * 4 = 200 credits
なので、テスト1回あたりの料金は、 200 credits * $0.0006 / credit = $0.12
となります。
16並列だとしても $0.48
程度であり、高並列度かつキューイングされない環境にも関わらず十分にリーズナブルな価格です。
解決されたマネーフォワードの課題
従量課金かつ同時実行コンテナ数無制限のPerformance Planにより、マネーフォワードのCIに抱えていた課題は以下のようにして解決されました。
長いCI時間
Performance Planでは並列度が無制限のため、各プロダクトで必要なだけテスト並列度を上げることが可能となりました。 あるプロダクトを例に上げると、Jenkins時代には1回あたり8並列で30分強かかっていたCIが、CircleCIでは64並列10~15分まで改善されました。
8倍の並列度にしたにも関わらず1/8の時間になっていないのは、CircleCIでテストを走らせるまでのセットアップに時間がかかっていることや、並列実行されているコンテナ間でテストの分散がうまく行われていないことに寄ります。
後者は後述しますが、前者については bundle install
したものの save_cache
ステップや、job間での persist_to_workspace
ステップが ファイル数が多い場合に非常に時間がかかってしまうためです。 (https://circleci.com/blog/deep-diving-into-circleci-workspaces/)
このあたりは、巨大でモノリシックなRailsアプリであるが故に抱えている辛みであり、正直高速化するにはアプリケーションを分割していくしか無いと思っているので、今後の課題としています。
キューイング問題
同時実行コンテナ数の制限が無いので、全くキューイングされることがなくなりました。 Jenkinsでこのキューイング無しのCI環境を実現するためには、自分たちで負荷を予測してslave nodeをscaleさせる必要がありましたが、CircleCIでは全く考える必要がありません。
実際、64並列で動かしているプロダクトに対するCIが5つ同時に実行されたとしても、320コンテナを用いてテストを実行してくれています :+1:
コスト
Jenkins時代には80万円/月 だったCIコストが、CircleCIでは 40万円/月 まで削減されました。
従来のCircleCIの課金体系でこのキューイングされない環境を実現しようとすると、300コンテナ弱の契約が必要だと見積もっていました。 16並列でテストを回したとして、ピーク時に6プロダクトがそれぞれ3つジョブを回す状況を考えると、
16コンテナ/ジョブ * 3 ジョブ/プロダクト * 6プロダクト = 288コンテナ
が必要です。従来プランは$50/コンテナのため、上記コンテナ数を実現するには
$50 * 288 = $14400
と月額約150万程のコストが掛かってしまい、いくらJenkinsよりもいい環境が手に入るとはいえ、手の出しにくい価格でした。
しかしながら、PerformancePlanでは当初見積もりの1/4程度の金額でキューイングのない理想的なCI環境を実現できています。
メンテコスト
当たり前ですが、CI環境に関するインフラに対する問い合わせが減りました :metal:
これでよりインフラチームがインフラを前に進めるための時間が取れるようになりました :+1:
その他
高並列数を活かすためにいいところ
- 簡単にテストを分散実行できること
- CircleCI CLIがテストファイルを複数コンテナに分散させる機能を提供しており、簡単に並列実行ができる :metal:
- ref : https://circleci.com/docs/2.0/parallelism-faster-jobs/
- テスト結果を複数コンテナから簡単に集約できること
- junit形式でテストレポートを吐き出すことで、複数コンテナのテスト結果を簡単に集約して見ることが可能です
:point_down: 一例
より高並列数を活かすためにあると嬉しいなCircleCI
- 賢いテスト分散実行の仕組み
- 現状ジョブの起動時に各コンテナが実行するテストが決定してしまうので、コンテナ間で実行時間にばらつきがある。
- knapsack のような実行中に動的に分散する仕組みが簡単にできるととてもありがたい
- knapsackは並列数に制限があり、CircleCIのPerformance Planの良さを殺してしまうので残念ながら利用できていません。
まとめ
CircleCIのPerformance Planが控えめに言って最高という話でした。
そのうち、CircleCI全社導入にあたって行ったことや、CircleCIでのtips、ハマりポイントを書くことができたらと思います。
(突如OOM Killerに殺されてしまう話とか)
最後に
マネーフォワードでは、一緒に溜まった負債を返済しながらインフラをもっと前へ進めることで、DXを向上させてくれるエンジニアを募集しています!
ご応募お待ちしています。
【採用サイト】 ■マネーフォワード採用サイト ■Wantedly | マネーフォワード
【マネーフォワードのプロダクト】 自動家計簿・資産管理サービス『マネーフォワード』 ■Web ■iPhone,iPad ■Android
「しら」ずにお金が「たま」る 人生を楽しむ貯金アプリ『しらたま』 ■Web ■iPhone,iPad
ビジネス向けクラウドサービス『MFクラウドシリーズ』 ■バックオフィス業務を効率化『MFクラウド』 ■会計ソフト『MFクラウド会計』 ■確定申告ソフト『MFクラウド確定申告』 ■請求書管理ソフト『MFクラウド請求書』 ■給与計算ソフト『MFクラウド給与』 ■経費精算ソフト『MFクラウド経費』 ■入金消込ソフト『MFクラウド消込』 ■マイナンバー管理ソフト『MFクラウドマイナンバー』 ■資金調達サービス『MFクラウドファイナンス』
メディア ■くらしの経済メディア『MONEY PLUS』