Deployer で PHP アプリケーションの自動デプロイメントを作成する

このチュートリアルでは、**Deployer** を使用して PHP アプリケーションの自動デプロイメントを作成します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/automating-your-php-application-deployment-with-php-deployer_594654)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

[Alibaba Cloud Tech Share ](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.359f2cd7HG7ATI)執筆者、Ankit Mehta。 [Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.359f2cd7HG7ATI)は、クラウドコミュニティ内で技術的な知識やベストプラクティスを共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

クラウド技術が進化する前は、サーバーハードウェアの安定性が最大の課題でした。クラウド技術の成長以降、ハードウェアの安定性からアプリケーションの安定性へと焦点が移っています。顧客は、競合他社に勝つために、アプリケーションの機能を迅速に開発・展開することを求めています。これを実現するためには、どのような組織でも継続的インテグレーション（CI）と継続的デプロイメント（CD）を導入することが重要です。

CI と CD を管理するために利用できるツールはたくさんありますが、このブログでは PHP Deployer に焦点を当てていきます。このブログ記事の対象者は、Linuxの基本的なシステム管理とプログラミングスキルの経験を持つ初級者から中級者です。

#Deployer とは?
PHP Deployer (Deployer) は、PHP ベースのアプリケーションを楽にデプロイするための便利なツールです。Deployerはオープンソースのアプリケーションであり、無料で使用できます。いくつか知られているサポートされているMVC / CMSには、Laravel、CakePHP、Codeigniter、WordPress、Drupalなどがあります。

#Deployer
Deployer は非常に簡単なセットアッププロセスを提供しており、学習曲線が非常に小さいことを必要とします。いくつかのプログラミングとコーディングスキルを持つ誰もが簡単にPHPデプロイヤーとスクリプトの開発を開始することができます。それとは別に、Deployer は大規模なコミュニティサポートを提供しており、すぐに使えるスクリプト (Deployer のレシピ) をたくさん提供しています。

Deployer はまた、次の機能を提供します。

- 並列展開が可能なので、すべてのアプリケーションサーバーに同時に新機能を展開することができます。
- エージェントレスユーティリティ。リモートサーバにエージェントをインストールする必要がありません。デプロイヤーは SSH で動作します。
- 簡単なコマンドでアプリケーションを以前のバージョンにロールバックできるロールバック機能が付いています。
- Deployer によるデプロイはダウンタイムを必要とせず、Jenkins のような CI ツールと統合することもできます。

#Deployerの動作について
Deployerのタスクは以下のステップに分かれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/544822db-6c2d-7413-b311-2270161fa6ba.png)

1、準備(deploy:prepare)
このタスクでは、Deployerはディプロイメントディレクトリ(deploy_path)の存在をチェックします。ディレクトリが存在しない場合、デプロイ用の新しいディレクトリを作成します。
スクリプトはリリース、共有、.dep フォルダもチェックします。リリースにはアプリケーションの以前のリリースが含まれており、アプリケーションのロールバックの場合、Deployerはシンボリックリンクを更新することでリリースパスを以前の利用可能なバージョンに変更します。
共有ディレクトリには、すべてのリリース間のファイルとフォルダ構造が含まれています。例えば、任意のLaravelアプリケーションの場合、publicsharedファイルはすべてのリリース間で共有されます。WordPress の場合、wp-contentuploads フォルダはすべてのリリース間で共有されなければなりません。
2、ロック (deploy:lock)
準備ステップが成功すると、Deployerはアプリケーションの同時デプロイを防ぐためにデプロイをロックします。ディプロイメント ロック ファイルは .dep/deployment.lock に生成されます。
どのような場合でも、デプロイが失敗した場合は、ロックを解除するために deploy:unlock コマンドを与えなければなりません。別の方法として、ディプロイメントのロックを解除するために deployment.lock ファイルを削除することができますが、これは推奨される方法ではありません。

