Web無料相談会2018冬
Web無料相談会2018冬
2017.01.20

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

まさくに

こんにちは、バックエンドエンジニアのまさくにです。

さて、PHP のデプロイツールを使ってみるこのシリーズも 4 回目。次のプロジェクトには本当にこのうちのどれかを提案してみようと思っています。

今回は Magallanes に触れていきます。おそらく読み方はマゼラン! 大冒険感がほとばしっていますね。2017 年初記事として不足ありません。これまで試したツールについては過去の記事をご参照ください。



 

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

ハイ、今回も作りました。これだけが楽しみです。本記事で一回だけデプロイされて終わる儚いアプリケーション、Ancient battle です。ご存知の方はどれほどいるのでしょうか。古き良き MD5 ハッシュバトルにインスパイアされています。MD5 ハッシュ化された名前からステータスを作成し、戦わせるという懐古心をくすぐる一品。ステータス作成のロジックは適当です。今回はダミーデータを作るライブラリ、Faker を使って、対戦相手の名前を適当に作成しています。どうぞお楽しみください。

magallanes

なお、今回テストを行った環境は vagrant で作成した下記の環境です。前回と同様、PHP が動作する 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

 

Magallanes のインストール

公式サイトを見ながら Magallanes のインストールを行います。wget でもインストールできるみたいなのですが、正常に動作できなかったため composer の手段を取ります。下記のように composer.json を作成し、 composer install を行ってください。

▼ composer.json

{
    "require-dev": {
	"andres-montanez/magallanes": "*"
    }
}

また、Magallanes は対象サーバーにソースコードを clone するというよりは、ローカルのファイルを対象サーバーにアップロードすることに長けているようです。そのため、今回は先にアプリケーションをローカルに落としておきます。ディレクトリ構成は下記のようにしました。

$ tree -L 2
.
├── ancient-battle  # 今回デプロイ対象となるリポジトリ
│   ├── composer.json
│   ├── composer.lock
│   ├── index.php
│   └── index.twig
├── composer.json
├── composer.lock
└── vendor
    ├── andres-montanez
    ├── autoload.php
    ├── bin
    └── composer

5 directories, 7 files

 

Magallanes の設定

今回の「Ancient battle」は下記のようなデプロイ手順が必要です。

  1. 対象サーバーにソースコードをアップロードする
  2. composer install で Twig や Faker などの依存ライブラリを入れる
  3. php-fpm、nginx を再起動しておく

Magallanes も設定を簡単にするコマンドが用意されていました。そのような機能まで手を回していることに安心感を覚えます。また今回調査したツールで唯一、下記の設定を行うことで、デプロイ時にデフォルトでメールを送信してくれるようです。これをMLに設定して、チームでデプロイの状況を知ることもできるでしょう。

$ php ./vendor/bin/mage init --name="masakuni" --email="masakuni@example.com" # 自分の名前とメールアドレス
Starting Magallanes

	Initiating managing process for application with Magallanes
	Success!! The configuration for Magallanes has been generated at .mage directory.
		Please!! Review and adjust the configuration.

Finished Magallanes

下記のコマンドで.mage/config/environment/ 配下に production 環境の設定ファイルを作成してくれました。これを改修していくことになります。

$ php vendor/bin/mage add environment --name="production" --enableReleases
Starting Magallanes
	Logging enabled: /home/vagrant/magallanes/.mage/logs/log-20161226-082841.log

	Adding new environment: production
	Success!! Environment config file for production created successfully at /home/vagrant/magallanes/.mage/config/environment/production.yml
		So please! Review and adjust its configuration.

Finished Magallanes

今回デプロイするために設定するファイルは 3 つあります。production.yml は production 環境のサーバーのログイン設定やディレクトリなどの記載です。対象サーバーにログインできるように設定をあらかじめしておいてください。

▼ .mage/config/environment/production.yml

#production
deployment:
  user: vagrant
  from: ./ancient-battle # 今回アップロードするディレクトリ
  to: /var/www/magallanes # アップロード先
  excludes:
releases:
  enabled: true
  max: 10
  symlink: current
  directory: releases
hosts:
  - 192.168.100.10 # 対象サーバー
tasks:
  pre-deploy:
  on-deploy:
    - composer/install # composerの指定
  post-release:
  post-deploy: # デプロイ後のリスタート
    - restart-php-fpm
    - restart-nginx

次の 2 つは php-fpm と nginx をリスタートするためのオリジナルのタスクになります。これをデプロイ後に実行するように設定します。実際のプロダクトの実行可否はご検討ください。またファイル名の大文字小文字は区別されるようですのでご注意ください(ファイル名間違うと実行できなかったです)。

