こんにちは。
メディアサービス開発部Webアプリケーション開発課の中野です。
読書メーターのインフラおよびバックエンドシステムを担当しています。
本記事では読書メーターのデプロイの流れについて紹介いたします。
読書メーターについて
読書メーターは、2008年5月に開設された日本最大級の読書コミュニティサイトです。
単純な読書記録や感想投稿に留まらず、ユーザ間で交流ができることが特徴的な点です。
読書メーターのインフラ構成
以前、弊社のフサギコ(髙﨑)が読書メーターのインフラ構成について紹介いたしました。
読書メーターは下記の6つのコンポーネントから構成されています。
- フロントエンドサーバ群
- Webフロントエンド(Ruby on Rails)
- スマートフォンアプリ向けAPI(Ruby on Rails)
- 管理画面(Ruby on Rails)
- バックエンドサーバ群
- バックエンド(Scala, Play framework)
- サブバックエンド(Ruby, Grape)
- 旧環境(PHP)
上記記事からコンポーネントの構成は変わっていません。
しかし、旧環境(PHP)以外の実行環境に関しては、全てecspressoでデプロイしECS(Fargate)で実行する仕組みに変わりました。
コード管理とブランチ戦略について
読書メーターチームではGitHubでコード管理を行っています。
また、現在1日に数回程度の頻度でデプロイを行うため、ブランチ戦略としてGitHub Flowを採用しています。
デプロイシステム構成について
読書メーターにおけるデプロイの流れとしては以下のようになっています。
- Pull Requestをmasterブランチにmerge
- GitHub Actionsで「リリース準備」アクションを実行するとGitHubのレポジトリにtag pushされる
- tag pushにhookし、CircleCIがイメージを作成してAmazonECRにpushする
- CircleCIがescpressoを利用して開発環境のECS(Fargate)にデプロイする
- CircleCIがSlackで開発環境にデプロイされたことを通知する
- 開発環境で動作確認し、問題なければCircleCI上で本番環境へのデプロイ承認ボタン*1を押す
- CircleCIがescpressoを利用して本番環境のECS(Fargate)にデプロイする
- CircleCIがSlackで本番環境にデプロイされたことを通知する
これをフロー図としてまとめると以下のようになります。
Github ActionsとCircleCIを併用している理由としては2点あり、1点目は課としてCircleCIをGitHub Actionsより先に導入していたためtag push周り以外はそのまま設定を流用できた事、2点目は、GitHubのプランがTeamプランな都合上、GitHub Actionsでデプロイの承認待ちを実現するGitHub Environmentsの機能が利用できなかったことが挙げられます。
現在エンジニア3人体制で開発を行っていますが、このデプロイフローでデプロイにかかる時間は1回あたり平均16.7分で、デプロイ回数は週平均5回程度行えています。
まとめ
この記事では現在の読書メーターのデプロイの流れについて概観しました。
ブックウォーカーでは物理・電子・Web連載問わず漫画や本が好き、あるいは長年運用されてきたWebサービスを紐解き、より良い形に作り替えていくことに興味があるWebアプリケーションエンジニアを募集しています。
もし興味がありましたらぜひ、ブックウォーカーの採用情報ページからご応募ください。
*1:承認待ちの仕組みはcircleci/slack orbの機能を利用しています。