deploy時の配布をscpからdeployerに切り替えて捗った話

引継いだProjectではscpでソースを配布してdeployしていました。1ファイルずつ、scpでサーバーに配布し、1ファイルずつ入れ替えのシェルをたたく気が遠くなる作業です。準備も含めるとリリースに1時間近く要することもありました。:scream:

多くのdepoyツールがリモートのgitを指定して、ビルドするという形式をとっており、引継いだばかりのCakeフレームワークProjectで使用する勇気と検証の時間がありません。

色々調べた結果、以下の記事で指定ファイルのみの配布を行っていたので、現在のリリースプロセスにそのまま導入できると考え、導入を決意しました。(ついでにファイル入れ替えのシェルもブラッシュアップしました)
[小規模PHPアプリケーションをDeployerでサッとデプロイする話 - コネヒト開発者ブログ](http://tech.connehito.com/entry/2016/07/28/170858)

以下、導入結果や課題、展開の話が続きます。:basketball_player_tone5:

# 導入結果
1時間弱のリリース -> 10分弱のリリース:muscle:


# 具体的なプロセスの変化
## before
### 各サーバーへの配布作業
scp で1ファイルずつ送信

### ファイルの入れ替え作業
1ファイルずつ入れ替え

```bash
#!/bin/bash

if [ -e /var/www/appPath1/xxxxx.php ]; then #-e file が存在するならば真となる。
    if [ ! -e /var/www/appPath1/xxxxx.php_20170803 ]; then
        cp /var/www/appPath1/xxxxx.php /var/www/appPath1/xxxxx.php_20170803
        chown nginx:nginx /var/www/appPath1/xxxxx.php_20170803
    fi
fi
\cp -f /home/xxxx/appPath1/xxxxx.php /var/www/appPath1/xxxxx.php #エイリアス外しで強制cp
chown nginx:nginx /var/www/appPath1/xxxxx.php
```

## after

### 各サーバーへの配布作業
deployerで以下のタスクを実行。
複数ファイルを一度に配布。

```php

// deploy
task('app-deploy', function () {
    // 前回のリリース物をクリア
    run('if [ -e deploy ]; then rm -r ./deploy/ ;fi');

    // デプロイdirへの配置
    $appFiles = [
        'appPath1/xxxxx.php',
        'appPath2/xxxxx.php',
    ];
    foreach ($appFiles as $relativeFilePath) {
        $pathData = pathinfo($relativeFilePath);

        run('mkdir -p ./deploy/' . $pathData["dirname"] . ';');
        upload("xxxxxx/" . $relativeFilePath, "./deploy/" . $relativeFilePath);
    }
    upload("dep_sh/dep_service.sh", "./deploy");
});
```

### ファイルの入れ替え作業
複数ファイルを一度に入れ替え

```bash

#!/bin/bash

arrayPath=$(cat << EOS
appPath1/xxxxx.php
appPath2/xxxxx.php
EOS
)

for item in ${arrayPath[@]}; do
    target_relative_path=$item;
    target_file=`basename $item`;
    target_path=`dirname $item`;

    if [ -e /var/www/$target_path ]; then #-e file が存在するならば真となる。
        if [ -e $target_relative_path ]; then
            if [ -e /var/www/$target_relative_path ]; then
                ls -ltr /var/www/$target_relative_path;
                cp $target_relative_path /var/www/${target_relative_path}_bk;
                diff -u -s $target_relative_path /var/www/$target_relative_path;
            fi
            
            cp $target_relative_path /var/www/$target_relative_path;
            chown nginx:nginx /var/www/$target_relative_path;
            chmod 755 /var/www/$target_relative_path;
            ls -ltr /var/www/$target_relative_path;
        fi
    fi
done;

```

# deployer導入の副産物
- deployが一瞬で終わるようになったので、バックアップ(xxxx.php_bk20180314...)を残しておく必要が無くなった
- 日々の運用作業をコード化できた
    - sqlファイルの配布も容易になり、dev,stg,productionでデータの整合性が保てるようになった
    - データダンプ取得作業(ダンプファイル作成、ローカルへのダウンロード、不要なダンプファイルの削除)など地味に面倒な作業も容易になった

# なおも残る課題:thinking:
- ファイルの削除処理が組み込めていない事

# Blue/Green Deployments を目指したい:raised_hands:
以下の記事で初めてBlue/Green Deploymentsという言葉を知りました。
[AWS Solutions Architect ブログ: Blue/Greenデプロイとは？](http://aws.typepad.com/sajp/2015/12/what-is-blue-green-deployment.html)

手作業が多いとサーバーにごみが残りがちなので、インスタンスのビルドを自動化して、インスタンスを破棄できるようになるのが理想に感じました。また、Blue/Greenデプロイであれば、スケールやサーバーの再起動が伴う作業も容易に行えそうな印象を受けました。

終わり:airplane: