パラボラアンテナと星の日記

あることないこと

Docker on CircleCIでchefのcookbookをserverspecでテスト

CircleCI自体もコンテナなんだが、さらにその上でdockerコンテナ立ててcookbookのテストしてしまうというアレです。 「Docker使えるならChef要らないじゃん」という話は大賛成なんだが、既存のcookbook資産を使いたいことも、まあある。

【追記】続きにさらにテストの時間短縮させる工夫書いた

動いたの?

f:id:hoppie:20150202014041p:plain

動いた!!!!!!!!!!! 最小限で動いたところでタグを切った。コードは下記リンク参照。

CircleCI上で、

「chefでdockerコンテナにcookし、それをserverspecでテストする」

を実現しています。

以下、ポイントなど

CircleCIでdockerをどう準備するか

無理にapt-get -y install dockerとかやってインストールしても、docker psすら返ってこなくなる。

公式にサポートしてるserviceを使うとうまくいった。下記リンク参照。

とりあえず

machine:
  services:
    - docker

みたいに書くと、見事にdocker動く。 ただし、何故か、rubyのバージョンは2.1.4固定になるっぽくて、.ruby-version等は泣く泣く2.1.4に戻した。よくわからない。

CirlceCI上で、ベースコンテナのビルド

Dockerfileをコミットしておいて、testの前段階(dependencies)でビルドすればいいんだけど、

...
dependencies:
  override:
    - docker info
    - docker build -t hoshinotsuyoshi/centos-sshd .
test:
  ...

今後もっと良くするためには、以下の様なこともできそう。

  • DockerhubのAutomated buildを使って、pullするだけにして時間短縮
  • docker imageをキャッシュする(方法未確認)

CirlceCI上で、DockerコンテナへのSSHをどう準備するか

今回は鍵や~/.ssh/configに書くようなこともコミットしてしまって(テスト用にしか使わないので)、 その設定などをcpやらでCircleCIの~/.ssh/に反映させました。こんな感じ。

test:
  pre:
    - ...
    - cp ./id_rsa_insecure ~/.ssh/id_rsa
    - sudo chown 600 ~/.ssh/id_rsa
    - cp ./ssh-config.circleci ~/.ssh/config
  override:
    - docker run -d -p 40022:22 hoshinotsuyoshi/centos-sshd; sleep 10
    ...

【追記】ここでホスト側のポート指定してるの、だいぶイケてなかった。続きに書いた

ssh-config.circleci というファイルの中身は、こんな感じ。 docker runでpublishするssh用のポートと同じ番号を指定している。

Host centos-sshd
  HostName 0.0.0.0
  User docker
  Port 40022
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  LogLevel FATAL

以上です

キャッシュの効かせ方とかに課題残りまくりな気がするが、難なく動いて、CirlceCIさすが。

【追記】続きにさらにテストの時間短縮させる工夫書いた