Timee Product Team Blog

タイミー開発者ブログ

モノリスRailsにマージキューを導入してデプロイフローを安定させる

こんにちは、タイミーでバックエンドのテックリードをしている新谷 (@euglena1215) です。

タイミーのバックエンドは、多くの開発者が関わるモノリスなRailsアプリケーションを中心に構成されています。本記事では、このモノリスリポジトリのデプロイフローを安定させるためにGitHubのマージキューを導入した事例を紹介します。

本記事が、masterブランチにマージしたコードでCIが頻繁に失敗し、開発プロセスに影響が出ているチームの参考になれば幸いです。

masterブランチのCIが頻繁に失敗していた

タイミーのモノリスRailsリポジトリでは、1日に20件以上のPull Requestがマージされることもあります。多くの開発者が同時に開発を進める中で、ある問題が頻発していました。

それは「他の人の変更がmasterブランチに取り込まれたことに気付かず、古いmasterを元にしたPull Requestをマージしてしまい、結果的にmasterブランチでCIが失敗する」という事象です。

masterブランチでCIが失敗する図

この事象により、開発チームに次のような影響が出ていました。

  • リリース遅延
    • masterが一度CIに失敗すると、原因の特定と修正(Revertなど)が終わるまで、誰もデプロイできなくなります。これにより、ユーザーに届けたい価値をタイムリーに届けられない事態が発生していました。
  • コンテキストスイッチとコミュニケーションコストの増大
    • masterのCI失敗は、Slackでの全体周知、原因調査の依頼、マージの一時停止呼びかけなど、多くの開発者を巻き込むコミュニケーションを発生させ、チーム全体の生産性を低下させていました。

実際に、2025年のある2ヶ月間を調査したところ、masterブランチでのCI失敗のうち、最新のmasterを取り込んでいれば防げた可能性が高いものは6件ありました。この課題を解決するため、我々は解決策の検討を開始しました。

なぜ「マージキュー」だったのか?

この問題を解決するにあたり、我々はGitHubマージキューを選択しました。その背景をご説明します。

まず、解決策として考えられる「すべてのPull Requestは、マージ直前に必ず手動で最新のmasterを取り込む」というルール運用は、1日に20件以上もマージされるリポジトリでは現実的ではありませんでした。CIの待ち時間や再レビューのコストを考えると、開発速度の低下は避けられないと判断しました。

一方で、タイミーでは既にGitHub Enterprise Cloudを導入済みでした。そのため、マージキューは追加コストや新たなセキュリティレビューなしに利用できる機能でした。

既存のプラットフォームの機能を活用することは、我々にとって合理的な判断でした。そのため、他のサードパーティツールを比較検討することはせず、マージキューの導入にフォーカスして調査を進めることにしました。

解決策:GitHubマージキューとは?

GitHubのマージキューを改めて説明すると「masterブランチにマージされる前に、最新のmasterと合体させた状態でCIを実行し、成功したものだけを自動でマージする仕組み」です。

開発者がPull Requestをマージキューに追加すると、GitHubは内部的に一時的なブランチを作成し、その時点での最新のmasterとPRの変更をマージしてCIを実行します。CIが成功すれば、その変更がmasterにマージされる、という仕組みです。

【重要】GitHub Enterprise Cloudが前提
繰り返しになりますが、GitHubのマージキューはprivateリポジトリで利用する場合、GitHub TeamsプランではなくGitHub Enterprise Cloudプランの契約が必要となります。

詳しくは公式ドキュメントをご覧ください。

docs.github.com

まとめ

GitHubマージキューを導入したことで、課題であった「古いmasterとの競合によるCI失敗」はなくなり、masterブランチがCIの成功した状態を維持できるようになりました。

この結果は、ただ機能を有効化しただけで得られたものではありません。私たちは、本格導入に先立ち、マージキューをテスト環境で検証しました。その結果、ただ有効化するだけでは我々の開発フローとの互換性を保つのが難しく、いくつかのチューニングが必要なポイントが明らかになりました。

これらのポイントに事前に対処したことが、スムーズな導入の鍵となりました。

次回の記事では、この導入を成功に導いた、具体的な検証内容と、それに基づいて我々が実装したチューニング方法(GitHub Actionsのワークフロー設定など)について、詳しく解説していきたいと思います。

tech.timee.co.jp

tech.timee.co.jp

tech.timee.co.jp

tech.timee.co.jp

tech.timee.co.jp

tech.timee.co.jp