Herokuのデプロイでハマった所

# はじめに
この間、はじめてherokuのサーバにポートフォリオをデプロイしました。

すごく拙いサイトですが、デプロイできた時の感動はすごかったです。

デプロイする際にはこちらの記事を参考にさせていただきました。
https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

今後また、別のアプリケーションをherokuにデプロイする時がやってくると思うので、ハマった所とお世話になったサイトを忘れないうちにメモ。

Ruby on Railsで作ったアプリをデプロイしました。

# git push heroku masterができない
## 現象
上記のサイトを参考にしつつ、heroku loginを実行し、ログインしました。
そして、いざgit push heroku masterでデプロイを実行しましたが、以下のような文言が出ました。

```
remote: !       WARNING:
remote: !       Do not authenticate with username and password using git.
remote: !       Run `heroku login` to update your credentials, then retry the git command.
remote: !       See documentation for details: https://devcenter.heroku.com/articles/git#http-git-authentication
fatal: Authentication failed for 'https://git.heroku.com/xxxxxxxxx.git/'
```
[こちら](https://qiita.com/mobilebiz/items/f333772622ac28d58e95#do-not-authenticate-with-username-and-password-using-git)の記事を参考に、heroku auth:tokenでトークンを発行しても、git push heroku masterでユーザー名とパスワードを聞かれない。

## 解決
こちらの記事のおかげでなんとか回避できました。

https://qiita.com/shiroux/items/f0e1844ff3ef301d88b9

以下を実行したらいけるようになりました。

```
git config --global url.ssh://git@heroku.com/.insteadOf https://git.heroku.com/
```

# precompile中にUglifier::Error
## 現象
push中、assetのprecompile中にエラーが出ました。
メッセージは以下の通りです。

```
remote:        Uglifier::Error: Unexpected token: keyword (const). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
<中略>
remote:        Tasks: TOP => assets:precompile
```

ローカル環境では以下のコマンドで現象が再現できると思います。

```
rake assets:precompile
```

## 解決
Gemfileの以下の行のコメントを外し、bundle installしてみました。

```ruby:Gemfile
gem 'therubyracer', platforms: :ruby
```

[こちら](https://qiita.com/Kohei_Kishimoto0214/items/1da88849eb298de7f9a6)を参考に、production.rbの中を以下のように変えてみたら、うまくいきました。

```ruby:production.rb
# 変更前
config.assets.js_compressor = :uglifier

# 変更後
config.assets.js_compressor = Uglifier.new(harmony: true)
```

# precompile中にundefined method[]
## 現象
push中にasset precompileで失敗。

メッセージは以下の通り。

```
NoMethodError: undefined method[]' for nil:NilClass`
```

## 解決
application.cssをapplication.scssに名前変更したら解決しました。

# precompile中にundefined method start_with?
## 現象
やっと直ったと思いきや、またしてもprecompile中にエラーが発生。
今度は以下の通り。

```
undefined method `start_with?' for nil:NilClass
```

## 解決
こちらはapplication.scssの中で、いちいちscssをimportしていたのですが、それをrequire selfとrequire treeに書き換えたら解決しました。

```scss:application.scss
// 変更前
@import 'examples/example1.scss';
@import 'examples/example2.scss';

// 変更後
/*
 *= require_tree .
 *= require_self
 */
```

# 変更した内容がpushに反映されない
## 現象
production.rbなどを修正して、ローカル環境でできることを確認してから、git push heroku masterをしても、同じエラーが出続けました。

変更した内容が反映されないのはなんでだろうと少し疑問に思いましたが、考えてみればすごく単純なことでした。

## 解決
ブランチがmasterじゃなく、developブランチになっていました。
developをpushしたい場合、git push heroku developにすれば良いのかと後で気づきました。

気づいてみればバカバカしかったですが、反映されない現象が起こったら、ブランチを切っていないか疑ってみてください。

# Can't connect to local MySQL server through socket '/tmp/mysql.sock'
## 現象
上の問題を片付け、やっとherokuにデプロイができたと思ったら、もちろんデータベース、テーブルを切らないと動かないことに気づき、以下のコマンドを実行。すると、

```
heroku run rake db:migrate
```

以下の文言が。デプロイする時に見慣れたメッセージなので、直るだろうと、たかをくくっていましたが、結構ハマりました。

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
```

## 解決
HerokuはデフォルトではPostgreSQLを使うように設定されていました。自分のアプリはMySQLだったので、ちゃんと動かなかった。

MySQLで動かすには別途アドオンを入れる必要があり、そのアドオンを入れるにはクレジットカードの登録が必要。

右上のユーザーアイコンから[Account Settings]→[Billingタブ]→[Billing information]からクレジットカードを追加。

そのあと、cliから以下のコマンドを実行。

```
heroku addons:create cleardb:ignite
```

# アプリ内でメールが飛ばせない
## 現象
やっとのことでデプロイが完了しました。そして、サイトも見れるようになったのですが、Contactの部分のメールを送信する部分がなぜか動かない。

ローカル環境だと上手くいくのに、デプロイした後だと動かない。

## 解決
こちらも単純でした。送信するのにgmailを使っていたのですが、gmailが外部からのログインを弾いていただけでした。

[Googleアカウント]の検索ボックスに[安全性の低いアプリのアクセス]を入れ、[安全性の低いアプリの許可: 有効]にするだけでいけました。

# おわりに
こう見てみると、precompileのエラーが非常に多いですね。
今度からはreact.jsやvue.jsを使って開発したいと思います。