こんにちは、バックエンドエンジニアのまさくにです。
LIG に入社して早くも三ヶ月が経ちました。社屋の窓からはスカイツリーが見えます。最初の頃はそそり立つその姿に若干の異世界感を感じていたのですが、もう今は特に感慨もなく日々を過ごしています。確かに出社して「わぁ、スカイツリーだぁ」って毎日喜ぶ社員はいません。こうして人って慣れていくものなのだな……。
さて、本稿は PHPer のためのデプロイツール巡業、第三回目となります。今回は「Rocketeer」というデプロイツールでデプロイを試してみましょう。ツールの特徴については第一回目を、Deployer については第二回目をご参照ください。
PHPだけでもデプロイしたい!だってPHPアプリだもの。 第2回【Deployer編】PHPだけでもデプロイしたい!だってPHPアプリだもの。
今回デプロイされる PHP アプリケーションと環境
今回もこのデプロイ記事一回のために PHP でアプリケーションを作りました。数字当てゲーム ryo-an-ji です。決められた数字を順番にクリックしていって最後の数字を当てるという、気持ちを無心に近い状態へ持っていく何とも言えないクソゲーです。今回はテンプレートエンジンに Twig を使いました。ちなみに名前の由来である龍安寺は、大好きな京都のお寺の名前です。石庭は何時間でも眺めていられる。ちなみに最後の数字は「11」が正解です。どうぞお楽しみください。
なお、今回テストを行った環境は 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
Rocketeer のインストール
それでは 公式サイト を見ながらインストールをしてみましょう。今回も前回の Deployer 同様、composer.json を作成してインストールすることにしました。任意のディレクトリに下記ファイルを作成し、composer が動く環境で composer install からインストールをしてください。いろいろと依存するライブラリをインストールしてくれるはずです。
$ cat composer.json { "require": { "anahkiasen/rocketeer": "*" } }
インストール後、実行をしてみます。
$ ./vendor/bin/rocketeer --version Rocketeer version 2.2.3 # 動いているっぽい!
Rocketeer の設定
今回の「ryo-an-ji」も下記のようなデプロイ手順が必要です。
- リモートサーバでソースコードを github から clone してくる
- composer install で Twig などの依存ライブラリを入れる
- php-fpm、nginx を再起動しておく
それでは Rocketeer の設定を始めます。Rocketeer にも ignite という初期設定のコマンドが用意されていて、対話的に初期設定を実行できるようです。名前がカッコイイですね、ignite。でも設定は手で書き込むので、ここではひとまず連続エンターキーで全部無視します。
$ ./vendor/bin/rocketeer ignite No connections have been set, please create one: (production) No host is set for [production/0], please provide one: No username is set for [production/0], please provide one: No password or SSH key is set for [production/0], which would you use? (key) [key/password] Please enter the full path to your key (/home/vagrant/.ssh/id_rsa) If a keyphrase is required, provide it No repository is set for <pre>[code], please provide one: production/0 | Ignite (Creates Rocketeer's configuration) What is your application's name ? (rocketeer) The Rocketeer configuration was created at rocketeer/.rocketeer
一見、ディレクトリ内には何もないように見えますが、ドットファイルで .rocketeer というディレクトリができていると思います。
$ ls -a . .. .rocketeer composer.json composer.lock vendor
今回最低限設定するファイルは 4 つあります。変更箇所だけ抽出して記載したので、適宜ファイル内を検索してください。
▼ .rocketeer/config.php: 接続先などの Rocketeer 基本設定'connections' => [ 'production' => [ 'host' => '192.168.100.10', // 接続先 'username' => 'vagrant', // ユーザー名 'password' => 'vagrant', // パスワード 'key' => '', // 今回はパスワードでログインするため空白にします 'keyphrase' => '', 'agent' => '', 'db_role' => true, ], ],
▼ .rocketeer/remote.php: リモートサーバーの設定// The root directory where your applications will be deployed // This path *needs* to start at the root, ie. start with a / 'root_directory' => '/var/www/', // アプリケーションが設置されるディレクトリ // The folder the application will be cloned in // Leave empty to use `application_name` as your folder name 'app_directory' => 'rocketeer', // アプリケーション名 // この設定で /var/www/rocketeer のディレクトリが作成されます
▼ .rocketeer/scm.php: デプロイするリポジトリの設定// The SSH/HTTPS address to your repository // Example: https://github.com/vendor/website.git 'repository' => 'https://github.com/masakuni-ito/ryo-an-ji.git', // デプロイするリポジトリ
▼ .rocketeer/hooks.php: デプロイの処理に応じてタスクを実行する設定// Tasks to execute after the core Rocketeer Tasks 'after' => [ 'setup' => [], 'deploy' => [ 'sudo /bin/systemctl restart php-fpm.service', // php-fpmを再起動するコマンド 'sudo /bin/systemctl reload nginx.service', // nginxを再起動するコマンド ], 'cleanup' => [], ],
Rocketeer でデプロイをする
ひとまずソースコードを設置するための設定は以上で終了です。
それでは Rocketeer でデプロイをしてみましょう。コマンドは rocketeer deploy になります。
$ ./vendor/bin/rocketeer deploy | Deploy (Deploys the website) [~6.41s] |-- Primer (Run local checks to ensure deploy can proceed) |-- CreateRelease (Creates a new release on the server) [~2.4s] |---- Deploy/Clone (Clones a fresh instance of the repository by SCM) |===> Cloning repository in "/var/www/rocketeer/releases/20161125104250" ・ ・ ・ 中略 ・ ・ ・ |=> Successfully deployed release 20161125104250 |-- Closure (sudo /bin/systemctl restart php-fpm.service) fired by deploy.after [~0.09s] $ cd /var/www/rocketeer/releases/20161125104250 $ sudo /bin/systemctl restart php-fpm.service |-- Closure (sudo /bin/systemctl reload nginx.service) fired by deploy.after [~0.09s] $ cd /var/www/rocketeer/releases/20161125104250 $ sudo /bin/systemctl reload nginx.service | Cleanup (Clean up old releases from the server) $ rm -rf /var/www/rocketeer/releases/20161125100802 |=> Removing 1 release from the server Execution time: 6.2356s Saved logs to /home/vagrant/rocketeer/.rocketeer/logs/production--20161125.log
デプロイ成功!
ブラウザで確認してみると、ちゃんと動作しました。
……と、言いたいところなのですが、実はいくつかデプロイ中にファイルが見つからなかったりして処理に失敗しています。今回は簡便化のためにその内容は割愛しますが、Rocketeer は Laravelの思想にインスパイアされたと公式サイトの冒頭で述べている とおり、何か Laravel 用に強くカスタマイズされているようです。そのため、Laravel にはあるけれど「ryo-an-ji」にはないファイルにまで処理を加えようとしたりしてエラーが発生してしまっています。逆に言えば、Laravel をデプロイするのであれば非常に楽 ということだと思いますが、今回のように素の PHP であったり、他のフレームワークではもう少しだけ設定の修正が必要だと思われます。ご使用の際にはご注意ください。
デプロイ、そのあとに
ソースコードがデプロイされたディレクトリを確認します。
$ tree . -L 3 . ├── current -> /var/www/rocketeer/releases/20161125104250 ├── releases │ ├── 20161125101255 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ ├── 20161125102159 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ ├── 20161125102310 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ ├── 20161125102405 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ └── 20161125104250 │ ├── composer.json │ ├── composer.lock │ ├── index.php │ ├── index.twig │ └── vendor ├── shared └── state.json 13 directories, 21 files
やはり Rocketeer も Deployer や Capistrano と同様、シンボリックリンクで最新のソースコードと current ディレクトリを紐付けているのが確認できます。安心感がありますね。ですが、ここで無情にもロールバックコマンドを叩いてみましょう。もしものときのためです。
$ ./vendor/bin/rocketeer rollback | Rollback (Rollback to the previous release, or to a specific one) $ ln -s /var/www/rocketeer/releases/20161125102405 /var/www/rocketeer/current-temp $ mv -Tf /var/www/rocketeer/current-temp /var/www/rocketeer/current |=> Rolling back to release 20161125102405 Execution time: 0.4228s Saved logs to /home/vagrant/rocketeer/.rocketeer/logs/production--20161125.log
先ほどのディレクトリを確認します。
$ tree . -L 3 . ├── current -> /var/www/rocketeer/releases/20161125102405 ├── releases │ ├── 20161125101255 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ ├── 20161125102159 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ ├── 20161125102310 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ ├── 20161125102405 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── index.twig │ │ └── vendor │ └── 20161125104250 │ ├── composer.json │ ├── composer.lock │ ├── index.php │ ├── index.twig │ └── vendor ├── shared └── state.json 13 directories, 21 files
最新が 20161125104250 のディレクトリに対して、ひとつ前の 20161125102405 へ紐付けが直されているのが確認できました。もちろんロールバックは手軽にはできないので、もし実施するときはご検討ください。もしものときのお守りコマンドです。
まとめ
ほぼ前回の Deployer と同じように、Rocketeer も簡単にデプロイができることを確認できました。ただ、やはり Laravel に近い存在として設計されているので、使いどころと設定にはもう少しかかるのかなという印象です。自分が知らないだけで最大限活かせる方法がもっとあるはず。使い分けていきたいですね。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。