第一話: tmuxとの出会い
その昔、一人の開発者がおった。
仕事中はずっとターミナル操作をしていて、
あるタブでは docker-compose up
別のタブでは npm run dev
また別のタブでは vim xxx/xxx.rb
みたいな作業をしておったそうだ。
そのうちdocker-compose upで流れてくるログを見つつ、
同時にvimで修正したい願望が出てきた。
彼はタブ移動が面倒になったのだ。
何か策はないかと探していると、彼はtmuxというツールと出会った。
なんと、ターミナルのタブ一つの中で画面を分割できるではないか。 -> ペイン分割
彼はタブ移動することなく、ログを見つつコード修正できるようになったそう。
めでたしめでたし。
第二話: ssh
彼はインフラエンジニア。
いつも通りサーバにsshで接続してターミナル操作を行なっていると、
とあるコマンドを実行中に別のコマンドを実行したいと思うようになった。
彼はもう一つタブを開こうとした時、tmuxを思い出した。
同じタブの中で操作できるぞ!
そう思うとtmuxを起動し、ペイン分割をして二つのペインから
「ssh xxx@xxx」と入力しようとしたとき彼は思った。
サーバの中でtmux使ったらいいんじゃね?
そう。
彼はサーバ上でtmuxをインストールし、その中でtmuxを起動、ペイン分割を行った。
ペインごとに「ssh xxx@xxx」というコマンドを打つ必要がなくなったのだ。
業務終了のチャイムが鳴ったので、サーバ上にtmuxのセッションを残し、作業を終えた。
翌朝、彼は再度サーバに接続して「tmux attach」と打つと、昨日と全く同じ光景が再現されていた。
彼はまるで昨日の作業終了時からワープしてきたかのように、スムーズに続きの作業に取り掛かった。
第三話: 開発環境 as Code
tmuxで作業が便利になったものの、PCを落とすときはtmuxのセッションが切れてしまう。
彼はそのたびにtmux起動からペイン分割し、自分好みの構成にするセットアップすることが面倒になっていた。
以前より便利になっているはずなのに。
怠惰はプログラマの美徳。
こんな面倒なことはしたくないという欲求こそが文明を発展させる礎だ。
怠けたいがためにtmuxの仕様を読みまくった。
その結果、ペイン分割や構成のセットアップを自動化できる方法に辿り着いた。
#!/bin/sh
tmux new-session -d
# apiサーバを起動しつつ、別のペインで同じディレクトリまで移動
tmux split-window -v
tmux send-keys -t 0 "cd ~/サーバサイドのディレクトリ/ && docker-compose up" C-m
tmux send-keys -t 1 "cd ~/サーバサイドのディレクトリ/" C-m
# フロントエンドでの作業用に新しくウインドウを作成
tmux new-window
# nodejsを起動しつつ、別のペインで同じディレクトリまで移動
tmux split-window -v
tmux send-keys -t 0 "cd ~/フロントエンドの作業ディレクトリ/front/ && npm run dev" C-m
tmux send-keys -t 1 "cd ~/フロントエンドの作業ディレクトリ/" C-m
# myql接続用に新しくウインドウを作成
tmux new-window
# dockerのmysqlコンテナが立ち上がるまで10秒くらい待機してからmysql接続
tmux send-keys -t 0 "sleep 10 && mysql -u root -h 127.0.0.1" C-m
tmux select-window -t 0
tmux select-pane -t 1
tmux attach
彼は、このスクリプトを叩くだけで
サーバサイドとフロントエンドのコードベース上でターミナル操作をすること、
そしてmysqlコマンドをいつでも打てる状態を再現できたのだ。
「開発環境 as Code」の完成だ
第四話:複数プロジェクト
開発環境 as Codeでいつでも開発環境を再現できるようになった。
しかし、プロジェクトが違えばペインの構成等も変わるだろう。
とある日、彼は快適に仕事しようとtmuxを起動したら
別プロジェクトのメンバーから緊急事態が告げられた。
「不具合です!」
まじかよと思いつつ、
せっかくdocker-compose upとかして構築した開発環境を全て破棄していった。
こんな状況下でさえ彼は思った。
「面倒くせえ」
別プロジェクトのtmuxを起動し、原因調査しようとしたその時、
「不具合じゃなかったです!」
と告げられた。
彼は激怒した。
その怒りはtmuxの仕様をさらに理解する方向へ向けられ、解消することができた。
そう。tmuxは世界を独立できるのだ。 -> tmuxセッション
プロジェクトAのセッションとプロジェクトBのセッションは、同時に存在可能なのだ。
セッションを切り替えるだけで作業のコンテキストスイッチ
が可能となる。
最終話: 複数プロジェクト同時開発の限界
いくらtmuxセッションで複数のプロジェクトを同時に起動できるといっても被ってしまうものがある。
ポートだ。
80番だったり3000番だったり、mysqlなら3306だったり。
こればっかりは、プロジェクトごとに調整するしかない。
docker-compose.ymlでポート指定を
ports:
- "3001:3000"
などして、微妙に番号が被らないようにするという対処をするしかなさそうだ。