Rails新規プロジェクトを実装する時のセットアップまとめ

[エンジニアとして自社開発企業に入社](https://qiita.com/kenzoukenzou104809/items/0c77af2e9695c3eb8466)して２ヶ月目で新規のプロダクト開発を任せてもらえることとなりました。その時に先輩に教えてもらいながら、セットアップしたことなどをまとめてみます。

## 対象

この記事はエンジニアになるために**現在ポートフォリオ作成中の方**などの参考になるかと思います。以下で書いている内容のセットアップを行えば、「ある程度綺麗なコード」を書けるからです。

## コードをきれいに保つ

### .editorconfigの設定

`EditorConfig`は複数の開発者が関与する時に、コーディングスタイルの一貫性維持に役立ちます。僕はVS Codeを使っているので、プラグインをインストールすることで対応しました。

- [EditorConfig](https://editorconfig.org/)
- [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig)

設定例

```
root = true

[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
end_of_line = lf

```


### RuboCopでコードを解析する

RuboCopは長すぎるコードやインデントなどを解析し自動修正までやってくれる優れものです。僕含め経験が浅い人がコードを書くと、不要な改行やスペースが多分に含まれてしまうので、必須のgemです。

使用方法

```ruby
gem 'rubocop', require: false
```

```
# 自動解析実行
$ rubocop

# 自動で修正まで実行
$ rubocop --auto-correct
```

- [RuboCop](https://github.com/rubocop-hq/rubocop)
- [RuboCop is 何?](https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b)


### overcommitでコミットタイミングでRuboCopを走らせる

`overcommit`というgemを入れておくと`git commit`を実行するタイミングで上記で設定したRuboCop等を走らせることができます。

**設定方法**

```
# gemをinstall
$ gem install overcommit

# アプリケーションにovercommitをinstall
$ overcommit --install
```

詳しくは公式documentや以下の記事を参考にしてください。

- [overcommit](https://github.com/sds/overcommit)
- [git hooksをovercommitで管理して作業効率の底上げを狙う](https://techblog.lclco.com/entry/2018/03/27/170000) 

### CircleCIで自動テスト

テスト自動化を行っておくと安心してプロダクト開発を行うことができます。以下はRSpecを走らせる設定例です。System SpecでChromeDriverを使用する場合は、`-browsers`がついたイメージを利用する必要があります。


```yml
version: 2
jobs:
  build:
    working_directory: ~/circleci-demo-ruby-rails
    docker:
      - image: circleci/ruby:2.6.3-node-browsers
        environment:
          RAILS_ENV: test
          PGHOST: 127.0.0.1
          PGUSER: root
      - image: circleci/postgres:9.6.2-alpine
        environment:
          POSTGRES_USER: root
          POSTGRES_DB: yourapp_test

    steps:
      - checkout
      - restore_cache:
          keys:
            - rails-demo-{{ checksum "Gemfile.lock" }}
            - rails-demo-
      - run: gem update --system
      - run: gem install bundler
      - run:
          name: Install dependencies
          command: bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs 4 --retry 3

      - run: sudo apt install -y postgresql-client || true
      - save_cache:
          key: rails-demo-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle
      - restore_cache:
          keys:
            - rails-demo-yarn-{{ checksum "yarn.lock" }}
            - rails-demo-yarn-
      - run:
          name: Yarn をインストール
          command: yarn install --cache-folder ~/.cache/yarn
      - run:
          name: Database Setup
          command: |
            bundle exec rake db:migrate
            bundle exec rake db:schema:load
      - run:
          name: Parallel RSpec
          command: bundle exec rspec
      - store_test_results:
          path: /tmp/test-results

```

- [言語ガイド](https://circleci.com/docs/ja/2.0/language-ruby/)

### RSpec実行結果を良い感じに出力

```
# .rspec
--color
--require rails_helper
--require spec_helper
--format documentation
```

### Dependabotに依存パッケージの更新PRを投げてもらう

[Dependabot](https://dependabot.com/)は依存関係を安全で最新の状態に保つためのPRを勝手にボンボン投げてくれるサービスです。Github連携でサインインしてリポジトリを選択するだけと導入も簡単なところも魅力的です。

- [Dependabot](https://dependabot.com/) 

## 工数管理

僕が担当しているプロジェクトでは現在は「[Zenhub](https://www.zenhub.com/)」で工数管理をしています。ガントチャートを使った工数管理ツールとしては[Backlog](https://backlog.com/)などもあるかと思いますが、ZenhubではGithubとの連携をシームレスに行うことができ、非常に便利です。

## Github関連

### ブランチを自動削除

マージしたタイミングでブランチを削除する設定を行いました。

https://help.github.com/ja/github/administering-a-repository/managing-the-automatic-deletion-of-branches

### issueテンプレートを作成

GithubでissueをやPRを出すときにデフォルトで出力する内容を設定

```md

# .github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md

close #issue_num

ここにテンプレートの内容を書く
```

上記のように「`close`」と書いてPRを提出するときにissue番号を追記すると、PRをマージしたタイミングで自動でissueがcloseされるので便利。

参考: https://help.github.com/ja/github/building-a-strong-community/about-issue-and-pull-request-templates

## gem関連

### annotateでスキーマ情報を書き出す

[annotate](https://github.com/ctran/annotate_models)を利用するとスキーマ情報をモデルファイルやfactoryファイルに書き出してくれるので、カラム名を毎回schemaから探すコストがなくなります

### `better_errors`でエラーを良い感じに出す

デバッグがしやすいよう[bettor_errors](https://github.com/BetterErrors/better_errors/wiki)を導入。ついでに[pry](https://github.com/pry/pry)も入れておく。

### `bullet`でN＋１問題を検知

[bullet](https://github.com/flyerhzm/bullet)を入れておくとN+1問題を検知して、解消方法も含めてアラートを出してくれます。

### `brakeman`でセキュリティエラーを検知する

[brakeman](https://github.com/presidentbeef/brakeman)を入れておくと、セキュリティエラーを検知してhtmlにアウトプットしてくれます。

### `simplecov`でカバレッジを計測できるようにしておく

[simplecov](https://github.com/colszowka/simplecov)を入れておくとRSpecのカバレッジを計測することができるため、「感覚でテストを書く」から卒業できます。テストファーストで実装するという意識を持つために最初に入れておくと良いかと思います。

## 最後に

「こういうのも入れると便利だよ!」というものがありましたら、教えてください😀。以上です。

- [Twitter](https://twitter.com/kenzoooooB)
- [Github](https://github.com/kenzoukenzou)