読者です 読者をやめる 読者になる 読者になる

localdisk

PHP とか Java とか Web とか好きなことを書きます。

デプロイツールを使ってLaravelをデプロイする

メリークリスマス!!この記事は Laravelリファレンス発売記念!販売促進!! Advent Calendar 2015 - Adventar の 12/19 分です。メリークリスマス!!

親方!Capistrano に Laravel プラグインが!

f:id:localdisk:20151206205015p:plain
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.phprequire してます。

タスクがどんな処理をやってるかはソースコードみれば大体わかります。php よりも shell の知識があったほうがよいくらいです。

各タスクがなにやってるのか

全ては網羅してませんが、だいたいこんな感じです。

あとはリリースをひとつ前に戻す rollback とか大体揃ってる感じです。

サーバーとの接続

こんな感じ。server 関数を使います。第1引数は任意の名前、第2引数がホスト名あるいはIPアドレス、第3引数がポート。user 関数はログインユーザー、identityFilessh の 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 不可)ので自分でタレ作ったほうがよいです。年内に僕のタレをここに載せておきます(このエントリも複数日に分けて書いてます)。 載せました。

gist.github.com

カスタマイズとか

recipe を読むと捗ります。ローカルから直接アップロードとか。functions.php を見ておくとはかどります。自分でタスク作ったりとかそういうやつです。migrate したり optimize したり等々。あとサードパーティのレシピも参考になります。

では、よいクリスマスを!

*1:他のファイル名にしたいときは-f=ファイル名をつける