ホストを汚したくないので、どの言語で開発するにしても、最近はDocker
とかVirtualBox
とか、まあ仮想マシンの上でやってます。
今はPHP with Laravel on Docker
でやってます。もちろんホストにはnginx
はおろかPHP
さえ入ってません。
本題
の前の、ちょっとした背景
プロジェクト構成はだいたいこんな感じ。
Application
+base
|+Dockerfile
+dev
|+Dockerfile
+src
+ソースとか
baseコンテナになんやらかんやら、アプリケーションが動作するために必要なものを全て突っ込んで、それを元にdevコンテナを作るイメージ。
基本的にコンテナの中には入らず、ソースはDocker
に共有張って、ローカルで修正してる感じ。
理由は、ぶっちゃけ開発用コンテナの中にdotfilesを入れたくなかったから。
開発用と言いつつ、実際はPHP
とnginx
を動かすためだけの実行環境コンテナですね。
テストしたい
ホストにPHP
がないのでComposer
は動作しない。もちろんPHPUnit
も動かない。でもテストはしたい。
Jenkinsさんにご登場いただくとしても、やっぱりpushする前にテストぐらいはしたいですよね。
なので考えました。そうだ、リモートで実行すればいいんだ!
開発用コンテナにSSH
突っ込んで、ローカルからコンテナに向けてリモートでPHPUnit
を実行すれば、SSHクライアントさえあればホストに依存せずテストできる!
なので
こんな感じのshell用意しました。
#!/bin/bash
CONTAINER_NAME=webapp-dev
ip_address=$(docker inspect -f='{{ (index (index .NetworkSettings.Ports "22/tcp") 0).HostIp }}' ${CONTAINER_NAME})
port=$(docker inspect -f='{{ (index (index .NetworkSettings.Ports "22/tcp") 0).HostPort }}' ${CONTAINER_NAME})
user=webapp
ssh ${user}@${ip_address} -p ${port} "cd /app_root; $@"
やってることは単純で、アプリケーションルートに移動してコマンドを実行するだけ。
./command.sh composer update
とか、そんな感じで使います。PHP
に限らずなんでもできます。
さいごに
とりあえずこれで解決はできて、まあ何とかやってるわけですけど、なんかほかにいい案ないですか?(他力本願(誤用