Deployerでローカルホストへデプロイ

# PHP Deployerとは:question:
PHP で作られたデプロイツール :airplane:
公式URL： https://deployer.org/
ドキュメント： https://deployer.org/docs
ソースコード：https://github.com/deployphp/deployer

（英語ですがChromeの日本語翻訳を使えばほとんど読めると思います。）

## むかしむかし:hatching_chick:
Gitもまだ使っていない頃、たくさんのPHPやhtml,cssを手動（SFTP）でサーバへアップロードしているのを見てあまりに大変そうなのでサポートするツールを作り便利に使ってもらっていた。

## そして数年後:baby_chick:
とあるプログラムの改修サポートをしていたらなんだかんだ私がサーバへファイルをアップロードする必要が出てきたので従来の手順通りにやってみたが、やはり手間なのでコマンド一発で終わりにしたいのでデプロイヤーを使おうと思い始める。

## なぜ Deployer:question:
いろんなツールを検討したわけじゃないですが普段、PHPに慣れているのとやってみたら必要十分な機能を持っていたので:sunny:

## なぜ？ ローカルホストへデプロイ
触りながら

- サーバを持っていない人
- サーバ接続がうまくいかなくて詰まった
- サーバにSSHログインしたあと簡単にデプロイしたい

などDeployerでどんなことができるかはローカルで誰でもさくっとテストできるのではないかということでlocalhostデプロイにしました。:grinning:

# さて導入から （OS Xでやってます）:desktop:

## 一応、自分のPHPのバージョン:snowflake:
```php:
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

## Deployerのダウンロード:inbox_tray:
公式には
> curl -LO https://deployer.org/deployer.phar
> mv deployer.phar /usr/local/bin/dep
> chmod +x /usr/local/bin/dep

とありますが、 /usr/local/bin へは諸事情あって配置できなかったので

```shell:
curl -LO https://deployer.org/deployer.phar
mv deployer.phar dep
chmod +x dep
./dep list
```

でやっても問題なく動きます。 （以下同じフォルダへインストールした状態で進めます）
ちなみに

```shell:
php dep list
```
だと+xのパーミッションいりません

## curl のオプション -LO ってなに？  :see_no_evil:
- -L, --location  
Follow redirects (H)  
リダイレクトを追いかける。
- -O, --remote-name  
Write output to a file named as the remote file  
リモートファイルを書き出す。

何気なしに入力してたけどhelpからおさらいしてみた

## curlってなんじゃい？って人も大丈夫:star:
https://deployer.org/download/ 
の Downloads の一覧からクリックしてダウンロードもできます。（ハッシュ値は念の為、確認しましょう）
何らかの理由で古いバージョンが必要な場合もこのアドレスからどうぞ
（今回は6.6.0を使ってます。）

# では使う前に初期化
```shell:
＄ ./dep init
```
を実行して全ての問になにも入力せずEnterを押してすべてデフォルト設定でテストするには完了です。
（あとから修正、やりなおしもできます）

#### もし入力を間違えても大丈夫　:confounded:
同じフォルダにdeploy.phpができている時は削除してもう一度initのコマンドを同じようにやり直せば大丈夫です。

deploy.php ができていれば成功です。

# テスト用のローカルデプロイにしてみたのを貼っちゃいます。:page_facing_up:

```php5:
<?php
// ./dep init で作ってくれたもの
namespace Deployer;
// ./dep init で作ってくれたもの
require 'recipe/common.php';

// プロジェクト名。自分でわかりやすいのを付けましょう。 
// set('xxx') はあとの処理で get('xxx') で取得できます。
set('application', 'local-deploy');

// プロジェクトのgitリポジトリを書く（ここにはサンプルにDeployerのリポジトリを書いてます）
set('repository', 'https://github.com/deployphp/deployer.git');

// [Optional] Allocate tty for git clone. Default value is false.
// ここはデフォルトのままにしてますが、git cloneの仕方でtrue or falseを切り替える
set('git_tty', true);

// Shared files/dirs between deploys
// デプロイしても共有するディレクトリ、ログやキャッシュなど必要であれば
set('shared_files', []);
set('shared_dirs', []);

