drone.io でKitchenCIを使ってインフラをテストする

この記事は drone.io Advent Calendar 2017 - Adventar の23日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

KitchenCIVMを立てて、Chefでプロビジョニングし、InSpecや、SeverSpecでテストする一連の流れを自動化するものです。

KitchenCIは通常Vagrantで操作しますが、kitchen-docker pluginを利用すると代わりにdockerを利用することができます。

github.com

これを利用し、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_ESCALATEdockerを設定しておくとTrustedプロジェクトでなくても自動的にprivilegedフラグが有効になります。