これは3/18に開催された、ROXX社内LT大会の資料です。
概要
今回は下記の内容を紹介します
back checkのリポジトリの状況
backcheckには下記の4つのリポジトリが存在しています
- LP
- LPのフロントエンドが実装されている
- Nuxt.js製
- admin
- 管理画面のフロントエンドが実装されている
- Nuxt.js製
- front
- ユーザが使う画面が実装されている
- Nuxt.js製
- API
- back checkが使うすべてのAPIが実装されてる
- Laravel製
プレビュー環境に求められる要件
上記の様に、それぞれが別のリポジトリで実装されているため、下記のケースを想定したレビュー環境が必要となりました
また、それ以外にプレビュー環境として、下記の要件を満たす必要がありました
- プレビュー環境同士は完全に独立していること
- 新規機能も多いためDBスキーマの変更にも耐えられるよう、DBも独立していること
- githubのChatOpsでできること
- Auth0と連携ができること
- 環境作成時に、callbackURLなどが自動的に反映されること
- https化されていること
- PRがクローズされたら、自動で環境が削除されること
- k8sとかの知識は不要で、AWS上で動くこと
- リソースの上限とかはあんまり気にしたくない
参考にしたOSS
色々と探していたら、下記のOSS(というかプレゼン用に作ったと思われるなにか)が見つかった
https://github.com/clareliguori/clare-bot
clare-botというボットに対して、 preview this
とメンションするだけで、プレビュー環境を作ってくれるというもの。使用している技術スタックも
Built with GitHub APIs, AWS Fargate, AWS CodeBuild, Amazon ECR, and AWS CloudFormation
とのことで、実装も簡単そうだったのでこれを使うことにした。
一方これだけでは最初の要件(マルチリポでよしなに使える)が適応できないため、ソースコードをいじる必要があった
実際の機能の使い方
- GitHub上でプルリクエストを作成します。
- プルリクエスト上で「
@roxx-bot preview this
」とコメントします。 - roxx-botさんがちょこちょことコメントを残していきます。(最長で30秒ほどかかります)
- しばらく経つとそのプルリクエスト(=base branch)のコードが反映された環境が立ち上がり、URLが表示されます。
backcheckの環境は1リポジトリでは完結しないので、もう一方の環境を立ち上げます。
つまり、apiのプルリクエストであればfrontを、frontのプルリクエストであればapiのプレビュー環境を立ち上げます。
- 「
@roxx-bot preview front
」または「@roxx-bot preview front
」とコメントします。
- 「
しばらく経つとそのプルリクエスト(=base branch)のコードが反映された環境が立ち上がり、URLが表示されます。
- URLのリンクを踏むとプレビュー環境を見ることができます。
preview XXX のあとに、githubのPRのURLを貼り付けることによって、そのPRで立ち上がっているURLを、環境変数に適応できるため、複数PRにまたがる施策でも問題なくアプリケーションが動くようになります。
具体的な実装
立ち上げ時
bot側
- 10秒ごとに自分宛てのメンションが来ているかの監視
- メンションが来ていたら、コメントの中身を解析し、環境立ち上げの関数を実行
- 環境用のユニークIDを発行(これが環境立ち上げ時のURLのサブドメインにもなる)
- Auth0にcallback URLなどを追加
- 対象リポジトリにあるbuildspec.ymlをもとにCodeBuildを開始
- CodeBuildからCloudFormation用のymlが出力されるので、それをもとに対象環境を立ち上げ
- 立ち上げ後、成功したらGitHubのコメントにURL付きで通知
各リポジトリ側
- bot側から渡ってくる各種環境変数を変換し、必要に応じてdocker buildするときに使う
- gitのコミットハッシュをdocker tagとしコミット→ECRにpush
- 生成したイメージのタグ等を用い、CDKを実行(以下CDKの実装内容)
- 環境変数の中で、ECSの実行時に使うものだけを抽出し、環境変数化
- APIの場合はapiとmysqlを立ち上げ、フロント系の場合はnuxt generateしたものをnginxで静的ファイルとして参照する
cleanup時(bot側のみ)
課題は解決したのか
課題 | 結果 | コメント |
---|---|---|
他の環境に依存しない環境を立ち上げられたか | ○ | AWSのフルマネージドな環境なので、無意識に無限に増やせる |
Auth0との連携はできたか | ○ | botをTypeScriptで書いてるので柔軟性が高くそれほど困らずに作れた |
複数リポジトリのPRにまたがる環境を作れたか | △ | 一応作れたが、こういうのを作るためにモノレポ化はしたほうがいいなと改めて認識 |
デプロイの速度 | △ | docker cacheとか色々挟んだが、どうしても時間はかかってしまう。何故かECSのタスクをアップデートするときに、過去のタスクが削除されるまでの時間が長く、トータルの時間が長くなってしまっている |
DBの独立性 | ○ | backcheckはシーダーがいい感じに整っているので、特に問題なく環境構築はできた |