プロダクト用のモノレポがあって、そこにはそのプロダクト用の複数のサービスのコードが入っている。
トランクベースの開発スタイルを採用しているので、短寿命の小さなプルリクエストを作って、それをマージするとデプロイされるようにしている。とは言ってもデプロイ先は開発環境。
このプロダクトには開発環境と本番環境があるので、どうやってトランクベース開発でmainを最新に保ちつつ複数環境へのデプロイをコントロールしようかな?と少し悩んだ。
環境ごとのブランチを作る運用は、フローが複雑になってしまうので、できればやりたくない。また、コンテナイメージのビルドは一度だけにして、開発環境から本番環境へプロモーションして使いたい。
そんなことを考えて次のようなワークフローを構築した。わりと気に入っている。
モノレポのmainブランチに変更をマージすると、コンテナイメージがビルドされてECRにプッシュされる。変更が入ったサービスだけビルドされるように設定している。
ECRへのプッシュが終わると、デプロイメント設定用のリポジトリに、開発環境へのデプロイのためのプルリクエストが作成されてmainブランチへ自動でマージされる。
こんな流れで、モノレポでプルリクエストをマージすると変更が入ったサービスが開発環境へ自動的にデプロイされる仕組みになっている。
ちょっと触れたように、プロダクトのコードはモノレポで管理しているが、デプロイの設定は別のリポジトリで管理している。そこにはECSの設定などが入っている。
開発環境で動作確認をして問題ないことが確認できたら、本番環境へのデプロイを行うので、デプロイ設定用リポジトリのワークフローを手動でポチッと実行する。
すると、開発環境で確認したコンテナイメージを本番環境へプロモーションするためのプルリクエストが作成される。それをmainにマージすると本番環境で新しいバージョンのサービスが動き始める。
どちらのリポジトリもmainブランチを中心にして運用していて、環境別のブランチは作っていない。
こんな感じにしている。ちゃんと説明を書こうと思うと気合い入れて書かなきゃなので、こちらでゆるく書いてみた。