Laravel5のプロジェクトをGitで管理する

いつも１人で開発しているのでついついバージョン管理が疎かになりがちです。
ここではLaravelのバージョン管理をGitで行う際のおそらくは標準的なやり方、ワークフローをメモしておきます。

##想定利用シーン

想定する利用シーンとしては、

* 開発はローカルで行って動作確認
* リモートレポジトリにpush
* テストサーバでpull(clone)し、動作確認
* 本番サーバでpull(clone)

という流れ。ひとまず自動化等は気にしない。
自動化等を検討する場合は、[こちら](http://qiita.com/zaburo/items/8886be1a733aaf581045)もご覧下さい。

##Laravelにて、おそらく想定している開発方法

###ベストプラクティス？を紐解く

Laravelはプロジェクトを作ると、.gitignoreが既に作成されており、内容が、

```bash
/vendor
/node_modules
Homestead.yaml
Homestead.json
.env
```

となっている。無視されるファイルは初期状態では下記のような状態。

* /vendor（Laravel本体含め、各種ライブラリ群）
* /node_modules（初期状態では存在しない）
* Homestead.yaml（初期状態では存在しない）
* Homestead.json（初期状態では存在しない）
* .env（開発、テスト、本番等、それぞれ環境依存のパラメータ設定）

という状態なので、事実上、

* /vendor
* .env

が無視される = 環境依存なので、各サーバ環境下で個別に用意しろ！というのがお作法と推測できる。

###/vendor

Laravelの本体等も含むので、？？？という感じですが、各環境下でcomposer.jsonをベースにcomposerを利用してインストールしろとのことらしい。

```bash
composer install
```

###.env

.envは各サーバで個別に用意して、DB接続情報を含め、各種環境依存パラメーターを設定しろということのようです。

##実際に開発ワークフローを試してみる

では、簡単ではありますが、開発ワークフローを試してみたいと思います。
流れとしては、

* １）リモートリポジトリ用意
* ２）ローカルLaravelの用意
* ３）ローカルからリモートにpush
* ４）別のサーバでclone(pull)
* ５）別のサーバで.envの準備と編集
* ６）別のサーバでcomposer installを実行
* ７）ローカルで編集しpush
* ８）別のサーバでpull

という感じになるかと思います。

###１）リモートリポジトリの作成

では、ここでは既にGitがインストールされ、SSHでログインができるサーバ上にリモートリポジトリを作成してみます。もちろんGithubとかでも問題ありません。

基本、こんな感じ。チームで開発するならgroupを変更して、書込み権限を付与しておきましょう。

```bash
mkdir /var/www/test.git
chown user /var/www/test.git
cd /var/www/test.git
git init --bare --shared
```

###２）ローカルにLaravelを用意

homeディレクトリにlocal_l5というプロジェクト作成を想定。

```bash
cd
composer create-project laravel/laravel local_l5
```

###３）ローカルからリモートにpush

作成されたプロジェクトディレクトリ内で各種gitのinit,remoteリポジトリ登録,push等を行う。

```bash
cd local_l5
git init
git add .
git commit -m "1st commit."
git remote add origin ssh://servername/var/www/test.git
git push origin master
```

リモートリポジトリの登録を間違うなどして消したい場合は、

```bash
git remote rm origin
```

とすればいい。登録されているリポジトリを見るには単に、git remoteでよい。

###４）テストサーバ等でclone(pull)

テストサーバや本番サーバの所定の位置で、cloneをかけます。
ディレクトリ名を指定しないとリポジトリ名（ここだとtest）になるので、test_l5と指定。

```bash
git clone ssh://servername/var/www/test.git test_l5
```

実運用では、/var/www/html等のApacheのDcumentRootとかになるでしょうね。

###５）.envの準備と編集

cloneした先で.envを編集します。0から作ってもいいですし、cloneさている.env.sampleをリネームして用意してもいいでしょう。

必要に応じてDBの接続情報、メール送信サーバ等を編集します。

>５）と６）は順番が入れ替わっても何ら問題ありません。

###６）composer installの実行

冒頭触れた通り、/vendorが全くコピーされていないので、そのままでは動きません。

```bash
cd test_l5
composer install
```

として、各種ライブラリをインストールします。既にローカルでcomposer updateをかけている場合はcomposer updateでもいいと思います。

####動作確認

ここで一度、動作確認しておくといいでしょう。

テスト等でビルトインサーバを使いたい場合は、Firewall(あるいはiptables)を編集し8000を許可する必要があります。

iptablesで制御している場合は、/etc/sysconfig/iptablesに下記を加えます。AWSやAzure等を利用している場合は、サービス側でポートを空けます。

```bash
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8000 -j ACCEPT
```

あと、ビルトインサーバ起動時に --host 0.0.0.0等のオプションを付与する必要があります。

```bash
php artisan serve --host 0.0.0.0
```

などとし、外部からのアクセスを許可する必要があります（通常はローカルからのみの許可になっているようです）。

>５）と６）は順番が入れ替わっても何ら問題ありません。

###７）ローカルでの編集とpush

ローカルでLaravelを編集します。git add .,commitを繰り返すことになるでしょう。
編集が一段落したらリモートリポジトリにpushします。

```bash
cd local_l5
git add .
git commit -m "編集しました。"
git push origin master
```

###８）テストサーバ等でpull

一度cloneしたファイル群に変更を反映するには、

```bash
cd test_l5
git pull
```

とします。後は、基本７）と８）を繰り返すことになります。
ここではpullしていますが、必要に応じてfetchとかでも。お好みで。ただ、デプロイを目的とするならpullで問題無いかと思います。

簡単ではありますが、こんな感じです。

##その他

展開先で問題があった場合、元に戻す必要があります。特に本番環境など。

###履歴を見る

```bash
git log
```

###1つ前に戻る

```bash
git reset -hard HEAD
```

###任意のコミットに戻る

```bash
git reset --hard 518198b8041000c5d5843f5d7b68ee4434fbc71f
```