PHP
Deployer

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

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

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

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

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

導入結果

1時間弱のリリース -> 10分弱のリリース:muscle:

具体的なプロセスの変化

before

各サーバーへの配布作業

scp で1ファイルずつ送信

ファイルの入れ替え作業

1ファイルずつ入れ替え

#!/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で以下のタスクを実行。
複数ファイルを一度に配布。

// 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");
});

ファイルの入れ替え作業

複数ファイルを一度に入れ替え

#!/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デプロイとは?

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

終わり:airplane: