tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
はじめに
当社のRailsシステム間連携では、各システムで公開しているWeb APIを使っています。
今までは各システムを bin/rails s
で起動し、開発を行ってきました。
ただ、 連携するシステムが増えたり、各システムで使うジョブワーカーが増えたりした結果、現在では各システムを起動する手間が増えてきました。
そこで、今後も効率的に開発できるよう、以下の設定を行いました。
tmux
+overmind
にて、連携する各システムやワーカーを1つのコマンドで起動できるようにしたRubyMine
にて、overmind
で起動したプロセスにアタッチし、デバッグできるようにした
この記事では、複数システムを1コマンドで起動できるようにするために、 tmux
+ overmind
+ RubyMine
にてどのような設定をしたか、チュートリアル形式で共有します。
前提となる環境について
システム全体の構成について
このチュートリアルでは、以下のシステム構成とします。
mac上で、2つのRailsシステム(
frontend_app
とbackend_app
)を開発しているfrontend_app
について外部からのHTTPリクエストを受け付ける
Delayed::Job
でジョブを管理しているbin/rails jobs:work
にて Delayed::Job Worker を起動する
各Railsシステムは、ローカルマシン上での
bin/rails s
実行により起動する各Railsシステムは、データベースを適切に設定している
ディレクトリ構成について
次の図のように、overmind
ディレクトリの中に frontend_app
と backend_app
という2つのRailsシステムのリポジトリがあるものとします。
用語について
tmuxとは
terminal multiplexer
と呼ばれるソフトウェアのうちの1つです。
1つのターミナルの画面を、複数に分割して利用します。
overmindとは
Procfile
ベースのプロセスマネージャーです (Githubリポジトリ)。
Herokuで使う Procfile
と同じ書式で定義することで、定義したプロセスを管理できます。
参考: The Procfile | Heroku Dev Center
チュートリアル
tmux + overmind でシステム全体を起動できるようにする
tmux + overmind をセットアップする
overmindのREADMEに従い、 tmux
と overmind
をインストールします。
tmuxの設定を行う
tmux
はデフォルト設定のままでも問題なく使えます。
ただ、慣れないうちはマウス操作はできたほうが便利なため、 tmux
の設定を追加します。
~/.tmux.conf
ファイルを追加し、以下を記載します。
Procfileを作成する
チュートリアルのルートディレクトリである overmind
に、ファイル Procfile
を作成します。
Procfile
には、各Railsシステムやジョブワーカーを起動する時のコマンドを記載します。
なお、ワーキングディレクトリを考慮するため、 &&
を使ってコマンドをチェーンしています。
参考:foreman - Procfile start processes in their own working directory - Stack Overflow
tmuxにてovermindを起動する
macのターミナルから tmux
を起動します。
次に、 Procfile
のあるディレクトリに移動し、overmind
にて各プロセスを起動します。
tmux
の画面では、 Procfile
で定義した各プロセスの様子が表示されています。
動作確認
外部からのHTTPリクエストを受け付ける frontend_app
に対し、 curl
でアクセスします。
すると、 frontend_app
からJSONレスポンスが返ってきます。
tmux
を見ると、各システムやジョブワーカーが連携し、JSONレスポンスを返したことが分かります。
動作確認ができたため、いったん Ctrl + C
にて overmind
での実行を停止します。
1つのプロセスをtmuxの別ペインで表示する
現在はtmuxの1つのペインに、 Procfile
で起動したすべてのプロセスのログが表示されています。
ただ、この状態のままでは各プロセスのログを追いづらいです。
そこで、別ペインで表示するよう設定します。
このチュートリアルでは、ウィンドウを上下ペインに分けます。
上ペインはここまで通り overmind
のログを表示します。
一方、下ペインでは backend_app
のログのみを表示するようにします。
別ペインで表示するための準備
以下の準備を行います。
tmuxで
Ctrl + b
+"
を入力し、水平ペインを開く上ペインにて、以下の操作を行う
overmind s
を実行し、各システム・ワーカーを起動する
下ペインにて、以下の操作を行う
Procfile
のあるディレクトリに移動するovermind connect backend_app
を実行し、overmindで実行しているbackend_app
のプロセスに接続する
動作確認
再びcurlで frontend_app
にアクセスしてみます。
すると、上ペインでは、各システム・ワーカーのログが出力されています。
一方、矢印部分の下ペインでは、 backend_app
のログのみ表示されています。
RubyMineにて、overmindで起動したプロセスのデバッグを行う
今までの操作にて、各システム・ワーカーを overmind s
だけで起動できるようになりました。
ただ、何か不具合があった時には、各システムをデバッグしたくなるかもしれません。
もしRubyMineを使っている場合は、 overmind
で起動したプロセスにアタッチ・デバッグできます。
参考: Attach to process | RubyMine
このチュートリアルでは、RubyMineを使って backend_app
のプロセスにアタッチしてみます。
RubyMineでの設定
以下の順番で設定を行います。
RubyMineにて、プロセスにアタッチしたいシステムのリポジトリを開く
このチュートリアルでは
backend_app
リポジトリを開きます。
RubyMineのメニューにて、
Run > Attach to Process
を選択する実行しているプロセスが表示されるため、
backend_app
のプロセスを選択する下部のイメージ参照
RubyMineでブレークポイントを設定する
以上で、デバッグの準備が整いました。
動作確認
curlで frontend_app
にアクセスしてみます。
すると、RubyMineで設定したブレークポイントで停止します。
実行時の各変数の内容も表示され、デバッグできていることが分かります。
まとめ
tmux
+ overmind
を利用して、連携する一連のシステムやワーカーを起動できるようにしたことにより、より開発を効率的に行うことができるようになりました。
今後も開発を効率的に行う方法をTechBookにて共有していこうと思います。
本サイトの更新情報は、Twitterの株式会社プレセナ・ストラテジック・パートナーズエンジニア公式で発信しています。ご確認ください。
最終更新