引継いだProjectではscpでソースを配布してdeployしていました。1ファイルずつ、scpでサーバーに配布し、1ファイルずつ入れ替えのシェルをたたく気が遠くなる作業です。準備も含めるとリリースに1時間近く要することもありました。
多くのdepoyツールがリモートのgitを指定して、ビルドするという形式をとっており、引継いだばかりのCakeフレームワークProjectで使用する勇気と検証の時間がありません。
色々調べた結果、以下の記事で指定ファイルのみの配布を行っていたので、現在のリリースプロセスにそのまま導入できると考え、導入を決意しました。(ついでにファイル入れ替えのシェルもブラッシュアップしました)
小規模PHPアプリケーションをDeployerでサッとデプロイする話 - コネヒト開発者ブログ
以下、導入結果や課題、展開の話が続きます。
導入結果
1時間弱のリリース -> 10分弱のリリース
具体的なプロセスの変化
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でデータの整合性が保てるようになった
- データダンプ取得作業(ダンプファイル作成、ローカルへのダウンロード、不要なダンプファイルの削除)など地味に面倒な作業も容易になった
なおも残る課題
- ファイルの削除処理が組み込めていない事
Blue/Green Deployments を目指したい
以下の記事で初めてBlue/Green Deploymentsという言葉を知りました。
AWS Solutions Architect ブログ: Blue/Greenデプロイとは?
手作業が多いとサーバーにごみが残りがちなので、インスタンスのビルドを自動化して、インスタンスを破棄できるようになるのが理想に感じました。また、Blue/Greenデプロイであれば、スケールやサーバーの再起動が伴う作業も容易に行えそうな印象を受けました。
終わり