グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



コマンド一発でソースコードを本環境に!PHP製のDeployツール「Deployer」を使ってみた

本番環境へのソースコードのDeployにも色々な方法があります。

  • FTPクライアントを用いてアップロード
  • lftpコマンドを用いてアップロード
  • GitHub等のサービスを介して本環境でclone
  • GitHubActionsを用いてアップロード 等々…

弊社ではセキュリティ等の関係上オンプレミスのGitLabでソースコードを管理していたため、自動化が思うように進まなかったのですが、昨今のコロナ渦でリモートワークが実施されるに伴い、GitHubの導入、Deployの自動化が進んでいます。 その中でも実際に使ってみて便利だったPHP製のDeployツール「Deployer」の紹介をしたいと思います。

Deployerとは

https://deployer.org/

A deployment tool written in PHP with support for popular frameworks out of the box.
Google翻訳:すぐに使用できる一般的なフレームワークをサポートするPHPで記述されたデプロイメントツール。

詳細は後述しますが、PHPで書かれたDeployツールになります。
SSHで本環境に接続し、Gitリポジトリのcloneやcomposerのインストールを行ってくれます。

筆者の環境

  • WSL2
  • Ubuntu-20.04
  • PHP-8.0.3

Deployerを実際に使ってみる

Deployerを使って実際にDeployしてみるに当たり、Twigを用いてhtmlを表示するだけのコードを書きました。

<?php

require_once './vendor/autoload.php';

$loader = new \Twig\Loader\FilesystemLoader('./templates');
$twig = new \Twig\Environment($loader);

$args = [
    'title' => 'deployer test',
    'content' => 'コンテンツ'
];

echo $twig->render('index.html.twig', $args);
<!DOCTYPE HTML>
<html>
    <head>
        <title>{{ title }}</title>
    </head>
    <body>
        {{ content }}
    </body>
</html>
{
    "require": {
        "twig/twig": "^3.0"
    }
}
$ tree -L 2
.
├── composer.json
├── composer.lock
├── docker-compose.yml
├── index.php
├── templates
│   └── index.html.twig
└── vendor
    ├── autoload.php
    ├── composer
    ├── symfony
    └── twig

インストール

今回はcomposesrを用いてインストールします。
https://deployer.org/docs/6.x/installation#source-composer-installation

$ php ./vendor/bin/dep
Deployer master

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -f, --file[=FILE]     Specify Deployer file
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help  Displays help for a command
  init  Initialize deployer system in your project
  list  Lists commands

Deployer設定ファイルの作成

depコマンドのinitを用いて作成します。 各種フレームワークから設定ファイルの雛形を選択します。
今回はフレームワークを用いていないので [0]Common を選択しました。

$ ./vendor/bin/dep init
Please select your project type (defaults to common):
  [0] Common
  [1] Laravel
  [2] Symfony
  [3] Yii
  [4] Zend Framework
  [5] CakePHP
  [6] CodeIgniter
  [7] Drupal
 > 0
Successfully created: /path/to/ploject/deploy.php

deploy.phpの編集

前工程で作成した deploy.php を編集します。
ソースコードのGitリポジトリと公開サーバのSSH接続情報を設定しました。

$ git diff
diff --git a/deploy.php b/deploy.php
index 72b77cc..63d2561 100644
--- a/deploy.php
+++ b/deploy.php
@@ -7,7 +7,7 @@ require 'recipe/common.php';
 set('ssh_type', 'native');
 set('ssh_multiplexing', true);

-set('repository', 'git@domain.com:username/repository.git');
+set('repository', 'https://github.com/username/deployer-test.git');
 set('shared_files', []);
 set('shared_dirs', []);
 set('writable_dirs', []);
@@ -15,9 +15,10 @@ set('writable_dirs', []);
 // Servers

 server('production', 'domain.com')
-    ->user('username')
-    ->identityFile()
-    ->set('deploy_path', '/var/www/domain.com');
+    ->configFile('~/.ssh/config')
+    ->identityFile('~/.ssh/production_id.rsa')
+    ->http_user(33)
+    ->set('deploy_path', '~/deployer-test');

Deployerの実行

プロジェクト直下で下記のコマンドを実行します。

./vendor/bin/dep deploy
$ ./vendor/bin/dep deploy
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
✔ Executing task deploy:update_code
✔ Executing task deploy:shared
✔ Executing task deploy:writable
✔ Executing task deploy:vendors
✔ Executing task deploy:clear_paths
✔ Executing task deploy:symlink
✔ Executing task deploy:unlock
✔ Executing task cleanup
✔ Executing task success
Successfully deployed!

問題なく成功したようです!!

本環境の確認

本環境のDeploy先を確認します。

$ ll
合計 2
lrwxrwxrwx 1 xxxxxxxx xxxxxxxx 39  9月 15 16:41 current -> /home/xxxxxxxx/deployer-test/releases/1
drwxr-xr-x 3 xxxxxxxx xxxxxxxx  3  9月 15 16:41 releases
drwxr-xr-x 2 xxxxxxxx xxxxxxxx  2  9月 15 16:06 shared
 releases ディレクトリ内に更新毎にあたらしくディレクトリが作成され、 current シンボリックリンクが最新版を向く構成になっています。

試しにもう一度デプロイしてみると…

$ ll
合計 2
lrwxrwxrwx 1 xxxxxxxx xxxxxxxx 39  9月 15 17:14 current -> /home/xxxxxxxx/deployer-test/releases/2
drwxr-xr-x 4 xxxxxxxx xxxxxxxx  4  9月 15 17:14 releases
drwxr-xr-x 2 xxxxxxxx xxxxxxxx  2  9月 15 16:06 shared

$ ll releases/
合計 3
drwxr-xr-x 5 xxxxxxxx xxxxxxxx 12  9月 15 16:41 1
drwxr-xr-x 5 xxxxxxxx xxxxxxxx 12  9月 15 17:14 2

最新版の releases/2/  current が切り替わっています!

おわりに

Deployerを使ってソースコードをDeployしてみました。 シンボリックリンクが最新バージョンを向く構成になっていることで、不具合が見つかった際は前バージョンに戻すことも簡単にできますね! 今回ご紹介した以外にもいろいろな機能があるので、是非使ってみてはいかがでしょうか?

この記事を書いた人

ばね
ばねソリューション事業部 システムエンジニア
東京で2年半エンジニアとしての経験を積み、浜松にUターンの後、アーティスへ入社。
ソリューション事業部のWebエンジニアとして、システムの設計・開発・保守・運用からインフラまで幅広く従事している。
フルスタックエンジニア目指して現在も勉強の日々。車が好き。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします