LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-14

引継いだ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:

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3