CircleCIでDockerコンテナに対してansibleを実行しserverspecでテストをする

参考

KAIZEN platform Inc. における運用自動化 - Speaker Deck
Continous Integration and Delivery with Docker - CircleCI

TL;DR

CircleCI上でDockerコンテナを立て、
そのコンテナに対してプロビジョニングを行い、
プロビジョニング後のコンテナに対してテストを行う

DockerコンテナにAnsibleを実行する

コミットする度にDockerのimageをpullするのは時間がもったいないので
cache_directoriesを利用し、imageをexportしておき
実行時にimportするようにすると多少速くなる。

.
├── Dockerfile
├── ansible/
└── circle.yml
  • Dockerfile
FROM kenjiskywalker/dockerfile-centos-ansible
  • circle.yml
machine:
  services:
    - docker

dependencies:
  pre:
    - if [[ -e docker_ansible_image.tar ]]; then cat docker_ansible_image.tar | docker import - kenjiskywalker/dockerfile-centos-ansible ; docker load --input docker_ansible_image.tar ; else docker build . ; docker save -o docker_ansible_image.tar kenjiskywalker/dockerfile-centos-ansible ; fi

  cache_directories:
    - "docker_ansible_image.tar"

test:
  post:
    - docker run -v `pwd`/ansible:/ansible kenjiskywalker/dockerfile-centos-ansible ansible-playbook /ansible/ci.yml -i /ansible/inventory_localhost -c local

こんな感じの設定ファイルを置いておくとansibleディレクトリをマウントし
Dockerコンテナがansibleを実行できる状態であればDockerコンテナに対して
ansibleが実行できる。この続きにServerspecを記述することで

  1. リポジトリにansibleのファイルをコミットする
  2. CircleCI上にてDockerコンテナを起動
  3. Dockerコンテナに対してansibleでプロビジョニング
  4. そのプロビジョニング結果をServerspecでテストをする

のようなことができる。

wercker

werckerでも同じようなことができる。
CircleCIと同様にファイルをキャッシュするには
$WERCKER_CACHE_DIRを利用すればよいかと。

  • wercker.yml
box: wercker-labs/docker
build:
  steps:
    - script:
        name: docker build
        code: docker build .
    - script:
        name: docker run
        code: docker run -v `pwd`/ansible:/ansible dockerfile/ansible ansible-playbook /ansible/ci.yml -i /ansible/inventory_localhost -c local

以上、メモです。