Gitを使って簡単にデプロイできるようにしたい【初心者向け】

Qiita初投稿です。自分の理解の整理も兼ねて。
早速始めます。

## 目標
GitにPushしたら自動でサーバーにデプロイできるようにする。
Herokuを今まで使っていたのだが、ラズパイで自分でサーバーを建てたので同じ仕組みを実現したい。

![git_deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451958/4a285d63-ef7c-eb66-b5a4-96d672dbc6ef.png)


## 概要
###作業の流れ
#### サーバー側
1. Gitリポジトリ作成
1. デプロイ先にclone
1. 自動化のためのフック作成

#### クライアント側（こちらで開発）
1. Gitリポジトリ作成
1. Git remoteの設定
1. pushしてデプロイ！

### 環境
- Raspberry Pi 4 Model B
    - Git 2.2
    - Apache
- MacBook Pro
    - Git 2.24

※サーバー側、クライアント側共にGitをインストールしておく
※サーバー・クライアント間でSSHで接続できるようにしておく

## 開始
### 定義
ここでは下記のように進めます。各自読み替えてください。

- Gitリポジトリを置く場所
    - /hoge/fuga/git
- Gitリポジトリ名
    - sample.git
- デプロイ先
    - /var/www/piyo/sample

### まずはサーバー側でGitリポジトリを作る
サーバー側の任意の場所に移動してGit用のディレクトリを作成します。

```
cd /hoge/fuga/git
mkdir sample.git
cd sample.git
git init --bare
```

`git init`でGitリポジトリの初期化ができる。オプションの`--bare`は他のリポジトリからpushできるようにするために必要。
`--shared`オプションを付ければ、グループで共有するときに便利らしいが、今回は使わない。必要な場合は参考文献の記事を参照。
***
#### 脱線）ベアリポジトリ・ノンベアリポジトリとは
違いはワーキング・ディレクトリ（実際のファイルがあるディレクトリ）を持つか持たないか。

1. 実際のファイルを持つノンベアリポジトリで開発したものを、
1. 更新情報だけを持つベアリポジトリにpushして管理する
1. ベアリポジトリの更新時にフックが発火し、デプロイ先にpullされる（実際のファイルが作られる）

![git_deploy_bare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451958/c4e2ea44-ab51-b867-5d7d-aaf9c6eb3504.png)


ここの話はこの記事が詳しい。
[ベアリポジトリとノンベアリポジトリ：理論編〜GitでWordpressのテーマを管理](https://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git)
***
#### note
Gitリポジトリを管理者権限で作成した場合は、所有者を変更しなければpushできない。
SSHでログインするユーザーに変更しておく。
例）`pi@192.168.1.1`でSSH接続するならば、ユーザー`pi`に所有者を変更する。

```
cd /hoge/fuga/git
sudo chown pi.pi -R sample.git
```

***
### 次にクライアント側でGitリポジトリを作成
デプロイしたいファイルがある階層に移動し、Gitリポジトリを作る。こちらは実際のファイルを持つノンベアリポジトリなので、`--bare`は付けない。

```
cd /path/to/your/app
git init
```

### remoteの設定
クライアント側にファイルの送信先の設定をする。ファイルの転送にはSSHを使うため、サーバー・クライアント間でSSHの設定を済ませておく。

```
git remote add origin ssh://ユーザー名@IPアドレス/hoge/fuga/git/sample.git
```

例えばユーザー名が`pi`、ローカルネットワークのIPアドレスが`192.168.1.1`であれば、`ssh://pi@192.168.1.1/hoge/fuga/git/sample.git`
ポートを指定する場合は、`ssh://pi@192.168.1.1:22222/hoge/fuga/git/sample.git`のようにする。

### pushしてみる
これから更新するたびに下記の動作をすることになる。そのうち指が超高速で動くように。

```
git add .
git commit -m "First Commit"
git push origin master
```

***
### デプロイ先にclone
サーバー側に戻る。git pullする設定をする前に、まずはファイルを展開したい場所にcloneしてやる必要がある。

```
cd /var/www/piyo
git clone /hoge/fuga/git/sample.git
```

中を見るとgit pushしたファイルがあるはず。

```
cd sample
ls
```

### 自動化のためのフック作成
フックとはGitリポジトリに特定のアクションが起きたときに発火するスクリプト。
post-receiveというファイルをhooks内に作る。

```
cd hoge/fuga/git/sample.git/hooks
nano post-receive
```

```shell:post-receive
#!/bin/sh
cd /var/www/piyo/sample
git --git-dir=.git pull
```

これ以外にもスクリプトを書くこともでき、私は変更を反映するため`sudo systemctl restart apache2`と書き足した。

作ったら実行権限を与えてやる。

```
chmod +x post-receive
```

コマンドを打って動くかどうか確認。

```
./post-receive
```

もう一回、`git add .` `git commit -m "piyopiyo"` `git push origin master`の一連の流れをやってみてちゃんとデプロイされてるか試してみて、新しいファイルがあればOK。
ダメだったら、デプロイ先のディレクトリにSSHでログインするユーザーに書き込み権限があるか等を確認してみる。

以上、最後まで読んでいただきありがとうございました。
間違いがあれば、コメントで知らせていただけると助かります。


## 参考文献

[gitでシンプルなデプロイ環境を作る](https://qiita.com/zaburo/items/8886be1a733aaf581045)

- グループで管理したい場合はこの記事の最後を見ると良い

[自前のサーバーにGitリポジトリを作成してプッシュでサイト更新する](https://qiita.com/laineus/items/d61e004545ef0ef0b004)