CircleCIの速攻導入と結果をSlackに通知 + CircleCI全体の概要

前半にCircleCIの最低限動かすための例と結果をSlackに通知する設定。後半にCircleCIの全体像の概要をまとめました。

#CircleCIを速攻で動かす
最初にGitHubにpushする度にCircleCIを回してEC2にデプロイするといった処理をする。

##CircleCIの登録
以下のURLから、[Sign Up]を選択。
https://circleci.com/

[Authorize GitHub]と[Authorize BitBucket]から選択可能。ここでは、[Authorize GitHub]を選択。

GitHubからCircleCIへのアクセスへ権限を付与したら、ログインされる。
以下の```Project settings```等の設定項目は[INSIGHTS]を選択して表示される、CircleCI管理下のレポジトリが表示されるが、その右上の設定マークを選択することで設定できる。

##SSHキーの設定
```Project settings > Checkout SSH keys```からGitHubからプロジェクトをCheckoutするキーの追加を行っておく。

```Project settings > SSH Permissions```から[Add SSH Key]を選択し以下の2項目を指定する。

- Host name
- Private Key

##設定ファイルの記述
GitHubと連携する場合について

GitHubのレポジトリ直下にcircle.ymlというファイルを作成し、以下のように記述する。
ここでは、developまたはmasterブランチにmerge(またはcommit)された場合にCircle CIが予めレポジトリ直下のscriptsディレクトリ以下に用意しておいたスクリプトを実行するものである。

```circle.yml
general:
  branches:
    only:
      - master
      - develop

deployment:
  staging:
    branch: develop
      commands:
        - /bin/bash ./scripts/deployment-staging.sh
  production:
    branch: master
    commands:
      - /bin/bash ./scripts/deployment-production.sh

test:
    override:
      - echo "----- No executable test -----"
```

CircleCIは基本的に指定しなかった場合、設定から推測して幾分か実行してくれる。ただし、例えばtestファイルを用意していないにも関わらず、CircleCI側で推測してtestを走らせて以下のようにエラーを吐いてビルドが失敗することがあるので、testの項目でoverrideを設定して、echoコマンドから実行可能なテストがない旨を出力するというものである。

なお、```general```セクションの```branches```で```only```を指定するとWhitelist方式で対象ブランチを指定でき、```ignore```を指定するとBlacklist方式でブランチを対象から除外できる。

```
npm test

> test-repository2@0.0.0 test /home/ubuntu/test-repository
> echo "Error: no test specified" && exit 1

Error: no test specified
npm ERR! Test failed.  See above for more details.

npm test returned exit code 1
```
##スクリプトからのデプロイ

```deployment-production.sh``` や ```deployment-staging.sh``` にはデプロイのコマンドなどの設定を含めておく。

例えば、Capistranoによるデプロイの場合は、bundleで管理している時は以下のようなスクリプトを書いておく。

```deployment-production.sh
#!/bin/bash
bundle exec cap production deploy
```

Capstrano(Version 3)の導入は別途、以下のURL等を参考にして下さい。
http://qiita.com/hayashier/items/606910ceccf7cc782052
ただし、CircleCIでは上記URLの環境構築はすでに設定されているので必要はなく、また、deployディレクトリ以下に```production.rb```や```staging.rb```で````:ssh_options```中で```keys```で鍵の指定を行っているが、CircleCI上で鍵の指定を行っているので必要はなく、```keys```の項目も省略する。


#通知設定
##ブラウザからSlackのWebhookの設定
以下のURLからSlackのWebhookの設定ページを行う。
https://my.slack.com/services/new/incoming-webhook/

Post to Channelで対象のチャンネルを設定
[Add Incoming WebHooks integration]を選択

発行されるWebhook URLを控える。

```
https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXX
```

##CircleCI上で設定

```Project settings > NOTIFICATIONS```の[Chat Notifications]を選択
Webhook URLに先ほど控えておいたURLを入力し、[Save & Test Hook]を選択。

Slackのチャンネルに以下のようなメッセージが来ていることを確認。

```
Hello from CircleCI 
```

以上で設定が完了である。以降、GitHubにpushされる度にCircleCIがpushされたブランチに対してビルドが実行される。(circle.ymlでビルドの対象外などの設定をしていればビルドは実行されない。(上記ではmasterとdevelopブランチ以外は実行されない))

##注意点
CircleCIを導入した直後に全ブランチに対して、git pushの度にビルドが適用される。
その場合、各ブランチにはまだcircle.ymlが存在しないので、CircleCIが文脈を見て何をするべきか推測して実行する。例えば、テストコードがないところでCircleCIがテストコードを実行しようとしてもなくてビルドで失敗が出続けることもあるので注意。

#CircleCI 概要
##全体構造

###セクション
circle.ymlに設定を記述するが、大きくセクションに分けて設定を行う。

####主な6つのsection

```
machine
checkout
dependencies
database
test
deployment
```

####その他のsection

```
general(ビルド関連設定)
notify
experimental
```



###commands
セクション内でcommandsでコマンドを指定することで実行することができる。その際にコマンドの実行タイミングやオプションを指定することができる。

####実行タイミング
以下の3つを指定できる。ただし、セクション毎に使用できるものが異なる。
コマンドの前に指定する。

```
pre
post
override
```


####付加情報
コマンドの後に指定する。

```
timeout
pwd
environment
parallel
files
background
```

##Machine 設定
pre,post

###サブ項目

```
environment
timezone
hosts
ruby
node
java
php
python
ghc
services
```

####ruby,node,java,php,python,ghc

```
version
```

####services

```
cassandra
elasticsearch
rabbitmq-server
redis
riak
beanstalkd
couchbase-server
neo4j
sphinxsearch
```

####言語サポート
上記他、Clojure, C/C++, Golang, Erlangを含む他言語。

##checkout
postのみ

##dependencies
override,post,pre
RubyのbundlerやNode.jsのnpm、pythonのpip等依存関係関連のコマンド。

###サブ項目

```
bundler
cache_directories
```
###database
override,pre,post
データベースの作成、スキーマのインストール、マイグレーション等

##test
pre,post,override

###サブ項目

```
minitest_globs
```

##deployment

###サブ項目
任意の名前(ただし、複数のサブ項目がある場合は名前が一意でなければならない)

####付加情報
サブ項目ごとに以下の情報を指定する。

```
branch または tag
commands
```

```
owner
heroku
```


#####branch
一つの場合はそのブランチ名をクオテーション等で囲まずに記入
複数ある場合は```[]```で囲んで```,```区切りで列挙する。もしくは、正規表現で```//```のスラッシュの間に記入する。

例)

```
branch: master                          #masterのみ
branch: [master, develop]               #master,developのみ
branch: /^(?!(develop|master)$/         #master,develop以外
```

#####heroku

```
appname
```

##notify

```
webhooks
```

その他、Slack,HipChat,Campfire,Flowdock,IRCでの通知をWeb上で```Project Settings > Notifications```から設定。

##general

```
branches
build_dir
artifacts
```


##その他
SSHキーの設定はブラウザから```Project Settings > SSH keys```から行う。

#参考
https://circleci.com/docs/configuration
https://circleci.com/docs/