背景
普段はCIなんて言葉目にしないけどなんとなく知っておこうと思いCircleCIなるサービスを
知り実施してみました。
普段はJenkinsでCIのような事はやってます。
CircleCIって?
GitHub / BitBucketのPUSHに反応して、ビルドからテストを自動化してくれるCIサービス
jenkinsと比較して一番にあがるのは、Jenkinsは自前でJenkinsサーバを立てる必要があるのに対してCircleCIはクラウドのwebサービスって言う点です。
他にもいろいろメリット/デメリットはあるようです。
CI(継続的インテグレーション)とは
特に言及せずwikiを引用
CI(英: continuous integration)とは、主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。
エクストリーム・プログラミング (XP) のプラクティスの一つで、狭義にはビルドやテスト、
インスペクションなどを継続的に実行していくことを意味する[1]。
特に、1990年代後半以降の開発においては、継続的インテグレーションをサポートするソフトウェアを使用する傾向が強まってきた。
ネイティブDockerのサポート
1.0でもDockerサポートは存在しています。しかし、CircleCI自身がベースコンテナとしてLXCを利用していることの影響で、独自パッチを当てた古いバージョンに限定されています。
2.0では仮想マシンが起動して純粋なDockerを動かせるようになったため、最新の機能がフルに利用できるようになりました。CIのベースとしてこの仮想マシンを起動することも、Dockerイメージをベースにしつつ、途中でこの仮想マシンを起動することもできます。
必要なもの/前提知識
- GitHubのアカウント
- gitの知識(pushできればオッケー)
流れ
- ① githubアカウントを作る
- ② githubでCI対象のリポジトリを作成
- ③ CircleCI上でgithubアカウントと連携する
- ④ ローカルでリポジトリに設定ファイル(.circleci/config.yml)を作る
- ⑤ pushしたら自動でビルド/実行して結果が見れる
手順①②は割愛します。
③ CircleCI上でgithubアカウントと連携する

リポジトリを作成したらCircleCIのホームから「ADD Project」を選択し、
先程作成したリポジトリをSet UPします。
④ ローカルでリポジトリに設定ファイル(.circleci/config.yml)を作る
リポジトリのルートディレクトリ配下に下記ファイルを作成してください。
このファイルが設定ファイルとなりビルド命令等をもとに実行されます。
# pwd
circleci_sample
# ls .circleci/config.yml
.circleci/config.yml
とりあえず「Hello world」を出力する
version: 2
jobs:
build:
docker:
- image: alpine
steps:
- checkout
- run:
name: Install dependencies
command: echo "hello world!"
⑤ pushしたら自動でビルド/実行して結果が見れる
あとはgithubへpushすれば自動的に上記の命令が実行されます。
$ git add -A .
$ git commit -m "hello world!"
$ git push
push後は再度CircleCIのページへ戻りJobを確認。
エラー等がなければ実行完了です。

実行結果を簡単に取得可能です。

yamlのローカルテスト方法
上記yamlの確認はgithubへのpushが必須だと思っていましたがそんな事はなく
ローカルでのテスト実行も可能。素晴らしい。。。
以下のように「circleci」をインストール
# インストール
$ curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci
# アップデート
$ circleci update
# テスト
$ cd ${プロジェクトroot}
$ circleci build
~
#!/bin/sh -eo pipefail
echo "hello world!"
hello world!
Success!
所感
Jenkinsのような面倒な手順なくCIが出来るのはすごいと思う
凝ったことをやらない限りは十分な機能だと思いました。