個人開発を支えるRailsにおけるCI環境

### 概要
一人で開発してると、とにかく自動でいろいろやりたいです。

 - コードの静的解析
 - テストコード実行
 - セキュリティチェック
 - デプロイ

など、手元の環境で毎回行うのはひどく時間がかかるし、<b>めんどくさい</b>の一言に尽きると思います。

自分なりに工夫して設定したCI環境（[CircleCI](https://circleci.com/)使用）についてやっていることを見直しがてら書いてみます。
### CircleCIを使ったCI環境
現在使っているCircleCIの設定をベースに書いていきます。

#### 静的コード解析
使用gem：[rubocop](https://github.com/bbatsov/rubocop)

コードを綺麗に保つことって大事ですよね。
ってことで、コードの静的解析ツールを入れます。

```yml
test:
  pre:
    - bundle exec rubocop
```

こんな感じに、testを行う前にやりましょう。
これはとても大事なことで、なぜなら<b>テストは失敗する可能性があり、無駄に時間が(相対的に)長いからです。</b>
rubocopの設定は、各自行っていただければと。
実際これは結構厳しいので、ゆるめた方がいいと思います。

[サンプル](https://github.com/yamadagenki/mypage/blob/develop/.rubocop.yml)

#### セキュリティチェック
使用gem：[brakeman](https://github.com/presidentbeef/brakeman)

みなさん、Railsアプリケーションのセキュリティってどうやってチェックしてますか？
brakemanというgemはそこそこ紹介されていますが、実際にCIツールと連携して自動でチェックさせるとその効果がより発揮されます。

```yml
test:
  pre:
    - bundle exec brakeman -4 -A -w 1 -z
```
上記のように設定することで、

 - warning level 1（-w 1）のマックスレベルでチェック
 - セキュリティ的になにか問題あったらそこでCI失敗させる（-z）

とでき、セキュリティ的にまずかったらCIの実行を失敗させることができます。

他にも、様々なオプションがあるので、プロジェクトに合わせて適宜設定すること。


#### テスト
使用gem：[rspec](https://github.com/rspec/rspec)

言わずと知れたテストコードのgemです。
実際CI環境では下記の用に設定すると、設定してやると動きます。

```
  override:
    - bundle exec rspec --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec.xml --format progress:
        parallel: true
        files:
          - spec/**/*_spec.rb
```

ここで、非常に重要なのが、テストにこだわるならやはりカバレッジレートは気にしなくてはいけません。

[simplecov](https://github.com/colszowka/simplecov)を導入し、spec/rails_helper.rbの冒頭に

```ruby
require 'simplecov'
SimpleCov.coverage_dir File.join(ENV['CIRCLE_ARTIFACTS'], 'coverage') if ENV['CIRCLE_ARTIFACTS']
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([SimpleCov::Formatter::HTMLFormatter])
SimpleCov.start do
  add_filter '/vendor/'
  add_filter '/spec/'
  add_filter '/config/'
  add_filter '/db/'
end
```

と追加することで
https://circleci.com/++++/+++++#artifacts
のようなディレクトリにどのファイルがどれくらいテストコードによって網羅されているのかを視覚化できます。

<img width="237" alt="スクリーンショット 2016-02-09 10.53.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/69406/539554b6-2f18-3b85-ed2a-fb37a8b691a3.png">

これをクリックすると

<img width="500" alt="スクリーンショット 2016-02-09 10.54.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/69406/60fbb772-4ec9-0ee1-dd04-b33e89c7ab55.png">

こんなのができて、テストコードを書くKPIとしても使うことができます。

Mutationテストなど、もっと複雑な指標を持ち出す方法に関してどなたか知っていたら教えていただければ。

#### デプロイ
ブランチプッシュしたら、正直デプロイするコマンド叩くのも<b>だるい</b>ので、デプロイも自動化します。
下記のように書くと、masterブランチがgithubにpushされたら、自動でデプロイしてくれます。

```yml
deployment:
  production:
    branch: master
    commands:
      - bundle exec cap production deploy deploy:restart --trace
```

但し、
https://circleci.com/gh/+++++/+++++/edit#ssh
のようなところから、サーバーにアクセスするための鍵を設定しなければいけません。
<img width="500" alt="スクリーンショット 2016-02-09 10.58.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/69406/d186ccc4-e588-7ad3-0cdb-504cfd7a1617.png">


他にも使用する環境変数をCI環境に設定するための画面があり、適宜隠蔽したい情報を環境変数に埋め込むことをおすすめします。
<img width="500" alt="スクリーンショット 2016-02-09 10.59.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/69406/817b1761-2450-0761-352b-dc4db9a10e06.png">

※もともとCircleCIで定義されている環境変数に関しては
[CircleCI 上で、最初から定義されている環境変数について](http://www.sssg.org/blogs/naoya/archives/2702)を参照してください。

なお、ブランチによっては、テストとかすっ飛ばしてデプロイだけして欲しかったりします。
そんな時は、CircleCIでは個別に設定できないので
spec/rails_helper.rbで

```ruby
exit if ENV['CIRCLE_BRANCH'] == 'sandbox'
```
のように冒頭に一行追加しましょう。
rspec側でテストをスキップするのです。


### 最後に
個人開発していると、本当にいろいろと<b>だるい</b>ので、なるべく寝てる間にいろいろと終わってて欲しいです。

怠惰はプログラマとしての最高の美徳だというので、プログラマとしては怠惰になり、
ダーツプレイヤーとしては地道に努力を惜しまず生きていこうと思います。

他にもなにか便利な使い方があったら知りたいです。