Larave4、rsyncのデプロイツール、syncle

Tags : Laravel4  

Laravel4に限らず、いくつかプロジェクトを持っているとデブロイのやり方が紛らわしくなってきます。

普段は、シェルのエイリアスを切り、プロジェクトごとにワンコマンドでアップできるようにしていますが、そのコマンドが何だったか、思い出すのに苦労し、結局.bashrcの内容を読んで思い出しています。

今回、Laravel4のCookbookを翻訳して、その中にプロジェクトごとにデプロイコマンドを作成するアイデアがありました。

確かに、そのプロジェクトのルートフォルダーに行き、Artisanコマンドとして毎回同じコマンドを使用すれば、思い出すこともありません。プロジェクトに適したデプロイ手法を設定しておけば、迷いません。

すでに、Artisanコマンドは何回か作成していたので、その他のアイデアも盛り込み、デプロイコマンドを作成しています。(まだ、完成していません。:D)翻訳がまだ2冊あるので、今回はこの程度で、翻訳に飽きたら、手を加えていくことになりそうです。

(でも、本当にお手軽なのは、プロジェクトルートにいつも同じ名前のアップロード用シェルスクリプトを作成することでしょう。:D)

設定ファイルに指定しておいたコマンドを実行し、出力に色を付けているだけです。コマンド名も自由に変更できるようにしてあります。所詮コマンドをexecで実行しているだけなので、デプロイ以外でも使用できるのでしょうが、この手のツールはシンプルにしておきましょう。(学習目的に使えるようにと思っていましたが、多少複雑になりました。)

インストール

コマンドでインストールするのであれば:

composer require "hirokws/syncle:master-dev"

もしくは、composer.json fileのrequireセクションに付け加えてください。

"hirokws/syncle" : "master-dev"

次に、app/config/app.phpでサービスプロバイダーを登録します。配列に次の一行を追加してください。(Prepperが動いていれば、自動で設定します。)

'Syncle\SyncleServiceProvider',

設定ファイルをapp/config/package/hirokws/syncle下にコピーします。

php artisan config:publish hirokws/syncle

これで、コマンドが実行できます。'php artisan'を実行し、表示されるリストの中に、デフォルトのコマンド名'syncle'が存在するか、調べてください。

設定

app/config/packages/hirokws/syncle/config.phpをエディターで開き、お好きに設定してください。

  • CommandName : デフォルトの"syncle"になっていますが、これを変更すれば、お好きな名前に変更できます。例えばdeployに変更したら、実行はphp artisan deployになります。
  • MessageLang':出力メッセージ言語、'en'か'ja'です。('ja'を指定しても、実行コマンドが出力する全部のメッセージが日本語になるわけではありません。)
  • DeployMethod.default : rsyncによるコマンド例を定義してあります。Laravelのストレージファイルをコピーしないように指定してあります。ポート番号や、送り先のファイルパスを確実に設定してください。コマンド中の:rootはプロジェクトルートの絶対パス(最後に'/'無し。変更しました。必要に応じ、最後に'/'を付けてください。rsync系のコマンドでは最後のスラッシュ有る無しで動作が変わります。)に置き換わります。また、workbench下で開発中のプロジェクトルートを指定したい場合は、:projectRootを使用してください。このdefault項目は--byオプションを省略した時に使用される設定です。
  • DeployMethos.git : 'git'によるデプロイの例です。これを実行するには、php artisan syncle --by gitと指定します。つまり、byオプションで指定されたアイテム名であればよいため、自由に名前を変えたり、増やしたりできます。コマンド中の:messageは--messageオプションで指定した内容に置き換わります。

実行スクリプトは、一つなら文字列で、複数ある場合は配列で指定します。';'や'&'などをコマンドの区切りとして指定しないでください。配列で指定した場合、各コマンドが正常終了(0)しない場合、そこで処理を中断します。

設定例

デプロイ前に実働用に最適化を行い、その結果をrsyncで転送し、その後に開発用に環境を戻すため、コンパイルされたファイルを削除する場合です。:rootはプロジェクトのルート(artisanが存在する場所)へのフルパスへ置き換わります。

    'DeployMethod' => array(
        'default' => array(
            'php artisan --ansi --force optimize',
            'rsync -av --delete -e "ssh -p 9999" :root/ username@somewhereexample.com:/home/username/public_html/project',
            'php artisan --ansi --force clear-compiled'
        ),
    ),

workbenchで公開パッケージを開発している場合は、最適化を行う必要はありません。gitで公開リポへpushします。

    'DeployMethod' => array(
        'default' => array(
            'git add -A',
            'git commit -am ":message"',
            'git push' 
        ),
    ),

場合によってはworkbenchで開発中のコードをどこかヘ転送する必要がある場合もあるでしょう。その場合は、:rootの代わりに:projectRootを使用してください。

    'DeployMethod' => array(
        'backup' => 'rsync -av --delete -e "ssh -p 9999" :projectRoot/ /backup'
    ),

実行サンプル

'default'設定のコマンドでデプロイ

php artisan syncle

'git'設定を使いデプロイ

php artisan syncle --by git --message "Initial Commit"
php artisan syncle -b git -m "Initial Commit"

もちろん、defaultをgitの内容に置き換えれば、byオプションを付けなくても、gitによりデプロイされます。

転送リストの表示

料理本のrsyncの出力は、手元の環境と異なっています。同じツールでも、作成元が異なればメッセージのフォーマットが違います。書籍版の処理に加え、手元のrsyncの出力に會わせてフォーマット、色つけ、ローカライズしました。

rsyncの出力には転送ファイルが出力され、うざったい場合が多いですので、デフォルトでは出さないようにしています。(多分、料理本も出さないようしています。)しかし、確認したい場合もあるでしょうから、verboseモードが指定された時のみ、表示します。

php artisan syncle -v
php artisan syncle -vv
php artisan syncle -vvv
php artisan syncle --verbose 1
php artisan syncle --verbose 2
php artisan syncle --verbose 3

どれでも、変わりありません。全部同じ内容を出力します。転送ファイルのリストが表示されます。

コマンド出力のログ

コマンド出力のログ保存します。転送結果を残しておいて、いざという場合にチェックしたい場合に便利です。

php artisan syncle --log

Laravel4料理本は、結構面白いですよ。色々なヒントを与えてもらえます。