CircleCI2.0でDocker Composeをキャッシュする
どうも、くずきです。
以前、CircleCI2.0を試しました。
CircleCI2.0
を使って見たものの、せっかく色々機能があるのに使えてなかったので、今回はWorkflows
を使ってDocker Compose
のキャッシュを利用したいと思います。
目標
Workflows
に適応させるDocker Compose
をキャッシュする- キャッシュした
Docker Compose
をテストで利用する
あとはビルドが早くなればいいな〜と思う。
一応環境
CircleCI設定
.circleci/config.yml
の設定
versin: 2 jobs: generate_cache: machine: true steps: - checkout - restore_cache: keys: - docker-{{ .Branch }}--{{ checksum ".circleci/config.yml" }}--{{ checksum "docker-compose.yml" }}-{{ checksum "Dockerfile" }} paths: - ~/caches/images.tar - run: name: Setup docker command: | if [ ! -f ~/caches/images.tar ]; then docker-compose pull db cache docker-compose build app mkdir -p ~/caches docker save $(docker images | awk 'NR>=2 && ! /^<none>/{print $1}') -o ~/caches/images.tar fi - save_cache: key: docker-{{ .Branch }}--{{ checksum ".circleci/config.yml" }}--{{ checksum "docker-compose.yml" }}-{{ checksum "Dockerfile" }} paths: - ~/caches/images.tar test: machine: true steps: - checkout - restore_cache: keys: - docker-{{ .Branch }}--{{ checksum ".circleci/config.yml" }}--{{ checksum "docker-compose.yml" }}-{{ checksum "Dockerfile" }} paths: - ~/caches/images.tar - run: name: docker load command: | if [[ -e ~/caches/images.tar ]]; then docker load -i ~/caches/images.tar fi - run: name: Setup Laravel command: | docker-compose run app composer install cp .env.circleci .env docker-compose run app php artisan key:generate docker-compose run app php artisan migrate:refresh --seed - run: name: Run Test command: | docker-compose run app vendor/bin/phpunit workflows: version: 2 build_and_test: jobs: - generate_cache - test: requires: - generate_cache
各設定箇所を簡単に説明。
workflows
jobs
に書かれたジョブの実行順序を決めたり、並列化などできる。
本家の画像をパラパラと見れば理解しやすい(英語読まない)。
今回は、generate_cache
-> test
というジョブの順番で行うようにしてある。
save_cache
paths
で設定した内容をkey
の名前で保存できる。
key
に関しては{{}}
を使うことで色々な名前にできて、今回は以下を設定。
- .Branch
- ブランチ名ごとにキャッシュ
- checksum ファイル名
- 指定したファイル名が変更されるたびにキャッシュ
- 今回は、
docker
ファイル周りとcircleci
のファイル
restore_cache
save_cache
で指定したkey
で保存したファイルをダウンロードできる。
[タスク] Setup docker
docker-compose
でpull
とbuild
したイメージを
docker save イメージ名 -o アウトプット先
という形で保存している。
ここは結構詰まったので、後述。
[タスク] docker load
generate_cache
ジョブで作ったファイルを、test
ジョブでrestore_cache
し、
それをdokcer load
で読み込んでいる。
動作結果
以前のビルド 結果: 3分07秒
新しいビルド 結果: 2分52秒
結果あんまり早くならなかった。
原因としては、ジョブを切り替える時間、restore_cache
などの時間、composer install
した内容をキャッシュしていなかったためである。
まあでもかっこよくなったのと、並列化などしやすくなったためよかった。
詰まったところ
キャッシュ名に.circleci/config.yml
を入れてなかった
すごく恥ずかしいんですけど、キャッシュをする際にkey
に.circleci/config.yml
をいれなかったせいで、.circleci/config.yml
をいくら変更しても前のキャッシュを使用してて全然更新されてなかった。。
docker saveが上手くされてなかった
最初はこのようにsave
してた。
docker save -o ~/caches/images.tar
これだと、docker load
はできるものの、実際にdokcer-compose run
を行う際にキャッシュを使わずに一からPull&Build
をしてしまう。だいぶここにはまった。
docker load
しても、Rpository
とTag
の名前が<none>
になってしまい、Pull
する際などに取れないからである。
解決法としては、docker images
する際に、Repository
名を切り出して保存する。
docker save $(docker images | awk 'NR>=2 && ! /^<none>/{print $1}') -o ~/caches/images.tar
ほんと助かりました(ここのコードちょうだいしました・・)。作者様ありがたです。
もう少し良さげなコマンド無いか探して見まする。
ビルドしたDockerFileに名前をつける
docker-compose.yml
app: #image: php:7.1.1-apache build: . image: app container_name: app ports: - "8000:80" volumes: - .:/var/www/html - ./000-default.conf:/etc/apache2/sites-available/000-default.conf depends_on: - db - cache
http://docs.docker.jp/compose/compose-file.html#build
build
した際に、image
でタグ名をつけとかないとdocker save
時に困ります。
まとめ
workflows
でかっこよいテストにできるrestore_cache
,save_cache
を使いこなそう- ハマりどころは細かくあるので注意
- 次は並列化したい(そもそもテストの量増やさないと・・・)