ncコマンドとは
ncはnetcatの略で、TCP,UDPの生パケットを読み書きするコマンドである。
例えば、netcatでHTTPのリクエストを発行するにはecho “GET / HTTP/1.0\n”
とHTTPのリクエストをncコマンドにリダイレクトすることで実行できる
ncコマンドはクライアント側だけでなく、-l
オプションでTCPサーバとして実行することができるのでここではこれを用いる
webhookとは
Webhookは異なるサービス間でアプリケーションの更新情報などをリアルタイムで提供する概念である。
例えば、GitHubにはリポジトリにpushされたときに、指定したWebhook URLにHTTP POSTリクエストを送ってくれる機能などがある。
GitHubにpushされた時に自動でデプロイする
nc -l
はリクエストを受けた時にリクエストを標準出力しexitするため、nc -lに続けてコマンドを書くことで、リクエストを受けたタイミングでコマンドを実行することができる。
これを使って、
nc -l 8080 && git pull origin master && docker-compose down && docker-compose up -d —build
という風に実行すると8080番ポートにhttpのリクエストが来ると最新のコミットを取得し、再起動することができる。
あとは8080に対するURLをGitHubリポジトリのWebhookに追加すれば自動デプロイが完成する。
masterブランチだけ自動デプロイしたい
Masterブランチだけデプロイしたい場合は少し手順が面倒になる。nc -l
が標準出力する内容は生のTCPなのでHTTP HeaderとHTTP Bodyが改行で区切られているだけのものが出力される
そのため、HTTP HeaderとHTTP Bodyを分割し、HTTP Bodyをjqでパース(GitHubから送られてくるBodyはJSONなため)、ブランチ名を取得してmasterかどうか判断する必要がある。