🚚

マルチレポからモノレポへの移行を経験して感じたこと

2022/04/21に公開

プロダクト開発初期においては、いわゆるマルチレポ構成で、API と Web、API ドキュメント等で、レポジトリを分割していました。
しかし、様々な問題を感じ、マルチレポからモノレポへの移行作業を行いました。

マルチレポの選定理由

権限の分離

GitHub Teams を活用していたため、それぞれの権限を分ける目的でした。
例えば、Web 担当のエンジニアにとって、API は対象外なので、Web に Write 権限、API に Read 権限を与えるという運用でした。

これは、実際に開発を担当するのが、業務委託のエンジニアだったこともありました。
インハウスのエンジニアであれば、むしろ Web 担当であっても API に関心を持ってほしいので、モノレポの方が良かったです。

無駄な merge の発生を防ぐ

常に PR を最新に保つには、main ブランチから PR のブランチにマージする必要がありました。
その時、関係の無い API 側の変更が main に取り込まれたタイミングで、Web 関係の PR を更新することに違和感を感じていました。

マルチレポの限界

同一の各種設定やファイルがシェアできない問題

GitHub Actions では、actionlint 等は内容も全く同じですが、それぞれのレポジトリに作成する必要がありました。
また、Branch Protection Rules も変更がある度に適宜両方を更新する必要があり、Required Status checks を逐一確認して追加していくのも大変でした。
PR Templates 等も内容は同じでも、状況に応じて変更が適宜発生するため、同じ変更をそれぞれのレポジトリを移動して適用していく必要がありました。

これらは、モノレポであれば解決できていたなと感じていた問題点でした。

お互いの進捗把握

デイリースクラムで確認はしていても、どうしても自分の担当しているレポジトリしか頻繁に確認しないため、リアルタイムでの状況把握ができていない状態でした。

API の実装がどれくらい進んでいるのか、一旦モックで進めなければいけないのか、等の確認が必要でした。

モノレポであれば、PR 欄は逐次確認するため、状況の共有がスムーズに行えていました。

モノレポへの移行

開発が行われていない、土日をフルに使って全てのレポジトリを移行しました。

その時、コミット履歴が消えてしまうのは悲しいので、以下の記事を参考にしながら、消えてしまわないように細心の注意を払いながら移行作業をしました。

https://thoughts.t37.net/merging-2-different-git-repositories-without-losing-your-history-de7a06bba804

ただ単に移行はできないので、共通のファイルは削除したり、ディレクトリ階層が 1 つ落ちるため、全ての GitHub Actions に対して working-directory を付ける作業をしました。
Production へのデプロイを行う Actions もあったので、ミスしていないか何度もチェックしました。

移行完了後は、マルチレポで感じていた問題点を全て解決できました。

モノレポで感じた問題点

Environments の異常発生

Web の Production や、API ドキュメント、管理画面に、etc. と、モノレポにした影響で Environments が大量発生しました。

Environments

元々マルチレポでは、Environments 欄を見て管理をしていましたが、そこには最大 3 つしか表示されないため、諦めて commit 一覧ページから CI のステータスを確認するしかなくなりました。

GitHub Actions の異常発生

ls .github/workflows | wc -l
      32

なるべく纏めようとはしたのですが、やっぱりどうしても異常発生しました。

対象が同じでも、発火条件が違うとファイルを分ける必要があるのが、ファイル数を増やした一因だと思います。

変更がある場合は、ひたすら見逃しが無いか何度もチェックすることで解決していました。

GitHub Actions の無駄な実行

移行初期は、バックエンドのみの変更に対して、フロントエンドの Cypress テストが走るというカオスな状態でした。

以下の記事の方法で解決はしましたが、上記のファイル数に適用していくのは大変でした。

https://zenn.dev/matken/articles/avoid-redundant-github-actions-monorepo

最後に

今回のプロダクトでは使用していませんでしたが、モノレポであれば、各種定義を同一言語の実装間で共有できる点も良いと思っていました。
あまりやりすぎると良くないですが、マイクロサービスの共通部分切り出しもモノレポであればスムーズにできます。

そういった将来性を鑑みると、色々と問題点はありましたが、やっぱり同一プロジェクトのものはモノレポにする方が見通しが良く、移行して良かったと思っています。

逆に ESLint 設定のように、会社全体として統一して、プロジェクトを跨ぐものやプロジェクトに依存しないものは、別のレポジトリとして管理する方が綺麗かと思います。

https://zenn.dev/matken/articles/share-eslint-configs-companywide

会社での運用の好みが色々とあると思うので、最終的には自分達に合った運用方法を選択することをおすすめします。

こちらの記事が参考になれば幸いです。

GitHubで編集を提案

Discussion