gitを使ったデプロイ方法


以前に[さくらVPSにGitの中央リポジトリを置く(for Mac) - Qiita](http://qiita.com/__mick/items/d28ca37b29bb41cd2f0f)という記事を書きましたが、タイトルと内容がアレなので書き直します。

## 目標
開発環境から`git push`するだけでデプロイ完了

## 環境
- Local  : MacOS 10.10.2
- Server: CentOS release 6.6 (さくらVPS)

## 概要

![スクリーンショット 2015-03-27 11.26.12.png](https://qiita-image-store.s3.amazonaws.com/0/4784/d87b3ef5-8d9a-823a-c027-27f593dfad45.png)


- localで開発してgitで管理。ここにローカルリポジトリがある。(図Z)
- リモートリポジトリをVPSに置く(図A)
- VPSの別の場所に本番実行用のリポジトリをクローンする(図X)
- [GitHub](https://github.com/)や[Bitbucket](https://bitbucket.org/)を使っている場合はリモートリポジトリを2つにする。(使わなくてもOK)(図B)
- Local(Z)でpushしたら、VPS側のlocal(X)は自動でpull & プロセスの再起動をする

簡単に言うと、ZからXにデプロイするのにAを経由するということです。



## 下準備

### .ssh/configの設定をしておく

Macはもともとターミナルから簡単にSSHでサーバーにログインできますが、以下の設定をするともっと簡単になります。  
~/.ssh/config というファイルを作ります。

```bash:.ssh/config
host sakura
  HostName     ***.***.***.**
  Port         12345
  User         myname
  IdentityFile ~/.ssh/id_rsa
```

HostName :IPアドレス or ドメイン  
Port :接続用のPort番号  
User :ログインユーザー名  
IdentityFile :ssh鍵の場所  

以上の様に設定していると
`ssh sakura`
だけでログインできるようになります。
そして
`sakura:/home/hoge/`
という風にパスを指定することができます。

参考: [ssh 接続を簡単にする ~/.ssh/config | dogmap.jp](http://dogmap.jp/2011/10/27/ssh_config/)

## 手順
### サーバーにリモートリポジトリを作成する
サーバーにssh接続して適当な場所にリモートリポジトリ(A)を作成します。

 ```bash
 $ ssh sakura
 SAKURA Internet [Virtual Private Server SERVICE]
 $ cd /home/user1/gitRemote
 $ git init --bare hogeProject.git
 ```
 
ローカル(Z)に戻り、リモートリポジトリを設定します。 

```bash
$ git remote add origin sakura:/home/user1/gitRemote/hogeProject.git
```
### すでにリモートリポジトリが存在する場合は
もしすでに[GitHub](https://github.com/)や[Bitbucket](https://bitbucket.org/)を設定している場合に`remote add`すると弾かれるので以下の設定をします。  
これをすると`git push`した時にA,B両方のリモートへ同時にpushできます。

ローカル(Z)の`.git/config`にAのurlを追加してoriginを2つにします。

```
/// 変更前
[remote "origin"]
	fetch = +refs/heads/*:refs/remotes/origin/*
	url = git@github:hoge/hogeProject.git
```

```
/// 変更後
[remote "origin"]
	fetch = +refs/heads/*:refs/remotes/origin/*
	url = git@github:hoge/hogeProject.git
	url = sakura:/home/user1/gitRemote/hogeProject.git
```

これで`push origin`した時にそれぞれのremoteへ同時にpushできます。

### pushしてみる
ここまででリモートリポジトリの準備はできているはずなので、試しにpushしてみます。  
ローカル(Z)から

```bash
$ git push origin master
```

VPSで確認してみましょう。

```bash
$ ssh sakura
SAKURA Internet [Virtual Private Server SERVICE]
$ cd /home/user1/gitRemote/hogeProject.git
$ git log
```

### VPSでcloneする

本番実行ファイルを設置します。  
適当な場所(X)に移動して`git clone`します。  
もちろん本番環境(VPS側)での作業です。

```bash
$ cd ~/myProject
$ git clone /home/user1/gitRemote/hogeProject.git
```

これで`/home/user1/myProject/hogeProject`にファイル設置完了です。


### git hookの追加

pushした時にVPS側で自動pullする設定をします。  

Localでpushする＝remoteでreceiveする(受ける)ということなので、`hooks/post-receive`を設定します。  
VPS側のremote(A)に書きます。Local(Z,X)ではないので注意。

まずデフォルトでhooks/post-receive.sampleというファイルがあるのでこれをリネームします。

```bash
$ cd /home/user1/gitRemote/hogeProject.git
$ mv hooks/post-receive.sample hooks/post-receive
```

vimでもnanoでもemacsでも好きなエディタで編集します。

```bash
$ vim hooks/post-receive
```

hooks/post-receiveの内容

```bash:post-receive
cd /home/user1/myProject/hogeProject
git --git-dir=.git pull
```

注意点としては、単に`git pull`と書くと「そこリポジトリじゃねぇよ！」と怒られますので`git --git-dir=.git pull`とします。

post-receiveに実行権限が無い場合は設定しておきます。  
(post-receive.sampleからリネームした場合は不要)

```bash
$ chmod a+x hooks/post-receive
```

これで設定完了です。適当にlocalでファイルを編集して、commit & pushしてみてください。
自動でXに移動してpullまでしてくれます。  

それ以外の操作をしたい場合(例えばPM2でプロセスを再起動させたい時など)は以下の様に書くとOKです。

```bash:post-receive
export PATH=$HOME/.nodebrew/current/bin:/usr/local/bin:$PATH
cd /home/user1/myProject/hogeProject
git --git-dir=.git pull
pm2 startOrRestart /home/user1/myProject/hogeProject/pm2_deploy.json
```

単に`pm2 startOrRestart`と書くとパスが通ってない場合があるので「PM2というコマンドはありませんよ」みたいなエラーが出ます。  
上記ではnodeのパスをexportしています。


## まとめ

1. Aで`git init --bare`
1. Zで`git remote add`
1. すでにgitHub等にリモートを設定している場合は`.git/config`を編集してoriginに追加
1. Zのリポジトリを`git commit & push`
2. Xで`git clone (A)`
3. Aのhooksを編集

ここまで設定しておくと、あとはZでpushするだけでデプロイできるようになります。

## おまけテンプレート


hooks/post-receive.sampleの名前変更

```bash
mv hooks/post-receive.sample hooks/post-receive
```

hooks/post-receiveの基本設定

```bash:post-receive
export PATH=$HOME/.nodebrew/current/bin:/usr/local/bin:$PATH
cd /path/to/project
git --git-dir=.git pull
```