CircleCIで出来るコト

## CircleCI？

[CircleCI](https://circleci.com/)

流行りのCIサービスです。

GitHub / BitBucketのPUSHに反応して、コードをゴニョゴニョします。

---

## お金かかるの？

[Pricing and Plan Information - CircleCI](https://circleci.com/pricing/)

1コンテナは無料です。
privateリポジトリでも、です。

つまり、ビルドに時間がかかっても良いなら、無料で使い続けられます。

---

## ただし

OS Xのコンテナは有料です。

iOSアプリのCIには、お金が必要です。

---

## つづき

仕事としてフルタイム使うと、1日5〜10ビルドは最低必要なので、$129/monthは必要です。

複数人で開発とかしてると、もう一つ上の$249/monthぐらいが必要かも。

---

## なにをやらせるか

`circle.yml`というファイルを、リポジトリのルートに置いておきます。
そこに実行させたいコマンドや、環境の指定を書いておくと、それをPUSHの度に実行してくれます。

---

こんなイメージ

```yaml
machine:
  java:
    version: oraclejdk8
  environment:
    TERM: "dumb"
  pre:
    - scripts/env2file app/fabric.properties
test:
  override:
    - ./gradlew clean :app:testDebugUnitTestCoverage -PdisablePreDex
  post:
    - cp -r app/build/reports/tests $CIRCLE_ARTIFACTS
deployment:
  master:
    branch: master
    commands:
      - ./gradlew :app:uploadDeployGateDebug :app:uploadDeployGateRelease -PdisablePreDex
```

---

### つまり、Linux上のコマンドで表現出来ることはだいたい出来る。

---

では、出来ることをつらつら並べていきます。

---

## テストの実行

---

CIといえばテストですね。

CircleCIは頭がよく、Gemfileが置いてあれば`bundle install`するし、`bundle exec rake test`とかも勝手にやってくれます。

まぁ、大抵は上書きします。

```yaml
test:
  override:
    - なんか他にもやりたい
    - bundle exec rake test:custom なんか引数
```

---

## UIテストの実行

Seleniumなどを使った、ブラウザテストも出来る。（やったことないけど

Appiumを使った、Android / iOSのUIテストも出来る。（調査中

---

## Lintの結果をPRコメントに

![image](https://qiita-image-store.s3.amazonaws.com/0/8708/357c0bc4-cccd-1544-cc2f-d658060e730c.png)

---

## Android

Checkstyle / FindBugs / PMD / CPD / Android Lint

## iOS

SwiftLint

---

## Ruby

Brakeman / RuboCop / Rails Best Pratices / Reek

## PHP

phpcs / phpmd

---

## フロント系

ESLint / SCSS-Lint

---

詳しくは
[Androidのコードを自動で解析し、GitHubのpull requestにコメントする - Qiita](http://qiita.com/noboru_i/items/2f30296db1c8a6dfbd9b)
とかで。

また、似たようなものはいくつかあります。
[Dokumi](http://techlife.cookpad.com/entry/2015/06/04/dokumi-ja)
[SideCI](https://sideci.com/)
[reviewdog](http://haya14busa.com/reviewdog/)

---

## ビルド

Android / iOSアプリのビルド。

Electronアプリのビルド。

goのクロスコンパイル。

---

`$CIRCLE_ARTIFACTS` にとりあえず移動しておけば、いつでも取りに行けます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8708/62bc14bd-3d76-755a-cd79-76d120049134.png)

---

## 配布

とはいえ、毎回CircleCIの画面に取りに行くのは面倒です。

AndroidならDeployGate、iOSならTestFlightなどに飛ばせます。

Electronやgoであれば、GitHub Releaseに置いておくこともできます。

---

## デプロイ

herokuであれば、宣言的にアプリ名などを書いておくだけで、デプロイ出来るっぽい。
https://circleci.com/docs/continuous-deployment-with-heroku/

AWS ElasticBeanstalkであれば、ebコマンドでデプロイ出来るらしい。

---

## インフラの変更

[Terraform + GitHub + CircleCI + Atlasを利用してAWSの操作を自動化した - Glide Note](http://blog.glidenote.com/blog/2015/02/18/terraform-github-circleci-atlas-aws/)

1. Terraformでインフラをコード化
2. コードをPull Requestでレビュー、マージ
3. CircleCIが動いて、インフラの変更

→GUIからの開放

---

## ドキュメントの作成

ドキュメントと実装を正しく同期しておくのは手間がかかります。
コードから自動生成出来るドキュメントは、CIで生成できます。

---

生成したドキュメントは

- CircleCIのArtifactsに入れておく
- GitHubのReleaseとして登録しておく
- コード管理しているリポジトリに`doc`などのブランチをつくり、そこにpushしておく
- S3にputする

など、APIさえあれば、どこにでも移動できます。

---

### API定義書

[r7kamura/autodoc](https://github.com/r7kamura/autodoc)を使えば、RailsのAPI定義書を、テストコードを書くだけで出力できます。

JSON schemaを書いているプロジェクトであれば、[interagent/prmd](https://github.com/interagent/prmd)でyml -> mdの変換ができます。

---

### ER図

[voormedia/rails-erd](https://github.com/voormedia/rails-erd)を使えば、RailsのmodelをER図として画像出力できます。

---

他にも、

- 静的ページgeneratorと組み合わせて、ビルド→ページの公開
- 技術書執筆にあたっての校正・PDF出力の自動化
- 別途cronサーバがあれば、nightly buildとか

---

ただ、CircleCIに頼りすぎるデメリットとして

- circle.yml職人化する可能性（Jenkinsおじさんよりは引き継ぎやすいはず。。。
- CircleCIがたまに不安定。
    - HerokuやAWSなどに引きづられて落ちることも。
- CircleCIが無いと開発・運用が進まない  
（テスト落ちてるけど、とりあえずデプロイしたい、とか）

---

無料で始められるし、Jenkinsを自分たちで運用するよりは楽なはず。
使い倒して、知見を共有してください :pray: 

---

![image](https://qiita-image-store.s3.amazonaws.com/0/8708/180637c6-c53b-b765-df19-c34e121161ab.png)

Monstar Labではエンジニアを募集しています。

中目黒・松江（島根）・ダナン（ベトナム）とかで働きたい人は、[Wantedly](https://www.wantedly.com/companies/monstarlab/projects)の「話を聞きに行きたい」ボタンより :bow: