第2回【Deployer編】PHPだけでもデプロイしたい!だってPHPアプリだもの。

まさくに


第2回【Deployer編】PHPだけでもデプロイしたい!だってPHPアプリだもの。

こんにちは、まさくにです。

新海作品を見てからの数ヶ月は、街の曲がり角、駅のホーム、横断歩道の真ん中、桜木町で、ぎくしゃくと格好つけてしまう自分を抑えることができません。これを新海誠シンドロームと呼んで、今日も無意味にゆっくり振り返ったり、空を見上げて遠目でため息をしたり、踏切が降りてくる時は静かに目を閉じたりしています。はぁ……冬……だな……。

さて、寒暖差が激しいですが、みなさまは体調など崩されていませんでしょうか。本稿はPHPでPHPアプリケーションを速やかにデプロイして世界をハッピーにしようと画策する「PHPだけでもデプロイしたい!だってPHPアプリだもの。」の続きです。今回はPHPデプロイツールのDeployerを試してみたいと思います。概要については前回記事をご参照ください。

今回デプロイされるPHPアプリケーションと環境

とりあえずPHPアプリケーションがなければ始まらないので、雑に作りました。現在執筆時点で10月18日、「もうすぐハロウィンがやってくる」ということで、ランダムに表示されるLIGのメンバーのアイコンをクリックで撃つ、というクソゲーです。

the_liginc_of_the_dead

「THE LIG.INC OF THE DEAD」

PHP内のGoutteというスクレイピングのライブラリを使ってLIGのメンバーページから名前とアイコンをPHPで持ってきています。ご推察のとおり、考えてみれば無理にPHPを使う必要はありませんでしたが、この連載のために無理やり使いました。取締役を撃つと返り討ちに遭いマイナス5億点、救世主(メシア)に出会えればプラス100億点、それ以外のメンバーはプラス1点です。今回はこのアプリケーションをDeployerでデプロイすることを目指します。もしご興味があれば、ソースコードをご覧ください。プルリクは特別お待ちしておりません。あと悪用はやめて。

なお、今回の動作環境はVagrantで作成した下記の環境となりますが、Webの設定については割愛させていただきます。

$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$ php --version
PHP 7.0.9 (cli) (built: Jul 20 2016 17:58:41) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.9, Copyright (c) 1999-2016, by Zend Technologies
$ composer --version
Composer version 1.2.0 2016-07-19 01:28:52

Deployerのインストール

まずは公式サイトにそってDeployerのインストールを行います。今回は任意のディレクトリにcomposer.jsonを作成して、Deployerをインストールすることにしました。

$ cat composer.json
{
    "require": {
        "deployer/deployer": "^3.2"
    }
}

composerが実行可能であれば、composer installでインストールができると思います。インストール完了まで待って、Deployerを実行してみましょう。コマンドはdepになります。当たり前なんですけど、PHPにせよ、composerにせよ、PHPのプロジェクトにはだいたい必要になるものだと思うので、それだけで動作可能というのは感動的な瞬間です。

$ ./vendor/bin/dep --version
Deployer version master # 動いてるぽい

Deployerの設定

前述の「THE LIG.INC OF THE DEAD」をデプロイする前に、今回必要な手順を確認しておきます。

  1. リモートサーバでソースコードをgithubからcloneしてくる
  2. composer installでGoutteなどの依存ライブラリを入れる
  3. php-fpm、nginxを再起動しておく

上記手順を可能な限り簡単に行いたいということで、Deployerの設定を始めます。Deployerには対話式で最小限の設定を行ってくれるinitコマンドが用意されていました。おもむろに叩きます。

$ ./vendor/bin/dep init
Please select your project type (defaults to common):
  [0] common
  [1] composer
  [2] symfony
  [3] laravel
  [4] yii
  [5] node.js
 > 1
Successfully create deployer configuration: /home/vagrant/deployer/deploy.php

Deployerはrecipeと呼ばれるテンプレート化されたデプロイ手順を使うことで、さまざまなフレームワークのデプロイが手軽にできるようになっています。代表的なものはすでにインストールされていて、自分でも作成可能です。今回はPHPのフレームワークは使用していないため、1のcomposerを選びました。これでcomposerを使うプロジェクトに適したデプロイテンプレートが選ばれて、最小限の設定で前述のデプロイ手順が実行できるはず。

この時点で、カレントにdeploy.phpが作成されます。DeployerはこのPHPファイルを読み込んで、リモートサーバーにデプロイを行います。ほぼデフォルトのままで使用できるので、修正箇所は少しです。

今回はdeploy.phpを下記のように変更します。SSHでリモートサーバーに入れるようにすることや、composerやsudoを実行可能にしておくことなどにはお気をつけください。

<?php
require 'recipe/composer.php';

// ソースコードのリポジトリ情報
set('repository', 'https://github.com/masakuni-ito/the-liginc-of-the-dead.git');
set('shared_files', []);
set('shared_dirs', []);
set('writable_dirs', []);

// リモートサーバの情報
server('production1', '192.168.100.10')
    ->stage('production')
    ->user('vagrant')
    ->password('vagrant')
    ->env('deploy_path', '/var/www/deployer'); // デプロイ先のパス

// php-fpmをリスタートする
task('php-fpm:restart', function () {
    run('sudo /bin/systemctl restart php-fpm.service');
})->desc('Restart PHP-FPM service');

// nginxをリスタートする
task('nginx:restart', function () {
    run('sudo /bin/systemctl reload nginx.service');
})->desc('Restart nginx service');

// デプロイが成功したらphp-fpmとnginxを再起動する
after('success', 'php-fpm:restart');
after('success', 'nginx:restart');

after('deploy:update_code', 'deploy:shared');

Deployerでデプロイをする

設定は以上で終了です。

それでは、デプロイをしてみましょう。デプロイはdep deploy <環境>となりますが、今回はproductionしか設定していないので、いきなり本番リリースです。エンターキーを打つ手が震えますが、情熱的に叩き込みます。

$ ./vendor/bin/dep deploy production
✔ Executing task deploy:prepare
✔ Executing task deploy:release
✔ Executing task deploy:update_code # ソースコードがcloneされます
✔ Executing task deploy:shared
✔ Executing task deploy:shared
✔ Executing task deploy:vendors # composerが実行されます
✔ Executing task deploy:symlink
✔ Executing task cleanup
➤ Executing task success
Successfully deployed! # デプロイが成功しました!
✔ Ok
✔ Executing task php-fpm:restart # php-fpmもリスタートしました
✔ Executing task nginx:restart # nginxもリスタートしました

デプロイ成功!

ブラウザで確認してみると、ちゃんと動作しました。

deployer_deployed

これで世界にひとつのアプリケーションが生まれ、人々をハッピーにできました。何かあったとき、思う存分LIGのメンバーを倒すことができます。

デプロイ、そのあとに

何度かデプロイした後に、デプロイ先のディレクトリを見てみます。

$ tree -L 3
.
├── current -> /var/www/deployer/releases/20161019034104
├── releases
│   ├── 20161019031718
│   │   ├── composer.json
│   │   ├── composer.lock
│   │   ├── index.php
│   │   └── vendor
│   ├── 20161019034056
│   │   ├── composer.json
│   │   ├── composer.lock
│   │   ├── index.php
│   │   └── vendor
│   └── 20161019034104
│       ├── composer.json
│       ├── composer.lock
│       ├── index.php
│       └── vendor
└── shared

9 directories, 9 files

これを見ると、releases配下のディレクトリにプロイされたソースコードが入ってくるのが分かります。また、currentはその時点での最新のreleasesにつながっており、このシンボリックリンクを切り替えることでソースコードの最新化を行っています。そのため、Webのドキュメントルートはこのcurrentに設定してあります。Capistranoと同じですね。

ところでDeployerにはロールバックがあります。ソースコードをひとつ前の状態にする機能ですね。本物のサービスに対して使用するのであれば、「ソースコードを戻して本当に問題ないか」とか「DBのマイグレーションどうしよう」とか、いろいろな検討課題があると思うので、できることなら一生叩きたくないコマンドではありますが、ここでは心を鬼にして叩き抜きます。

$ ./vendor/bin/dep rollback production
✔ Executing task rollback # 素っ気ない

ここで再度、先ほどのデプロイ先を確認します。

$ tree -L 3
.
├── current -> /var/www/deployer/releases/20161019034056
├── releases
│   ├── 20161019031718
│   │   ├── composer.json
│   │   ├── composer.lock
│   │   ├── index.php
│   │   └── vendor
│   └── 20161019034056
│       ├── composer.json
│       ├── composer.lock
│       ├── index.php
│       └── vendor
└── shared

7 directories, 6 files

currentのシンボリックリンクが20161019034104から、一つ前の20161019034056に張り直されました。本当に一生叩きたくないコマンドではありますが、お守りとして覚えておきたいと思います。

まとめ

インストールからデプロイまでの手順が非常に少なく、また問題もなく動作させることができました。何よりもアプリケーションと同じPHPで動作するという無駄のなさに心を打たれます。業務としても恐れず選択するというのも問題がない安定感を感じました。recipeのなかにはWordPressとかもあったので、個人的には積極的に採用していきたいです。
 

今回はこのあたりで、僕は「何か」を探す旅に出ます。
それでは。
来世はとにかくイケメン男子にしてください。

まさくに
この記事を書いた人
まさくに

バックエンドエンジニア

おすすめ記事

Recommended by