RailsにSideCIとCircleCIをそれぞれ導入する

# はじめに
RailsアプリにCIツールを導入して、コードの自動解析やテストやデプロイを自動でやりたかったので
比較的簡単に導入できそうなSideCIとCircleCIを使ってみました。
その時の導入方法や使ってみた所感をつらつら書きます。

*リポジトリやコードはあくまで参考にしてください。*

# こんな時に使える
- コードの品質を一定にしたい
- レビュアーの負担を減らしたい
- プルリクエストに対して自動でテストやデプロイしたい
- CIの結果をslackに通知したい
- もろもろ自動化したい

# SideCI
### 概要
公式 : https://sideci.com/
>プルリクエストを自動で解析し、セキュリティバグ、コード規約、文法、重複記述、未使用の変数、複雑度を検知します

### 準備
Githubのアカウントがあれば利用できます。
Githubと連携してアカウント登録します。
パブリックリポジトリは無料ですが、プライベートリポジトリは有料です。

### 使ってみる

ビルド対象のリポジトリを選択します。

![sideci_0.png](https://qiita-image-store.s3.amazonaws.com/0/100766/eecdb73a-9203-e355-e0f5-a90a97664bec.png)

設定したリポジトリに対してプルリクエストを作成するとSideCIのチェックが実行されます。

![sideci_1.png](https://qiita-image-store.s3.amazonaws.com/0/100766/c1e3e275-f147-62b4-a6cf-bb44cf679932.png)

解析結果はこんな感じです。
各ライブラリが実行されて、問題があるところがissue化されます。
あとは修正したコミットをプッシュすればまたSideCIの解析が実行され、問題なければissueがfixedになります。

![sideci_2.png](https://qiita-image-store.s3.amazonaws.com/0/100766/51b0f572-b8ef-e04f-4827-4fb0316256a4.png)

slackへの通知はプロジェクト設定からできます。

<img width="968" alt="sideci_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/ab7a28b5-567b-f250-3429-7b9febbcb741.png">

### カスタマイズ

`sideci.yml`と言うファイルを作ればカスタマイズできます。

公式 : https://sideci.com/ja/docs/linter-config-by-sideciyml
>sideci.ymlファイルをレポジトリのルートディレクトリに配置頂くことで、SideCIの自動コードレビュー機能の設定を行うことが出来ます。各機能のオン・オフはSideCIの画面上から行えます。また、各機能はカスタマイズなどはそれぞれの機能に準じます。各機能がサポートしていないカスタマイズ・設定などについてのみ、sideci.ymlファイルで設定することが可能です。

また、テストやデプロイの自動実行ができないかサポートに問い合わせてみたところ
>SideCIはCIを冠しておりますが、実質はRuboCopなどの解析器を自動実行することで、コードレビューを自動化・促進する開発支援ツールであり、デプロイやテストの自動実行はできません。

とのことです。

# CircleCI
### 概要

公式 : https://circleci.com/
>CircleCI is the best CI/CD solution for teams who want to build faster, ship more, and fail less at any scale. We handle millions of builds a month in any language, for any platform.

### 準備

Githubのアカウントがあれば利用できます。
Bitbucketでも登録できます。
今回はGithubと連携してアカウント登録します。
1コンテナ無料 追加の1コンテナ毎に $50/月

### 使ってみる

登録したらPROJECTSからビルドするリポジトリを設定します。

<img width="1236" alt="Add_Projects_-_CircleCI.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/7f15a932-e6c1-9a56-f803-f4ad14fddc32.png">

リポジトリを設定するとコンテナにsshするためのDeploy keyがGithubに追加されました。

<img width="783" alt="Deploy_keys.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/fb8a5446-5129-7cdb-4305-1278d8372563.png">

リポジトリを設定すると自動でビルドが実行されました。
カスタマイズのところで書きますが、 `circle.yml`と`database.yml.ci`と言うファイルを作成するとビルドをカスタマイズできます。
ファイルがない場合はデフォルトの環境設定でビルドが実行されるようです。

<img width="1192" alt="CircleCI.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/4b560849-66b4-f7b7-d026-15c6f8b7e78c.png">

SSHで接続するにはビルド画面で「 Debug via SSH 」のタブを開くと、SSHの接続コマンドが表示されています。ビルド完了後30分まではSSH接続ができ、ビルドが失敗した時の原因の調査ができそうです。

<img width="1203" alt="CircleCI_ssh.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/f914c6d3-3ec2-0ba2-2965-1cf9c285a7c0.png">

おもむろにsshしてみます。
OSはubuntuですね。

```
$ ssh -p xxxxx ubuntu@xx.xx.xx.xx
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-123-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Tue Jul 11 14:43:06 UTC 2017

  System load:    18.47     Processes:             48
  Usage of /home: unknown   Users logged in:       0
  Memory usage:   29%       IP address for eth0:   xx.xx.xx.xx
  Swap usage:     0%        IP address for lxcbr0: xx.xx.xx.xx

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

103 packages can be updated.
51 updates are security updates.

New release '16.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Tue Jul 11 14:44:19 2017 from xx.xx.xx.xx
_____________________________________________________________________
WARNING! Your environment specifies an invalid locale.
 This can affect your user experience significantly, including the
 ability to manage packages. You may install the locales by running:

   sudo apt-get install language-pack-ja
     or
   sudo locale-gen ja_JP.UTF-8

To see all available language packs, run:
   apt-cache search "^language-pack-[a-z][a-z]$"
To disable this message for all users, run:
   sudo touch /var/lib/cloud/instance/locale-check.skip
_____________________________________________________________________

ubuntu@box705:~$
```

root配下に設定したリポジトリがあるので試しに `rails console`を開いてみます。
test環境で実行されてますね。

```bash
ubuntu@box705:~/oshiyaberin$ bin/rails c
DEPRECATION WARNING: ActionView::Template::Handlers::Erubis is deprecated and will be removed from Rails 5.2. Switch to ActionView::Template::Handlers::ERB::Erubi instead. (called from require at /opt/circleci/.rvm/gems/ruby-2.3.3/gems/bundler-1.14.6/lib/bundler/runtime.rb:91)
Loading test environment (Rails 5.1.0)
[1] pry(main)>
```

プルリクエストを作成すると自動でCircleCIのビルドが実行されます。
ビルドが失敗したらビルド画面で確認して対応します。

<img width="788" alt="CicleCI_rspec.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/d4e25b37-f146-e163-5101-3f6994ebb1d5.png">

ビルドの結果はメールでもきます。

<img width="631" alt="Cursor_と_Window.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/c7a1c68b-b66f-464b-94be-6fca0067c145.png">

slackへの通知設定は以下の画面で行います。

<img width="1199" alt="CircleCI_slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/22ac72f3-9ca4-5919-e963-dca0cc7279b7.png">

### カスタマイズ

`circle.yml`と言うファイルを作ればカスタマイズできます。
`circle.yml`はRailsアプリケーションのルートディレクトリに配置します。

**6個のセクションを持つ**

machine : VM環境の設定
checkout : コードチェックアウト後の処理
dependencies : 依存関係。環境作成時の処理
database : DBの初期処理
test : テストコマンド
deployment : テスト正常終了後に実行されるデプロイコマンドを設定

デプロイに関しては専用のシェルスクリプトを作って、実行させるといった流れが多いようです。
[こちらの記事](http://qiita.com/ysk_1031/items/f584a0599791bdba132a
)が参考になりそうです。

# 所感を一言で

### SideCIについて

静的コード解析するだけなら簡単に導入できて良さそう

### CircleCIについて

若干時間かかりそうだけど、設定ファイルやシェルスクリプトを駆使してこれ一つで全部完結できそう

# 参考

https://www.slideshare.net/mogproject/circleci-51253223
http://blog.spacemarket.com/code/circleci/
http://qiita.com/ysk_1031/items/f584a0599791bdba132a