前半に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ディレクトリ以下に用意しておいたスクリプトを実行するものである。
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で管理している時は以下のようなスクリプトを書いておく。
#!/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/