github 上の nodejs アプリを自動更新する環境を作る

github 上にある nodejs アプリが更新されたら起動しているアプリを更新する仕組みを考える. ホットデプロイとか言うんですかね.仕組みの評価は行わずにとりあえず動くところまで.

使用ツール

流れ

  • github からの webhook を受ける
  • アプリのディレクトリで git pull
  • npm update してライブラリを更新
  • pm2 restart する

設定とか

ここでは nodejsapp というアプリを対象とし, /var/www/nodejsapp においてるものとする.

また github 側で webhook の URL が設定されているものとする.

大きな手順としては下記のように書いてる.

  1. pm2 のインストール
  2. pm2 を使ってアプリを起動
  3. gost のインストール
  4. gost の設定を記述
  5. gost を起動

pm2 のインストール

npm が入っていることが前提.

$ npm install -g pm2

pm2 を使ってアプリを起動

アプリのディレクトリに行き,下記のようなコマンドを実行してデーモン化する.

$ NODE_PATH=app pm2 start app.js -i 1

gost のインストール

go 言語がインストールされていることが前提.

$ go get github.com/mattn/gost

gost の設定を記述

config.json

{
        "addr": "127.0.0.1:8889",
        "apps": {
                "nodejsapp" : {
                        "path": "/var/www/nodejsapp",
                        "update_command": "git pull",
                        "build_command": "npm update",
                        "release_command": "pm2 restart all"
                }
        },
        "log": "gost.log"
}

gost の起動

ここでは簡単に nohup を使ってバックグラウンドで動き続けるようにしている.

$ nohup gost -c config.json &

以上で完了.

問題点とか

現状運用してみているところで思ってることを列挙.

  • nodejsapp のプロセスが死んだ時にどうしようもない
    • ここ のような仕組みのほうがいいかもしれない
  • pm2 reload all がたまに詰まる
    • ので pm2 restart all に変更した