【AWS】 EC2にデプロイしたRailsアプリを更新する方法

#はじめに
最近は初学者でもRailsアプリをAWSのEC2にデプロイする人が増えてきました。
そしてデプロイした後も機能の追加や修正をして更新したい！と思う方は多いかと思います。
しかし自動デプロイを設定するのは大変、いち早く再デプロイしたいと思う方もいるでしょう。
そこで**「手動」デプロイ**する方法を自分自身の体験も含め、初学者向けにまとめておきます。

*複雑な変更を加えた場合はご自身で必要な操作を調べてください。
*コマンドの実行は慎重に！
#この記事の対象者
* 以下のどちらかの記事を参考にし、VPCの作成からEC2にRailsアプリを公開した人
 * [【画像付きで丁寧に解説】AWS(EC2)にRailsアプリをイチから上げる方法](https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2)
 * [(下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
 
* 自動デプロイの設定をする前にアプリを更新したい人
* GitやGitHub、環境変数の基本的な使い方や仕組みを理解している人

特にGitやGitHubの基本的な使い方を理解していないと、APIキーを公開してしまったり思わぬコンフリクトが発生してパニックになったり、痛い目に合うかもしれません。
先にGitやGitHubの使い方を学習することを推奨します。

**理解を深めるため、最後の「おまけ」に載せた記事も参考にしてみてください。**
# 前提
* 簡単な例としてローカルのmasterブランチを編集し、その後EC2内のmasterブランチを更新する。
* [【画像付きで丁寧に解説】AWS(EC2)にRailsアプリをイチから上げる方法](https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2)を参考にデプロイしたRailsアプリを想定　（この記事の続きにあたる部分を意識して執筆します）


環境: MacOS, GitHub, EC2, Nginx, Unicorn
#手順

##１.ローカルで編集し、GitHubにpushする
はじめは練習として背景の色を変える程度で良いかもしれません。
ブランチやプルリクはご自身のルールに沿って適宜変更してください。
**APIキーなどを追加したら、環境変数などを用いてGitHubに公開しないよう注意してください！**

```shell:ローカル環境
$ git add . #ご自身の変更に合わせて
$ git commit -m"コミットメッセージ"
$ git push origin master
```
余談ですが、APIキーなどセキュリティに関わる設定をした後``push``した場合、GitHubに登録したメアドに[GitGuardian](https://www.gitguardian.com/)から警告メールが来ていないか確認した方がいいです。
ごく簡単に言えば、GitGuardianは``push``した時リポジトリ内に秘密鍵などが含まれていないかチェックしてくれています。
実はみなさんが普段行っている``push``も裏でGitGuardianが見守ってくれているのですね。

すみません、脱線してしまいました。


##2.EC2にログインする
話を戻して、実際にサーバーへログインしましょう！

```shell:ローカル環境
$ ssh アプリ名_key_rsa
```
##3.アプリディレクトリに移動
```shell:サーバー環境
$ cd /var/www/rails/アプリ名
```
##4.Unicornのプロセスを停止する
プロセスとは簡単に言えば、実行中のプログラムのことです。
``unicorn.pid``のpidは``process ID``のことで、プロセスの識別子にあたります。
なので`cat tmp/pids/unicorn.pid` を実行すると、25902のような番号が表示されます。

ちなみにproduction環境はキャッシュによって即座に変更が反映されません。

> [Rails のキャッシュ機構](https://railsguides.jp/caching_with_rails.html)
> キャッシュは、デフォルトではproduction環境でのみ有効になります。

そこで``pull``する前にUnicornのプロセスを停止しておきます。
このコマンドを実行したら再起動させるまではサイトにアクセスできなくなるため、注意してください。

```shell:サーバー環境
$  kill -QUIT `cat tmp/pids/unicorn.pid`
```
##5.アプリの変更を取り込む
2通りやり方があるのですが、後者の方が事故りにくいです。

``pull``で一気に変更を取り込む場合はこっち

```shell:サーバー環境

$ git pull origin master
```
``pull``より慎重に取り込みたい場合はこっち

```shell:サーバー環境
$ git branch #masterブランチにいることを確認
$ git fetch
$ git diff origin/master #変更した差分を確認
$ git merge origin/master
```
仮にコンフリクトが起きても慌てず解消しましょう。
##6.必要に応じてコマンドを打つ
変更した内容に応じて適宜コマンドを実行しましょう。
###bundle install
```shell:サーバー環境
$ bundle install
```
###rails c
```shell:サーバー環境
$ bundle exec rails c -e production
```
###migrate
```shell:サーバー環境
$ rake db:migrate RAILS_ENV=production #本番環境でmigrate
```
本番環境なので``RAILS_ENV=production``の部分を忘れずに！

ここで紹介したコマンドは一例なので、必要があらばご自身で調べてください。


##7.プリコンパイルする
アセット（JavascriptやCSS、画像）をプリコンパイル（それらの連結・圧縮など）します。
画像がうまく表示されない場合や色の変更が反映されない場合は、プリコンパイルできていない可能性があります。
アセットパイプラインやプリコンパイルについて詳しく知りたい方は[こちら](https://railsguides.jp/asset_pipeline.html)

```shell:サーバー環境
$ bundle exec rake assets:precompile RAILS_ENV=production
```
##8.Unicornの起動
最後にUnicornを起動させましょう。

```shell:サーバー環境
$ unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E production
```
##9.動作確認！
アプリのURLにアクセスし、再読み込みしてみましょう。
変更が反映されていたら成功です！
#最後に
私自身経験が浅いため、説明不足や誤った点があるかもしれません。
記事は随時アップデートしていきたいと思います。
お疲れ様でした！
#参考
* [AWS（EC2）本番環境へのデプロイ手順をついつい忘れがちなのでメモ](https://chopesu.com/aws/deploy-processes/)
* [「アセットパイプライン」を学ぼう](https://diveintocode.jp/blogs/Technology/AssetPipeline)
#おまけ
役に立ちそうな記事を載せときます。

* UnicornやNginx、Rackについて詳しく知る
[なぜrailsの本番環境ではUnicorn,Nginxを使うのか? 　~ Rack,Unicorn,Nginxの連携について ~【Ruby On Railsでwebサービス運営】
](https://qiita.com/takahiro1127/items/fcb81753eaf381b4b33c)

* Gitコマンド集
[基本的なGitコマンドまとめ](
https://qiita.com/2m1tsu3/items/6d49374230afab251337)

* Git入門
[サル先生のGit入門](
 https://backlog.com/ja/git-tutorial/)
* デプロイでエラーが発生した時に使えそうなコマンド
[【AWSとか】デプロイ時のエラー出たときに使いそうなコマンド集](
https://qiita.com/yu9penguin/items/c43bee32718f77137319)
* RailsアプリをAWSにデプロイして独自ドメイン&SSL化まで
[【画像付きで丁寧に解説】AWS(EC2)にRailsアプリをイチから上げる方法【その1〜ネットワーク,RDS環境設定編〜】](https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2)