Laravelプロジェクトをgit管理下に置くには

筆者の環境では、Laravelアプリケーションの本番リリースフローは次の通りであった。

**1. ローカル環境で、開発およびテスト**
**2. 本番環境にアップロード**

自分ひとりで開発から運用まで担当しているので、これでもさして不都合が無かったわけだが、規模が大きくなったのを機に、次の通り改めることにした。

**1. ローカル環境（新開発環境）で、開発**
**2. リモートリポジトリに push**
**3. ステージング環境で pull し、テスト**
**4. 本番環境で pull**

Laravelプロジェクトファイル一式を git 管理下に移したので、手順を共有する。

# 移行手順
本番環境がもっとも信頼できそうだったので、まず本番環境内にローカルリポジトリを作成し、リモートリポジトリに最初のコミットをすることにした。
## リモートリポジトリの作成
リモートリポジトリはどこに作っても良いが、本稿では GitHub に用意するものとして説明する。
![リモートリポジトリ作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/ab0da2f0-8793-e8af-cdf7-acd490c4b0f2.png)
この辺は特に解説不要かと思う。

## 本番環境のオペレーション
### git のアップグレード
今の本番環境は CentOS 7.6 なので git のバージョンが古かった。

```
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

$ git version
git version 1.8.3.1
```

CentOS7 で git を 2系 にアップグレードする方法はいくつかあるようだ。
https://qiita.com/mao172/items/f8bb0a7c740f9cc931fb
https://qiita.com/d-dai/items/3cc0c8c81911d5b6cce5

自分は以下のように対応した。

#### IUSリポジトリを追加
```
$ yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

#### 標準パッケージをより新しいバージョンで置き換え
```
$ yum shell
> erase git
> install git224
> run
```

```
$ git version
git version 2.24.3
```

### git の初期設定
#### ユーザ名とメールアドレスを設定
```
git config --global user.name "[user name]"
git config --global user.email [email address]
git config --list
```

#### ssh鍵ペアの作成
GitHub は様々な認証方式に対応するが、パスワード認証は使うべきではない。
なお、2021年8月に GitHub はパスワード認証を廃止することが決まっている。[*Gigazine](https://gigazine.net/news/20201219-github-token-git-operations/)

```
ssh-keygen -t rsa -b 4096 -C "[comment]"
```

秘密鍵（*id_rsa*）と公開鍵（*id_rsa.pub*）は`~/.ssh`に作成される。

本稿では、リスクを承知で、秘密鍵をパスフレーズ保護しないことにする。
本来なら、パスフレーズ保護して *ssh-agent* に登録するのがセオリーである。
鍵生成時にデフォルト以外の鍵を指定した場合は `~/.ssh/config` の作成も必要になる。

公開鍵（*id_rsa.pub*）を https://github.com/settings/keys に貼り付ける。
Title には、どのデバイスの鍵か分かる情報を入れると良いと思う。
![sshkey](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/10c86852-8a9a-6cb8-f494-715c9823632c.png)

#### 接続テスト
```
ssh -T git@github.com
```

失敗するときは`-vvv`オプション（verbose mode）を付けてトレースしてみる。

### リモートリポジトリに push
Laravelプロジェクトのルートディレクトリで行う。

```
cd /var/www/html/[project name]
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:[account name]/[repository name].git
git push -u origin main
```

> 10月から既定のブランチ名が master から main に変わっているので留意。
この変更は、master/slave が奴隷制度を連想させることへの配慮だ。

`git init` からやり直したくなったり、取り消すときは、`rm -fr .git` としてしまって良い。

## 新開発環境のオペレーション
本番環境と同様に、ユーザ名とメールアドレスを設定する。
sshの鍵は、新規に作成するか、先ほどの鍵を使い回す。Windows10（OpenSSH）の場合、鍵は`%USERPROFILE%\.ssh`に置く。

### リモートリポジトリから git clone
Laravelのインストール先（通常はApacheのドキュメントルート）で行う。

```
cd /var/www/html
git clone git@github.com:[account name]/[repository name].git
cd [project name]
```

`.gitignore` に含まれている `/vendor` と `.env` は展開されないので、自分で作成する。

### /vendor (Laravel本体) の作成
```
composer install
```

でOK。`composer.lock`の内容をもとにパッケージのインストールを行うので、パッケージのバージョンはリモートと一致するはずだ。
`composer.lock`が無ければ`composer update`でも良いが、`Updating dependencies (including require-dev)`の表示後にフリーズする場合がある。原因は様々だが、筆者の環境では`composer self-update`でcomposer自身をアップデートするだけで上手くいった。

### .env の作成
新開発環境用の `.env` を作成するか、以前の開発時に使っていた `.env` をコピーする。

### 動作確認
新開発環境でLaravelアプリが動作することを確認。

### README.md の更新
必須では無いが、新開発環境からのコミットテストも兼ねて README を更新（新規作成）してみる。

*Name, Overview, Author* などを追記。
社内向けのドキュメントがあれば、そのリンクを *Document* に追記。なければ、*Description, Requirement, Usage, Note, Deploy* などを追記。

### リモートリポジトリに push
これを「作業A」とする。

```
git add README.md
git commit -m "add README file"
git push
```

Visual Studio Code からなら下図のような操作になる。
![vscode](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/b14db5cd-dca6-bdda-ecfb-d013ab70b6da.png)

## 本番環境のオペレーション
これを「作業B」とする。

```
cd /var/www/html/[project name]
git pull
```

# 本番リリース手順
新開発環境で「作業A」、ステージング環境と本番環境で「作業B」、これを繰り返すことになる。