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

まさくに


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

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

LIG に入社して早くも三ヶ月が経ちました。社屋の窓からはスカイツリーが見えます。最初の頃はそそり立つその姿に若干の異世界感を感じていたのですが、もう今は特に感慨もなく日々を過ごしています。確かに出社して「わぁ、スカイツリーだぁ」って毎日喜ぶ社員はいません。こうして人って慣れていくものなのだな……。

さて、本稿は PHPer のためのデプロイツール巡業、第三回目となります。今回は「Rocketeer」というデプロイツールでデプロイを試してみましょう。ツールの特徴については第一回目を、Deployer については第二回目をご参照ください。


 

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

今回もこのデプロイ記事一回のために PHP でアプリケーションを作りました。数字当てゲーム ryo-an-ji です。決められた数字を順番にクリックしていって最後の数字を当てるという、気持ちを無心に近い状態へ持っていく何とも言えないクソゲーです。今回はテンプレートエンジンに Twig を使いました。ちなみに名前の由来である龍安寺は、大好きな京都のお寺の名前です。石庭は何時間でも眺めていられる。ちなみに最後の数字は「11」が正解です。どうぞお楽しみください。

ryo-an-ji-01

なお、今回テストを行った環境は 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」も下記のようなデプロイ手順が必要です。

  1. リモートサーバでソースコードを github から clone してくる
  2. composer install で Twig などの依存ライブラリを入れる
  3. 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 [repository], 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

デプロイ成功!

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

ryo-an-ji-02

……と、言いたいところなのですが、実はいくつかデプロイ中にファイルが見つからなかったりして処理に失敗しています。今回は簡便化のためにその内容は割愛しますが、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 に近い存在として設計されているので、使いどころと設定にはもう少しかかるのかなという印象です。自分が知らないだけで最大限活かせる方法がもっとあるはず。使い分けていきたいですね。

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

バックエンドエンジニア

関連記事