▼ .mage/tasks/RestartPhpFpm.php

<?php
namespace Task;

use Mage\Task\AbstractTask;

class RestartPhpFpm extends AbstractTask
{
        public function getName()
        {
            return 'restart php-fpm';
        }

        public function run()
        {
            $command  = 'sudo /bin/systemctl restart php-fpm.service';
            $result = $this->runCommand($command);
            return $result;
        }
}

▼ .mage/tasks/RestartNginx.php

<?php
namespace Task;

use Mage\Task\AbstractTask;

class RestartNginx extends AbstractTask
{
        public function getName()
        {
            return 'restart nginx';
        }

        public function run()
        {
            $command  = 'sudo /bin/systemctl restart nginx.service';
            $result = $this->runCommand($command);
            return $result;
        }
}

 

Magallanes でデプロイをする

それではデプロイしてみます。デプロイのコマンドは php vendor/bin/mage deploy to:production となります。

Starting Magallanes
	Logging enabled: /home/vagrant/magallanes/.mage/logs/log-20161226-095133.log

	Deploy summary
		Environment: production
		Release ID:  20161226095133

	No Pre-Deployment tasks defined.


	Deploying to 192.168.100.10
		Running Deploy via TarGz (with Releases) [built-in] ... OK # ソースコードをアップロードしてます
		Running Install vendors via Composer [built-in] ... OK # composer installをしています
	Deployment to 192.168.100.10 completed: 2/2 tasks done.


	Starting the Releasing
		Releasing on host 192.168.100.10 ... OK
	Finished the Releasing


	Starting Post-Deployment tasks:
		Running restart php-fpm ... OK # php-fpmのリスタートが走りました
		Running restart nginx ... OK # nginxもリスタートされました!
	Finished Post-Deployment tasks: 2/2 tasks done.


	Time for deployment: 2 seconds.
	Average time per host: 2 seconds.
	Total time: 3 seconds.

Finished Magallanes

デプロイ成功!

ブラウザで確認してみると正常に動いているようです。「中津川千代」さんは Faker が勝手に作った名前なので特に他意はありません。Faker ってどういうロジックで名前作ってるんでしょうね?

Magallanes

 

デプロイ、そのあとに

さて、このシリーズのお約束、デプロイ後の対象ディレクトリを眺めてみましょう。

$ tree . -L 3
.
├── current -> releases/20161226095511
└── releases
    ├── 20161226095133
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    ├── 20161226095456
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    ├── 20161226095501
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    ├── 20161226095505
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    └── 20161226095511
        ├── composer.json
        ├── composer.lock
        ├── index.php
        ├── index.twig
        └── vendor

ありますね。古き良き MD5 ハッシュバトルの劣化版ソースコードが。本当にあの MD5 ハッシュバトルってどなたが作成したのでしょうか。バーコードバトラーに似た楽しみがありました。

それではロールバックします。ひとつ戻すためのコマンドは php vendor/bin/mage releases rollback --release=-1 to:production になります。

Starting Magallanes
	Logging enabled: /home/vagrant/magallanes/.mage/logs/log-20161226-100000.log

	Rollback release on 192.168.100.10
		Running Install vendors via Composer [built-in] ... SKIPPED
		Running Rollback Release [id=20161226095505] ... OK
		Running restart php-fpm ... SKIPPED
		Running restart nginx ... SKIPPED
	Release rollback on 192.168.100.10 compted: 1/1 tasks done.


Finished Magallanes

これで対象ディレクトリを再度みてみると、最新のシンボリックリンクが最新の 20161226095511 から、ひとつ前の 20161226095505 に変更されたことが分かります。もちろん、気軽にやっちゃいけないということはお約束です。

$ tree . -L 3
.
├── current -> releases/20161226095505
└── releases
    ├── 20161226095133
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    ├── 20161226095456
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    ├── 20161226095501
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    ├── 20161226095505
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── index.php
    │   ├── index.twig
    │   └── vendor
    └── 20161226095511
        ├── composer.json
        ├── composer.lock
        ├── index.php
        ├── index.twig
        └── vendor

 

まとめ

今回で 3 つめの PHP のデプロイツール、Magallanes のご紹介でした。一番独自路線を行っているように感じられますが、必要十分の機能と拡張性、安定性を備えているように思います。小規模なプロジェクトであれば、軽く、使いやすい印象でした。問題はやっぱりこれを日本のエンジニアは何と発音しているかなのですが、マゼランでいいのでしょうか。シェアが広がって名前が呼ばれることを期待します。