3、リリース (deploy:release)
Deployerは release_name で定義された名前に基づいて新しいリリースフォルダを作成します。このステップでは、.dep フォルダに保存されている以前のリリースの詳細もチェックします。
デプロイが成功した場合 (すべてのデプロイステップが "Pass" を返した場合)、Deployerは以前のバージョンへのシンボリックリンクを削除し、新しいバージョンへのシンボリックリンクを作成します。
デプロイが失敗した場合、シンボリックリンクは更新されず、アプリケーションは古いバージョン/コードのままです。
4、コードの更新 (deploy:update_code)
このステップでは、Deployerは定義されたgitソースから新しいリポジトリをプルします。
5、共有ファイルの更新 (deploy:shared)
このステップでは、Deployerは、ディレクトリを release_path から shared にコピーし、release_path から dir を削除し、shared から release_path にシンボリックリンクした dir をコピーします。
6、権限の更新 (deploy:writable)
このステップでは、Deployerは chown, chmod を使用して書き込み可能なディレクトリの権利を更新します。

7、Composer のインストール/アップデート (デプロイ:ベンダー)
上記の作業が完了したら、Deployerは composer install コマンドを実行して、依存関係のインストール/更新を開始します。
8、ディレクトリの削除 (deploy:clear_paths)
Deployerは、デプロイ後に不要なディレクトリを削除することもできます。このタスクは clear_paths で削除するディレクトリを定義することで達成できます。
9、新しいリリースを有効にする (deploy:symlink)
Deployerが新しいバージョンのアプリケーションへのシンボリックリンク(シンボリックリンク)を作成し、新しいバージョンが有効化されます。
10、デプロイメントのロックを解除 (deploy:unlock)
Deployerは、.dep/deployment.lock を削除してデプロイロックを削除します。
11、古いリリースの削除 (cleanup)
インストールスクリプトで keep_releases パラメータが定義されている場合、過剰な数のリリースフォルダをデプロイメントパスから削除します。
12、成功
上記の手順が正常に完了すると、デプロイの成功メッセージが表示されます。

#デプロイメントを始めるには
最初のステップは、Deployerのインストールです。始める前に、システムにPHPが含まれていることを確認してください。Ubuntuベースのシステムを使用している場合は、次のコマンドを供給することで、依存関係を満たすことができます。

```
sudo apt-get update 
sudo apt-get upgrade -y
sudo apt-get install php 
```

上記のコマンドが供給されたら、次のステップはDeployerの設定です。

```
curl -LO https://Deployer.org/Deployer.phar
sudo mv Deployer.phar /usr/local/bin/dep
sudo chmod +x /usr/local/bin/dep
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/74daad97-66b1-77d1-f658-04bbd201527a.png)

インストールが完了したら、最初の PHP デプロイスクリプトを開発しましょう。ベストプラクティスとして、デプロイスクリプト用に別のフォルダを作成することをお勧めします。このデモでは、Deployer という名前のフォルダを使用しています。

```
mkdir Deployer 
cd Deployer 
dep init 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/87986d1a-fc3b-2243-df7e-9f5953b98f4e.png)

deploy init コマンドを実行する際に、基本的なインストールスクリプトを生成するために、いくつかの基本的な詳細を提供する必要があります。最初のステップでは、0 - Common を選択します。

次のステップでは、Git リポジトリの詳細を入力します。このステップは任意ですので、リポジトリの詳細がない場合はスキップしても構いません。

次のステップでは、匿名の利用情報を php-Deployer コミュニティに送信するかどうかを選択できます。情報を送信したくない場合は、noを指定することができます。

完了すると、Deployerはフォルダ内にdeploy.phpファイルを作成し、以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3bcd0e0c-c415-2fbb-2caa-af1a2c1cbe15.png)


ファイルからの重要なパラメータ

```
set('application', 'my_project’);
```

ここでは、アプリケーション/プロジェクト名を設定します。これは単なる識別子であり、スクリプトには何の影響もないことに注意してください。

```
set('repository', 'git@github.com:ankyit/Deployer-test-application.git');
```

git hub のリポジトリパスをここで設定します。サーバー上にgit deploy keyを設定しておくことを忘れないようにしましょう。

```
host('project.com')
    ->set('deploy_path', '~/{{application}}');  
```
 

ホスト セクションでは、ドメイン名または IP アドレスをカンマで区切って使用できます。deploy_path には、サーバー上の配置パスが含まれています。

