はじめに
RailsアプリにCIツールを導入して、コードの自動解析やテストやデプロイを自動でやりたかったので
比較的簡単に導入できそうなSideCIとCircleCIを使ってみました。
その時の導入方法や使ってみた所感をつらつら書きます。
リポジトリやコードはあくまで参考にしてください。
こんな時に使える
- コードの品質を一定にしたい
- レビュアーの負担を減らしたい
- プルリクエストに対して自動でテストやデプロイしたい
- CIの結果をslackに通知したい
- もろもろ自動化したい
SideCI
概要
公式 : https://sideci.com/
プルリクエストを自動で解析し、セキュリティバグ、コード規約、文法、重複記述、未使用の変数、複雑度を検知します
準備
Githubのアカウントがあれば利用できます。
Githubと連携してアカウント登録します。
パブリックリポジトリは無料ですが、プライベートリポジトリは有料です。
使ってみる
ビルド対象のリポジトリを選択します。
設定したリポジトリに対してプルリクエストを作成するとSideCIのチェックが実行されます。
解析結果はこんな感じです。
各ライブラリが実行されて、問題があるところがissue化されます。
あとは修正したコミットをプッシュすればまたSideCIの解析が実行され、問題なければissueがfixedになります。
slackへの通知はプロジェクト設定からできます。

カスタマイズ
sideci.yml
と言うファイルを作ればカスタマイズできます。
公式 : https://sideci.com/ja/docs/linter-config-by-sideciyml
sideci.ymlファイルをレポジトリのルートディレクトリに配置頂くことで、SideCIの自動コードレビュー機能の設定を行うことが出来ます。各機能のオン・オフはSideCIの画面上から行えます。また、各機能はカスタマイズなどはそれぞれの機能に準じます。各機能がサポートしていないカスタマイズ・設定などについてのみ、sideci.ymlファイルで設定することが可能です。
また、テストやデプロイの自動実行ができないかサポートに問い合わせてみたところ
SideCIはCIを冠しておりますが、実質はRuboCopなどの解析器を自動実行することで、コードレビューを自動化・促進する開発支援ツールであり、デプロイやテストの自動実行はできません。
とのことです。
CircleCI
概要
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からビルドするリポジトリを設定します。

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

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

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

おもむろに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環境で実行されてますね。
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のビルドが実行されます。
ビルドが失敗したらビルド画面で確認して対応します。

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

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

カスタマイズ
circle.yml
と言うファイルを作ればカスタマイズできます。
circle.yml
はRailsアプリケーションのルートディレクトリに配置します。
6個のセクションを持つ
machine : VM環境の設定
checkout : コードチェックアウト後の処理
dependencies : 依存関係。環境作成時の処理
database : DBの初期処理
test : テストコマンド
deployment : テスト正常終了後に実行されるデプロイコマンドを設定
デプロイに関しては専用のシェルスクリプトを作って、実行させるといった流れが多いようです。
こちらの記事が参考になりそうです。
所感を一言で
SideCIについて
静的コード解析するだけなら簡単に導入できて良さそう
CircleCIについて
若干時間かかりそうだけど、設定ファイルやシェルスクリプトを駆使してこれ一つで全部完結できそう
参考
https://www.slideshare.net/mogproject/circleci-51253223
http://blog.spacemarket.com/code/circleci/
http://qiita.com/ysk_1031/items/f584a0599791bdba132a