デプロイツールを使ってLaravelをデプロイする
メリークリスマス!!この記事は Laravelリファレンス発売記念!販売促進!! Advent Calendar 2015 - Adventar の 12/19 分です。メリークリスマス!!
親方!Capistrano に Laravel プラグインが!
A remote server automation and deployment tool written in Ruby.
喜び勇んで リポジトリ を参照してみたところ…最終更新が2年前。Laravel 5 対応の PR が5月にされていますが、マージされいない…。解散(白目
ちなみに Ruby の環境を整えてたら2時間くらい吹っ飛んでた。
Deployer を使おう
はい、というわけで Deployer 使ってみましょうか。Rocketeer より簡単ですし、PHPわかんなくても shell がわかればなんとかなります。
Deployer のインストール
TOPページにある Download deployer.phar
をクリックして deployer.phar
をダウンロードしましょう。これは phar
をそのままプロジェクトルートに置くもよし、/usr/local/bin
あたりに mv
するもよしです。Jenkins さんにデプロイを任せてたいのであれば後者がよいでしょう。
で chmod +x depoyer.phar
して実行権限をつけておきましょう。詳しいことは公式ドキュメントを読もう。
使ってみる
では、ダウンロードした deployer.phar
を叩いてみましょう。
➜ deploy php deployer.phar Deployer version 3.0.10 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -f, --file[=FILE] Specify Deployer file. -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: help Displays help for a command list Lists commands self-update Updates deployer.phar to the latest version worker Deployer uses workers for parallel deployment.
なるほど、この時点で実行できるのは help, list, self-update, worker コマンドのみですね。では deploy.php
を作って以下のように書いてみましょう。
<?php require 'recipe/common.php';
でもう一度実行。
➜ deploy php deployer.phar Deployer version 3.0.10 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -f, --file[=FILE] Specify Deployer file. --tag[=TAG] Tag to deploy. -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: cleanup Cleaning up old releases current Show current release. help Displays help for a command list Lists commands rollback Rollback to previous release self-update Updates deployer.phar to the latest version worker Deployer uses workers for parallel deployment. deploy deploy:copy_dirs Copy directories deploy:prepare Preparing server for deploy deploy:release Prepare release deploy:shared Creating symlinks for shared files deploy:symlink Creating symlink to release deploy:update_code Updating code deploy:vendors Installing vendors deploy:writable Make writable dirs
お、実行できるタスクが随分増えました。これは、deployer はデフォルトで deploy.php
が探す*1のと recipe/common.php
にあらかじめ便利そうなタスク群が組み込まれているためです。
ついでに説明しておきますと、Deployerは使う分には学習コストがほとんどかからないことです。半日くらいいじっていれば大体なんとかなります。
deployer ├── bin ├── recipe ├── src └── test
上記が deployer のディレクトリ構成なんですが、bin
のなかの dep
というファイルがコマンドを受け付けるエンドポイント。recipe
ディレクトリがフレームワークや著名なプロダクト(WrodPressとかDrupalとか)のデプロイタスクとか。大事なのは common.php で、他の各タスクもこの common.php
を require
してます。
タスクがどんな処理をやってるかはソースコードみれば大体わかります。php よりも shell の知識があったほうがよいくらいです。
各タスクがなにやってるのか
全ては網羅してませんが、だいたいこんな感じです。
deploy:prepare
- timezone 設定(env)
- deploy_path作成
- releases / shared 作成
— MATSUO Masaru (@localdisk) 2015, 12月 17
deploy:release
- 日付ディレクトリ作成(date('YmdHis')) + 連番(42というマジックナンバーは謎)
- シンボリックリンク作成
— MATSUO Masaru (@localdisk) 2015, 12月 17
deploy:update_code
- git clone
- env に tag か branch を指定しておく
- env で git_cache を true にすると clone の際に reference と dissociate オプションがつく
— MATSUO Masaru (@localdisk) 2015, 12月 17
deploy:vendors
- composer install
- インストールされてなければインストールする
- 環境変数の設定(export)
— MATSUO Masaru (@localdisk) 2015, 12月 17
deploy:shared
- set された shared_dirs / shared_files の共有設定
— MATSUO Masaru (@localdisk) 2015, 12月 17
deploy:symlink
- デプロイされたディレクトリにシンボリックリンクをはる
— MATSUO Masaru (@localdisk) 2015, 12月 17
cleanup
- 過去にリリースされたファイルの削除(releases配下)
- デフォルトでは全削除
- keep_releases を set しておけばその数分は残る
- 残すべき(確信)
— MATSUO Masaru (@localdisk) 2015, 12月 17
あとはリリースをひとつ前に戻す rollback
とか大体揃ってる感じです。
サーバーとの接続
こんな感じ。server
関数を使います。第1引数は任意の名前、第2引数がホスト名あるいはIPアドレス、第3引数がポート。user
関数はログインユーザー、identityFile
は ssh の key を指定します。今回は ssh 使ってますが、password
関数もあるのでそういう認証も可能。stage
関数はデプロイ対象サーバーがたくさんある場合に意味が出てきます。今回は割愛。で、env
関数でデプロイするディレクトリを指定。
詳しく知りたい場合は Deployer — Servers を熟読しよう。
<?php require 'recipe/laravel.php'; server('test', '127.0.0.1', 2222) ->user('vagrant') ->identityFile('public key path', 'private key path') ->stage('test') ->env('deploy_path', '/home/vagrant/deploy_test'); set('repository', 'https://github.com/laravel/laravel');
で、 php deployer.phar deploy -vvv test
とやればOK。test
はサーバーで指定した名前、-vvv
とやるとログが詳細にでるので便利。この例では Laravel のレシピを使ってますが、実際使うときは 最新レシピを使ったほうがいいかもですが、これでも色々足りなかったり(optimizeとか)cleanup してたりする(cleanup されたら rollback 不可)ので自分でタレ作ったほうがよいです。年内に僕のタレをここに載せておきます(このエントリも複数日に分けて書いてます)。 載せました。
カスタマイズとか
recipe
を読むと捗ります。ローカルから直接アップロードとか。functions.php
を見ておくとはかどります。自分でタスク作ったりとかそういうやつです。migrate したり optimize したり等々。あとサードパーティのレシピも参考になります。
では、よいクリスマスを!
*1:他のファイル名にしたいときは-f=ファイル名をつける