// Webサーバが書き込み可能にするディレクトリ
set('writable_dirs', []);

// 環境を指定しない場合のデフォルトのステージ（環境）
set('default_stage', 'develop');

// 現在のディレクトリ位置を保存する（追加した）
// このようにPHPの関数が使えます。
set('current_dir', realpath(''));

// ロールバックできる世代数
// スペルを間違えると反映されません（sを最後につけ忘れた経験あり）
set('keep_releases', 3);

// ローカルホストに開発環境をデプロイする想定
// 環境は開発、ブランチはnext、デプロイ先は実行しているフォルダにあるdevへ
localhost('local-dev')
    ->stage('develop')
    ->set('branch', 'next')
    ->set('deploy_path', get('current_dir').'/dev')
    ;

// ローカルホストに本番環境をデプロイする想定
// 環境は開発、ブランチはnext、デプロイ先は実行しているフォルダにあるdevへ
localhost('local-pro')
    ->stage('production')
    ->set('branch', 'master')
    ->set('deploy_path', get('current_dir').'/pro')
    ;

// Tasks
// 実際のデプロイのフローと説明
desc('Deploy your project to localhost');
task('deploy', [
    'deploy:info',
    'deploy:prepare',
    'deploy:lock',
    'deploy:release',
    'deploy:update_code',
    'deploy:shared',
    'deploy:writable',
    // 'deploy:vendors', // composerを使っていないのでコメントアウト。他のタスクも自由に入れ替えができます。
    'deploy:clear_paths',
    'deploy:symlink',
    'deploy:unlock',
    'cleanup',
    'success'
]);

// [Optional] If deploy fails automatically unlock.
// deployが失敗した場合にはunlockを呼び出してね。という設定
after('deploy:failed', 'deploy:unlock');

// 自分で足したHelloWorld
// ./dep hello
// で実行できます
desc('Hello world');
task('hello', function() {
    // Hello Worldと出して終わり
    writeln('Hello world');
});

```



# デプロイテストをする前にデプロイ先となるフォルダを作成する:open_file_folder:
デプロイ先のフォルダを作成する。

```shell:
＄ mkdir dev pro
$ ls
dep  deploy.php  dev pro
```
こんな配置になります。

#### 開発想定へデプロイ

```shell
$ ./dep deploy develop
```
defaultをdevelopにしてるので最後のdevelopは省略可能です。

#### 本番想定へデプロイ

```shell
$ ./dep deploy production
```

## 以下のように必要ないコマンドを削除、コメントアウトしたり、足したり、名前を変えたりできます。:cherries:

```php
task('depuroi', [
    'deploy:info',
    'hello', // 追加
    'deploy:prepare',
    'deploy:lock',
    'deploy:release',
    'deploy:update_code',
    // 'deploy:shared',  // 外してみた
    // 'deploy:writable',// 外してみた
    // 'deploy:vendors', // composerを使っていないのでコメントアウト。他のタスクも自由に入れ替えができます。
    'deploy:clear_paths',
    'deploy:symlink',
    'deploy:unlock',
    'cleanup',
    'success'
]);
```

タスクの名前を変更しているので、この場合の実行はこのように実行します。

```php
$ ./dep depuroi
```

## デプロイ完了
作業しているところのdev,proにそれぞれGitHubのDeployerのブランチ違いがデプロイされてると思います。

# 順調にできたら

## Stage環境の追加をやってみる
stgフォルダとstage環境の設定を追加してデプロイしてみてください。

# もし分からなくなったら
作ってたフォルダを削除して最初からやり直せば大丈夫です。

# 次はドキュメントへ
https://deployer.org/docs

一度、動けばイメージが湧くと思うのでドキュメントを見てみてください。
あとはこの処理どうなってるんだろうというのはGitHubの検索で入力すると処理が閲覧できてドキュメントと一緒に見ると分かりやすいです。

なお、社内のぜんぜん違うプロジェクトのdeploy.phpでは全く記述内容が違ったので人それぞれですので正解はありません！
ちゃんと思ったとおりデプロイできることが正解です！

## サーバがある人は
サーバへの接続はネットにいろいろ情報があるので挑戦してみてください。

### 終わり:champagne: