drone.io でKitchenCIを使ってインフラをテストする
この記事は drone.io Advent Calendar 2017 - Adventar の23日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
KitchenCIはVMを立てて、Chefでプロビジョニングし、InSpecや、SeverSpecでテストする一連の流れを自動化するものです。
KitchenCIは通常Vagrantで操作しますが、kitchen-docker pluginを利用すると代わりにdockerを利用することができます。
これを利用し、drone上でdocker in dockerをすることでKitchenCIによるインフラ自動テストを設定してみましょう。
docker in docker を設定する
droneはdockerを利用してコンテナ上でテストを実行するものです。KitchenCIはコンテナを作ってその中にプロビジョニングを実施しますので、drone上でKitchenCIを動かすとコンテナの中にコンテナを立てることになります。これを docker in docker(dind) と呼びます。
dindをするには小細工が必要なのですが、公式イメージでdind用の docker イメージが提供されていますのでこれを利用します。 tagにdindと入っているものを利用します。
.drone.ymlのservices
にdindを設定します。ポート2375にDocker Portが上がってきます。
このdindイメージを利用するにはprivileged
フラグの設定が必要ですが、これはプロジェククトのTrusted
フラグを有効にする必要があります。
services: docker: image: docker:stable-dind privileged: true command: [ "--storage-driver=vfs", "--tls=false" ]
他のコンテナから利用する際はDOCKER_HOST
を以下のように設定し、servicesで設定したdind用のポートに向けます。
pipeline: build: image: docker:latest environment: - DOCKER_HOST=tcp://docker:2375 commands: - docker info
kitchen-dockerを設定する
.kitchen.yml
をdockerを利用するように変更します。socket
を指定してdindを利用します。
--- driver: name: docker socket: tcp://docker:2375
そこそこ時間はかかりますが、これでインフラのテストが自動化できます。
dind を Trustedプロジェクトでなくても利用できるようにする
Trusted
フラグは管理者しか設定するしかないのですが、これは少々面倒です。
信頼できる利用者のみの環境であればserver設定時に環境変数DRONE_ESCALATE
にdocker
を設定しておくとTrustedプロジェクトでなくても自動的にprivileged
フラグが有効になります。