Ruby
PHP
ShellScript
Git
capistrano

スタートアップの最小最速デプロイツール

2017年にもなりますと、さすがにFFFTP(ぇ)やSCPで更新したファイル群のみをアップロードするシステムも絶滅寸前だとは思いますが、そうは言ってもヒットするかどうかも分からないスタートアップではインフラや運用周りは後回しになりがちですするべきです。

世の中には、Ruby製のCapistranoやPHP製のDeployerなど、様々なデプロイツールがありますが、スタートアップに適した、シンプルで学習コストが低く、でも、プロジェクトを丸ごとデプロイしてシンボリックリンクでアトミックに切り替えてくれるツールって意外とないのではないでしょうか(みつけられないだけ?)

「gitと連携なんてしなくない」「なんでツール入れる為にまた違うツールをインストールしなければいけないのツール地獄問題(最近多いですねぇ)」とか不満の声がこの瞬間にも聞こえてきます。

なので、シェルスクリプトで作って運用しているものを公開させて頂きます。

#!/bin/sh

# your setting
SSH_HOSTNAME=www.example.com
SSH_USERNAME=username
PROJECT=projectname
APP_ROOT=/var/www/${PROJECT}
DEPLOY_DST_DIR=/var/www/
LIMIT=30
# your setting

FILE_PREFIX=${PROJECT}__
VERSION=`date +'%Y%m%d-%H%M%S'`

cd ${APP_ROOT}/.. &&
tar zcf /tmp/${PROJECT}.tar.gz $PROJECT &&
scp /tmp/${PROJECT}.tar.gz ${SSH_HOSTNAME}:/tmp &&
ssh ${SSH_USERNAME}@$SSH_HOSTNAME "cd /tmp && tar zxvf ${PROJECT}.tar.gz && mv $PROJECT $DEPLOY_DST_DIR$FILE_PREFIX$VERSION && ln -fsn $DEPLOY_DST_DIR$FILE_PREFIX$VERSION $APP_ROOT"

CNT=`ssh ${SSH_USERNAME}@$SSH_HOSTNAME "cd $DEPLOY_DST_DIR && ls -d ${FILE_PREFIX}* | wc -l"`

if test "$CNT" -ge $LIMIT ; then
    RM_NUM=`expr $CNT - $LIMIT`
    ssh $SSH_HOSTNAME "cd $DEPLOY_DST_DIR && ls -d ${FILE_PREFIX}* | sort | head -n $RM_NUM | xargs rm -rf "
fi

開発機上で実行します。
設定項目は「your setting」の箇所のみです。

SSH_HOSTNAME=デプロイ先ホスト名
SSH_USERNAME=デプロイ先ユーザ名
PROJECT=プロジェクトディレクトリ名
APP_ROOT=開発機でのデプロイ対象パス
DEPLOY_DST_DIR=デプロイ先ディレクトリ名
LIMIT=デプロイ先で何世代残すか

以下、デプロイ先の状況です。最新のものにシンボリックが貼られ、それ以外のものは指定分バックアップとして残されます。
※Apacheであれば『Options FollowSymLinks』の設定をするなりしてあげて下さい。

$ ll /var/www/
lrwxrwxrwx  1 username username   31  9月 22 08:08 2016 projectname -> /var/www/projectname__20160922-080839
drwxrwxr-x  9 username username 4096  9月 16 13:29 2016 projectname__20160916-140748
drwxrwxr-x  9 username username 4096  9月 16 13:29 2016 projectname__20160916-140930
drwxrwxr-x  9 username username 4096  9月 17 19:13 2016 projectname__20160922-075221
drwxrwxr-x  9 username username 4096  9月 17 19:13 2016 projectname__20160922-080408
drwxrwxr-x  9 username username 4096  9月 17 19:13 2016 projectname__20160922-080839

30行にも満たないシェルコードですので、カスタマイズも簡単だと思います。

それでは、良いプログラミング・ライフを!