1
/
5

CircleCI の費用が突如 1.5 倍になった話

Photo by Mathieu Stern on Unsplash

この記事は、CircleCI Advent Calendar 2023 の 25 日目の記事です。

こんにちは、ウォンテッドリー株式会社の @fohte です。普段は Infra Squad でインフラのコストを管理していたりします。

今回は、CircleCI の費用増が起きた話と、それの対策を行った話をします。

CircleCI の費用が突如 1.5 倍になる

Infra Squad では、利用しているインフラや SaaS の利用料金を月次でチェックしています。

そこで CircleCI の費用を普段どおりチェックしていると、ある月で前月の 1.5 倍ほどまで増加していました。

下図は、そのある月で増加している様子です。縦軸は費用を、横軸は年月を示しています。

なぜ突如増加しているのか?

このまま増加し続けた場合、事前に確保している年次予算を超えてしまいます。少なくともこれは防ぎたく、まず増加している要因を調査しました。

CircleCI には Insights という利用状況を可視化する機能が備わっており、ここからざっくりとクレジット利用数の内訳などが確認できます。

参考:

CircleCI のデータ活用 - Insights と Insights API - Qiita
こんにちは。CircleCI カスタマーサクセスチームの Chisato です。最近個人的に幸せを感じた出来事は、育てているレモンの花が咲いたことです。今年2回目の開花で、とても良い香りがします。今回は、インサイト(以下 Insights)についてご紹介します...
https://qiita.com/chisato-ygc/items/fc727faf72195029801c

ただ、今回は Insight では具体的なコスト増の要因が特定できなかったため、「誰が」CircleCI のジョブを多く走らせているのかを調査しました。

具体的な調査方法としては、CircleCI API v2 で pipeline の実行履歴を取得しました。(https://circleci.com/docs/api/v2/index.html#operation/listPipelines)

実行例 (過去の pipeline 実行履歴を一気に取得するコマンド):

for i in `seq 500`; do echo $i; curl -sH "Circle-Token: $CIRCLECI_API_TOKEN" "<https://circleci.com/api/v2/pipeline?org-slug=$ORG_SLUG&page-token=$>(jq -r .next_page_token pipeline-$((i - 1)).json)" > pipeline-$i.json; sleep 1; done

その上で、実行ユーザーをチーム (Squad) ごとにグルーピングして集計したグラフが下記です。

これを見ると、pipeline 実行が多い月は Bot による実行が多いことが判明しました。

Bot による実行を抑制する

Bot の内訳を見てみると、Renovate が 9 割以上を占めていました。

つまり、Renovate が大量に PR を生成したり、base branch の更新を取り込むために各 PR で rebase が実行されることが、CircleCI の費用増の要因であると推測しました。

とはいえ、Renovate はパッケージのバージョンアップ等のために価値が高い Bot であり、Renovate の利用自体はやめられません。

さらに詳細に調査していくと、以下のようなことが起きて Renovate が大量にリポジトリへ push していることがわかりました。

  • Renovate が大量に実行しているアップグレード対象のパッケージは npm
  • npm パッケージは automerge されるようになっている
  • automerge されるたびに open 状態の Renovate PR の lock file で衝突が起こる
  • 衝突が起こると Renovate は rebase をする

特に利用が急激に増加した月は、人の手による merge も大量に行われていることも要因のひとつでした。

そこで、以下の対策を実施しました。

  • 自動 rebase を無効化
    • 衝突が発生しても rebase させないことで、rebase の総量を減らす目的
  • automerge を無効化
    • automerge が有効化されていると、master が更新されるたびに rebase されるような挙動を確認していたため (Renovate の仕様としてこの挙動の認識が合っているかは未調査)

これらは開発生産性を落とす対策ではありますが、手動で rebase や merge を実施しても開発生産性を大きくは損なわないと考え、費用とのバランスでこの対策をとりました。

結果として、この対策を取り入れた以降は Bot での CircleCI 利用が減り、効果があることがわかりました。

Bot を抑制しても翌月以降もまだ費用が減らない

さて、ここまでで Bot での CircleCI 利用が減りました。

しかし、Bot を抑制できても、以下のようにそれまでの月よりも費用は増加していました。(最も右側の棒グラフは月途中で算出されたもののため、低く表示されています)

再掲ですが、チームごとの pipeline 実行数は下図のとおりで、DX Squad による実行が増加傾向にありました。

これに関しては、結論から書くと費用増を受け入れるという選択を取りました。

現在のウォンテッドリーでは、組織の拡大に伴いプロダクト開発も盛んとなっています。

特に DX Squad では CircleCI を利用しているリポジトリでの活動が盛んになっていました。ウォンテッドリーの開発組織では、細かく commit や push を積み重ねる文化もあり、それも CI の利用増の要因のひとつでした。

commit や push を粒度を細かくすることで、CI によるフィードバックもその分頻繁に受けられ、効率よく開発が進められます。そこで「CI の費用を減らすために commit や push の粒度を大きくしてほしい」という手もありますが、これは開発生産性を損なってしまいます。

そのため、ここは開発生産性に投資するべきであると判断し、費用増を受け入れるという選択をしました。

なお、テスト高速化などの CI のチューニングをするという手も考えられます。これに関しては挑戦を試みたのですが、CircleCI を利用しているリポジトリではすでにパッとできるようなチューニングは行われていました。

費用を抑えられるほど効果のあるチューニングをするには一筋縄ではいかないことがわかったため、今後長期的に対策していきたいと考えています。

最後に

CircleCI の利用が増えていることと、その対策について書きました。

この記事で伝えたかったことをまとめると、以下の通りです。

  • 原因を調査する上で CircleCI の API が活用できる
  • 利用状況をグラフで可視化すると、誰が見ても状況が理解しやすい
  • Bot の実行抑制も大切である
  • 時には費用増を受け入れることも必要

費用についての考え方や原因調査など、読者の皆さんの一助となれば幸いです。

Wantedly, Inc.では一緒に働く仲間を募集しています
5 いいね!
5 いいね!
今週のランキング
Wantedly, Inc.からお誘い
この話題に共感したら、メンバーと話してみませんか?