【Rails】Capistranoを使用した自動デプロイが途中で止まる！エラー解決まとめ【随時更新】

## はじめに
### 環境
- Rails 5.2.1
- ruby 2.5.1
- capistrano 3.11.1
- AWS(EC2)
- Web Server Nginx
- Application Server Unicorn

### 前提
EC2インスタンスの生成、sshキーとGitの接続などデプロイ完了後、
自動デプロイに必要なCapistranoの設定を終えた段階。
ローカルで【**bundle exec cap production deploy**】を叩いた際に発生したエラーのメモです。
尚、今回チーム開発中のため、個人では無い現象もあるかもしれません。

### 初心者向け：エラーログの確認方法
止まった箇所のエラー文でピンと来ない時は詳細を本番環境のlogで確認する必要があります。
確認する際はcapistranoの導入で確認するべきlogのカレントが変わっている場合に要注意。

【例】
本番環境(ssh接続)→cdでapplication-nameへ移動
application-name
∟current
∟log
∟**production.log  unicorn.stderr.log  unicorn.stdout.log**


## エラー内容
- SSHキー関連
- bundle install で止まる
- asset compile で止まる
- unicorn start で止まる


## SSHKeyの認証エラー
###SSHKit::Runner::ExecuteError
そもそも自動デプロイが始まらない。
設定したのにssh鍵がない？と思いながらも下記記事参考に再設定。動きました。感謝。

```local.
.ssh $ ssh-add ~/.ssh/hoge.pem
#設定できたら下記表示
Identity added: /Users/xxxx/.ssh/hoge.pem (/Users/xxxx/.ssh/hoge.pem)
#再度自動デプロイのコマンド実行
```
[Capistranoで自動デプロイした時に出たSSHKit::Runner::ExecuteError解決法](https://qiita.com/aoitrain/items/90036ec9c24f0566711e)

ただ、使用予定のキーがある場合は、別のエラーが考えられるので、再設定前に確認した方が無難。ファインダーで見る場合は、念の為隠しファイルを表示「command + shift + .」してみるのも◎

```irb:local.
#ターミナルで確認
username:~ $ cd ~/.ssh
username:.ssh $ ls
hoge.pem	known_hosts
```

## bundle installで止まる!
### まずはここを確認
- error文
- Gemfile、Gemfile.lock
- バージョン指定・使用環境の指定など、Gemfileでの記述にミスは無い？
- bundle installはできている？
- bundle updateは？
- インスタンスの再起動は？

### 例① 使用環境の指定ミス
`エラー文`
deviseが、developmentのみで使用することになっていた。
#### 解決！
developmentの外に出して解決。
アプリケーションの枠組みを作った段階でのデプロイで、gemを本番環境で使用する前だったため発生。

```Gemfile.
group :development do
gem 'hoge'
end
gem 'devise'
```

### 例② よく分からんアップデート系errorは再起動での回復率お高め〜nokogiri編〜
`エラー文`

使う予定の無いスクレイピングのgemについてのエラーで困惑。
gemfileにもgemfile.lockにも記述なし。
長々と重要なお知らせを含むエラー文が出ている。
#### 解決？
こちらに関しては、色々調べた結果どれも当てはまらず
ローカル・本番環境それぞれでbundle installのし直しとインスタンス再起動で解消。

## asset compileで止まる！
### まずはここを確認
```irb:production.log
# 本番環境でlog表示（less or cat）
＄ less log/production.log
```

### 例① template error

```irb:production.log
# エラー抜粋
ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.):

```
logから原因となるファイルを確認。
SCSSに変更してview作成を進めていたが、拡張子がCSSのままのapplication.cssがあったため発生。

#### 解決
application.scssに変更する。

### 例② syntax errorでコンパイルに失敗

scssの記述で不備。
「とりあえず表示させるページを作る」となったが、
初めてのチーム開発でコードレビューの精度の低さ・環境構築とでき上がったページのmergeが同時並行だったことに起因した。

#### 解決
不備のあったファイルの修正とmerge。
自動デプロイをかける前に、ローカルで全変更ページの確認すること。

## unicorn startで止まる！
### まずはここを確認
```irb:unicorn.stderr.log
# 本番環境でlog表示（less or cat）
＄ less log/unicorn.stderr.log
```

### 例① deviseでNameError
```irb:unicorn.stderr.log
# エラー抜粋
devise.rb:3: uninitialized constant Devise (NameError)

```
#### 解決
application.rbへの追記を試したところ、解決。

```config/application.rb
require 'devise'
```
[参考ページ（GitHub）](https://github.com/plataformatec/devise/issues/1605)

### 例② SyntaxErrorで起動できなかった
```irb
# エラー抜粋
SyntaxError: /var/www/freemarket_sample_58d/releases/20190925060438/app/controllers/card_controller.rb:157: syntax error, unexpected end-of-input, expecting keyword_end
end
     ^
  /var/www....
```
#### 解決
明記してある通り、endの数を正しく修正。
実装中でTODOにしている箇所で、コメントアウトしたコードと合わずに発生。

### 例③ mysql.sock' (2) 
```irb:unicorn.stderr.log
# エラー抜粋
ERROR -- : Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) (Mysql2::Error::ConnectionError)
```
ソケットの場所が異なるもしくは無い場合など。
#### 解決
再起動すれば生成されるので、一度試す。（起動自体できるかどうか）
直らない場合は、パスで記載されている場所を`my.conf`・`database.yml`で確認し`mysql.sock`を作成したり、パスの記述を修正する。

```本番環境/etc/my.cnf
```
```database.yml
```

### ② mysql.sock' (38) 
coming soon...
### ③ mysql.sock' (111) 
coming soon...



##最後に
学習を始めて2ヶ月目。まだまだ何も分からない状態のため、備忘録として更新していきます。
誤った記述があればご指摘ください＾＾
原因の説明など不足している部分は多々あると思いますが、役に立つことがあれば幸いです。