以下は、サーバーの更新された設定です。ベスト プラクティスとして、デプロイには最低権限のユーザーを使用するのが良いでしょう。

以下のスクリプトでは、デプロイはnginx、php-fpmを再起動する権限を持つユーザーとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/2de1c397-f722-7e80-3ef4-a5217d261abb.png)

```
task ('restart-nginx-fpm',function(){
    run('sudo /usr/sbin/service nginx reload');
    run('sudo /usr/sbin/service php7.0-fpm restart');
});
```

上のコマンドは、「restart-nginx-fpm」というスクリプト用の関数を作成しています。通常、デプロイ完了後にNginxとphp-fpmをリロード/再起動するので、タスクリストのdeploy:unlockの後に関数を追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d4c95eda-4a74-ae76-a317-36f365c384d0.png)


この例では、nginx と php7.0-fpm サービスをリロードします。

インストールを実行するには、以下のコマンドを実行します

```
dep deploy 
```

スクリプトがエラーを吐いた場合は、詳細な情報を得るために冗長モードでスクリプトを実行することができます。

```
dep deploy -v , provides default installation view with the least information 
dep deploy -vv, provides some more details as compared with the default mode 
dep deploy -vvv, provides detailed view of the installation output 
```

デフォルトのパラメータとして、デプロイ元はマスターブランチをデプロイします。他のブランチをデプロイするには、デプロイスクリプトに "branch" パラメータを指定します。

```
dep deploy --branch=uat
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/27114b40-c576-9e6a-046b-2dd1bbab391c.png)

特定のファイルを使用するために、複数のデプロイメントスクリプトを取得する場合があります。「filename」パラメータを指定できます。

```
dep --filename=<filename> deploy 
```

1つのコマンドで複数のパラメータを指定することができます。

```
dep --filename=<filename> deploy --branch=<branchname> -vv
```

以下の例では、3つの異なるブランチとアプリケーションを切り替えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b1e59081-f3f8-c85d-0ac3-22d2133e1579.png)

以下はphp-Deployer用のWordPressスクリプトのサンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/df8f274f-bff8-7e99-ae0b-860d01ea66db.png)

基本的なサイトの展開とは別に、スクリプトの新しい変数は以下の通りです。


```
set('writable_mode', 'chmod');
set('shared_files', ['wp-config.php']);
set('shared_dirs', ['wp-content/uploads']);
set('writable_dirs', ['wp-content/uploads']);
```

このスクリプトでは、wp-contentディレクトリの書き込み可能モードとしてchmodを使用しています。それぞれの WordPress デプロイメントでは、wp-content ディレクトリと wp-config.php ファイルはほぼ統一されています。これらをshared_filesとして定義することで、異なるリリース間で共有することができます。

#ロールバック
どのステップでも、デプロイに失敗した場合、以下のコマンドを実行すると、シームレスにアプリケーションを以前のリリースにロールバックします。

```
dep rollback 
```

ファイルメソッドを使用している場合は、次のコマンドを入力してください。

```
dep --filename=<filename> rollback 
```

#リビジョン管理
Deployerは、デフォルトのパラメータとしてアプリケーションのすべてのリビジョンを保持します。しかし、デプロイスクリプトに以下のコマンドを追加することで、この設定をオーバーライドすることができます。

```
set('keep_releases', 5);
```

Deployerはスクリプトの実行の最後に keep_releases パラメータをチェックし、クリーンアップステップの間に指定した数以上のリリースを削除します。

#Deployerの更新
Deployer runのマイナーバージョンを更新します。

```
dep-selfupdate
```

Deployerをメジャーリリースのバージョンに更新します。

```
dep-selfupdate —upgrade
```

#続きを読む
Deployer についての詳細な情報は [Deployer.org ](https://deployer.org/?spm=a2c65.11461447.0.0.359f2cd7HG7ATI)を参照してください。最新の Deployer レシピを入手するには [Deployer-github](https://github.com/deployphp/deployer?spm=a2c65.11461447.0.0.359f2cd7HG7ATI) にアクセスしてください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*