Docker on CircleCIでchefのcookbookをserverspecでテスト
CircleCI自体もコンテナなんだが、さらにその上でdockerコンテナ立ててcookbookのテストしてしまうというアレです。 「Docker使えるならChef要らないじゃん」という話は大賛成なんだが、既存のcookbook資産を使いたいことも、まあある。
【追記】続きにさらにテストの時間短縮させる工夫書いた
動いたの?
動いた!!!!!!!!!!! 最小限で動いたところでタグを切った。コードは下記リンク参照。
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さすが。
【追記】続きにさらにテストの時間短縮させる工夫書いた