質問: ### 悩んでいること Webアプリケーション開発でのフロントエンド、バックエンド、インフラのバージョン管理について、 どのようにリポジトリを分けるのがいいのか。 ### 質問内容 現状、フロントエンド、バックエンドがそれぞれ独立したリポジトリで各リポジトリにVagrant、Ansibleを利用したローカルの開発環境を含めています。 今後本番環境を構築する際に今のリポジトリ構成のまま、各リポジトリに本番環境構築用のAnsibleのplaybookを作って管理するのがいいのか、 環境構築用のリポジトリを1つ新しく作って、VagrantやAnsibleなどの環境構築に関わるファイルはそこにまとめるのか、 どちらがいいでしょうか? フロントエンド、バックエンドのそれぞれに環境構築ファイルを含めると、クローンしてきて`vagrant up`するだけでローカルの開発環境が構築されるのであまり知識がない人にとっては比較的使いやすいかな、と思います。 ですが、環境構築に関わるファイルがリポジトリ間で分断されるので、インフラに関わる改修をする時はコミットがばらけたりして管理が煩雑になりそうです。 環境構築用のリポジトリを作った場合は環境構築に関わるコミットはひとつのリポジトリでまとめられるので管理はしやすいですが、 まず環境構築用のリポジトリをクローンしてきて、そのリポジトリ内のWebサーバのドキュメントルートとして扱われる共有フォルダにフロントエンド、バックエンドのリポジトリをsubmoduleなどで引っ張ってくる必要があるため、Gitに対してあまり知識がない人(デザイナーさんなど)には敷居が高いかな、と思いました。 私自身、一人や少人数で開発してきた経験しかなく、こういったところの効率的な管理方法を見極めれていない状態です。 これに関しては個人や職場の環境などで様々な方針があるため、明確な答えは出ないとは思いますが、皆様がどのように管理しているかなどをご教授頂ければ幸いです。 文字だらけの質問で恐縮ですが、よろしくお願いします。
回答: Ansibleのplaybookファイルそのものは仕様書としても機能するのでプロジェクトに内包されている方が美しいでしょう。 > > 環境構築用のリポジトリを1つ新しく作って > > > これはありだと思います。 しかし、上記の理由からPlaybookの全てをそちらのリポジトリへ運ぶべきではないでしょう。 フロント、バック両方のPlaybookは、依存しているモジュールのみを入れるシンプルなものだけ残しておき、 環境構築用のリポジトリには両方のマシンを同居させる場合の解決部分を記述した後、それぞれのPlaybookをインクルードしてくる設計にすると良さそうです。 環境構築用のリポジトリはこんな感じのフォルダが一例として考えられます。 ``` $ find . -type d ./machines ./machines/front-only # この中にVagrantfileが一つはいっている ./machines/back-only # この中にVagrantfileが一つはいっている ./machines/both # この中にVagrantfileが一つはいっている ./provision # この中にPlaybook等が詰まっている ``` 「運用時には全てのリポジトリは同階層に存在しているべし」のような運用ルールを設ける必要はありそうです。 Vagrantfileの3階層上にはフロントとバックのリポジトリがあると保証出来るのであれば それぞれVagrantのsynced_folder機能で仮想マシン内とリンクした上で、プロビジョン時にそれぞれのPlaybookをインストールしてきて解決することが可能です。 別方面からの解決策として、 Vagrant+AnsibleではなくDockerに移行することが考えられます。 これで各々のプロジェクトに入っているPlaybook君達はお役御免になりプロジェクト内がスッキリします。 (その代わりにDockerfileがプロジェクト内に居座るわけですが...) 外部の環境構築用のマシンもAnsibleでDockerとdocker-composeファイルを入れればOKという風になり、 Vagrantfileも1個になり非常にスッキリするでしょう。