度々ですいません。cloudpackかっぱ (@inokara) です。

はじめに

時代は CI です。
泣いても笑っても CI です。

ということで Circle CI を触ってみたいと思います。
Circle CI とは Travis CI のような CI を生業とした Web サービスです。

GitHub と連携しているので直ぐに始められます。
というわけで、自称インフラエンジニアの自分が Circle CI に慣れるまでのほんの少しのメモです。

使ってみる(1)

まずは GitHub との連携から….

Circle CI を使ってみる: GitHubとの連携

カッコイイ Jenkins

こんな言い方は失礼かもしれませんが Circle CI も Travis CI もざっくり言うと「カッコイイ Jenkins」だと思っています。(※すいません)Jenkins はコマンド実行結果のステータスコード 0 又はそれ以外を見て成功か失敗を判断していますが、Circle CI も同じような挙動のようです。

circle.yml

試しに circle.yml を以下のように記述してみましょう。

test:
  override:
    - exit 0

circle.yml とは CircleCI でどのようなテストをさせるか、また、テストに際してどのような環境を用意するかを定義するファイルで YAML 形式で記載します。

この circle.yml ファイルを git push してみましょう。

git add -A .
git commit -m "test"
git push

無事に push が完了すると Circle CI ではテスト用のインスタンスの環境構築から始まり、テストが実行されます。但し、今回は単純な exit 0 なので一瞬でテストは終わってしまいます。
Circle CI を使ってみる: GitHubとの連携 動作確認(1)

直ぐに終わったけどなぜか嬉しいかっぱです。では、circle.yml を以下のように修正して再度アップしてみましょう。

test:
  override:
    - exit 1

exit 1 しているので通常であれば異常終了と判断されるので、Circle CI でもそれを捕捉してエラーと表示されるはずです。
Circle CI を使ってみる: GitHubとの連携 動作確認(2)

おお、見事に失敗。

上記のことから Circle CI でテストのエラーをする基準の一つとして終了コードが 1 はエラーと判断されることが解りました。

それっぽく使ってみる(2)rubocop を…

せっかくなんで…

それっぽいことをやってみたいと思いますが、今回は Sensu のプラグインを Community-Plugin のリポジトリに push すると Merge 前に Travis CI で rubocop による構文チェックが実行されます。このテストを Circle CI でやってみたいと思います。

やっぱりキモは circle.yml

今回は Sensu プラグインから elb-full-metrics.rb というプラグインを利用したいと思いますので circle.yml に以下のように記述します。

machine:
  ruby:
    version: 2.0.0-p247
  timezone: Asia/Tokyo

dependencies:
  override:
    - gem install rubocop --no-ri --no-rdoc -V

test:
  override:
    - rubocop -c rubocop.yml elb-full-metrics.rb

上記を見て頂くとお解りになると思いますが、circle.yml と名乗っておきながら dependencies 以降は単純なコマンドの羅列です。このコマンドの羅列だけで環境の準備からテストの実行まで行ってくれるなんてとて簡単ですね。ちなみに、circle.yml の詳しい解説については以下にあります。

以下のような 6 つのセクションがあるようです。

セクション 役割
machine adjusting the VM to your preferences and requirements
checkout checking out and cloning your git repo
dependencies setting up your project’s language-specific dependencies
database preparing the databases for your tests
test running your tests
deployment deploying your code to your web servers

deployment ってのもありますのでテストが通ったら Deploy までやってくれるようです。

circle.yml をはじめ rubocop の設定(rubocop.yml)とテストの対象となる elb-full-metrics.rb を GitHub に push してしばらくすると…
Circle CI を使ってみる: rubocop との連携 動作確認
おお、なんかコケてる….

も少し使ってみる(3)Docker で…

Docker 対応

CircleCI 自体が Docker にも対応しているので Dockerfile でコンテナ作って…起動して…の作業が Circle CI 自体で行えることになりますな!

やっぱりキモは circle.yml

泣いても笑っても circle.yml が必要になります。
今回は Chef のレシピを chef-apply で実行して結果を serverspec でテストするという流れです。

machine:
  services:
    - docker

dependencies:
  override:
    - docker info
    - docker build -t inokappa/circleci-test .

test:
  override:
    - docker run -i -t inokappa/circleci-test /spec_start.sh

殆どの処理は Dockefile に記載している為シンプルな状態になっています。Docker ファイル等詳細についてはこちら「inokappa/circleci-test」を御覧ください。

ちなみに Dockerfile は…

チョーベタ書きすいません。

# Pull base image.
FROM inokappa/wheezy-7.2-basic:latest

#
RUN 
  apt-get update && 
  apt-get -y install ruby1.9.1 && 
  gem install serverspec --no-ri --no-rdoc -V && 
  gem install rake --no-ri --no-rdoc -V
#
RUN 
  wget https://opscode-omnibus-packages.s3.amazonaws.com/debian/6/x86_64/chefdk_0.3.5-1_amd64.deb && 
  dpkg -i chefdk_0.3.5-1_amd64.deb
#
ADD 
  chef-solo /root/chef-solo/
#
ADD 
  chef_apply.sh /
#
RUN 
  chmod 755 /chef_apply.sh && 
  /chef_apply.sh
#
RUN 
  mkdir /root/serverspec
#
ADD 
  Rakefile /root/serverspec/
#
ADD 
  spec /root/serverspec/spec/
#
ADD 
  spec_start.sh /
#
RUN 
  chmod 755 /spec_start.sh

実行!

各種のコードを git push しましょう。すると…以下のように最終的には serverspec で構成の確認までを行った結果が出力されています。どうやら Chef のレシピも正しく適用されているようです。
Circle CI を使ってみる: Docker との連携 動作確認

ということで…

超ざっくりと駆け足で書いてしまい恐縮ですが、Circle CI は GitHub と連携してソースコード等のテストを自動で実行してくれるサービスの一つであり、お手軽に試せて Docker まで対応しているのがかなり嬉しく感じです。

ただ、ちょい微妙だったのが Circle CI 上で構築した Docker コンテナに対して docker exec が利用出来無かったり(Docker のバージョンが古いのかな?)、各種処理はコマンドの羅列でも動くのですが、まとめて実行したい場合等はシェルスクリプト等にまとめる必要があったりしますが、自分のような自称インフラエンジニアでもさくっと Jenkins っぽく使える点はとても嬉しくて何かちょっとしたことを自動化させたい時とかにココロの隅においておくと良さそうです。

ということで、チョー眠いのでおやすみなさい…zzz

元記事はこちらです。
自称インフラエンジニヤが Circle CI を触ってみたメモ