こんにちは、バックエンドエンジニアのまさくにです。
さて、PHP のデプロイツールを使ってみるこのシリーズも 4 回目。次のプロジェクトには本当にこのうちのどれかを提案してみようと思っています。
今回は Magallanes に触れていきます。おそらく読み方はマゼラン! 大冒険感がほとばしっていますね。2017 年初記事として不足ありません。これまで試したツールについては過去の記事をご参照ください。
PHPだけでもデプロイしたい!だってPHPアプリだもの。 第2回【Deployer編】PHPだけでもデプロイしたい!だってPHPアプリだもの。 第3回【Rocketeer編】PHPだけでもデプロイしたい!だってPHPアプリだもの。
今回デプロイされる PHP アプリケーションと環境
ハイ、今回も作りました。これだけが楽しみです。本記事で一回だけデプロイされて終わる儚いアプリケーション、Ancient battle です。ご存知の方はどれほどいるのでしょうか。古き良き MD5 ハッシュバトルにインスパイアされています。MD5 ハッシュ化された名前からステータスを作成し、戦わせるという懐古心をくすぐる一品。ステータス作成のロジックは適当です。今回はダミーデータを作るライブラリ、Faker を使って、対戦相手の名前を適当に作成しています。どうぞお楽しみください。
なお、今回テストを行った環境は 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」は下記のようなデプロイ手順が必要です。
- 対象サーバーにソースコードをアップロードする
- composer install で Twig や Faker などの依存ライブラリを入れる
- 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 ってどういうロジックで名前作ってるんでしょうね?
デプロイ、そのあとに
さて、このシリーズのお約束、デプロイ後の対象ディレクトリを眺めてみましょう。
$ 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 のご紹介でした。一番独自路線を行っているように感じられますが、必要十分の機能と拡張性、安定性を備えているように思います。小規模なプロジェクトであれば、軽く、使いやすい印象でした。問題はやっぱりこれを日本のエンジニアは何と発音しているかなのですが、マゼランでいいのでしょうか。シェアが広がって名前が呼ばれることを期待します。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。