LoginSignup
16
13

More than 5 years have passed since last update.

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

Posted at

前半に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セクションのbranchesonlyを指定すると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.shdeployment-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.rbstaging.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/

16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13