Re:VIEWとDockerとCircleCIで原稿を継続的インテグレーション
Re:VIEW で執筆する原稿を継続的インテグレーションしたかったので、以下の図のような仕組みを作りました。
ローカル執筆環境の前提条件
- Docker 1.3以降がインストールされている
- Re:VIEW形式の原稿のフォルダがある
Re:VIEWやLaTeXはDockerイメージのものを使うので、インストール不要です。
私はMac OS X 10.9とBoot2docker 1.4.1で動かしましたが、WindowsやLinuxでも動くのではないかと思います。
Re:VIEWをDockerで動かす
vvakameさんがDocker Hubにイメージを公開してくれていますので、これを使います。
https://registry.hub.docker.com/u/vvakame/review/
dockerコマンドさえ使える状態であれば、以下のようにしてサンプル書籍 をコンパイルしてbook.pdfを生成できます。
$ git clone -b docker-circleci https://github.com/orangain/review-sample-book $ cd review-sample-book/src $ docker run \ --rm \ -v $(pwd):/work \ -v $(pwd)/.texmf-var:/root/.texmf-var \ vvakame/review:latest /bin/sh -c "cd /work && review-pdfmaker config.yml"
初回実行時は2GB超のイメージをダウンロードするので、結構時間がかかりますが、2回目以降は数秒で終わります。
ホストのカレントディレクトリをコンテナ内の /work
としてマウントしてその中で実行するので、コンテナ内であることをほとんど意識せずに使えます。
review-pdfmaker
実行の際に、コンテナ内の /root/.texmf-var
フォルダにフォントのキャッシュ?(詳しくは知りません)が作られます。これをホスト側に永続化できるよう設定してやることで、2回目以降は高速にPDFを生成できます。
CircleCIでDockerを使う
CircleCI ではDockerを使えます。DockerネイティブなDrone.io のほうがやりやすいかもしれませんが、プライベートリポジトリでも1並列なら無料で使えるCircleCIを選択しました。(と思いましたが、Shippable などでも良かったかもしれません。いずれ試してみたいです。)
サンプル書籍では、以下のような circle.yml
を置くことでビルドを自動化できました。
# Dockerを使う machine: services: - docker # Dockerイメージを毎回プルしなくても良いようにキャッシュする # See: https://circleci.com/docs/docker#caching-docker-layers dependencies: cache_directories: - "~/docker" override: - docker info - if [[ -e ~/docker/image.tar ]]; then docker load --input ~/docker/image.tar; fi - docker pull vvakame/review - mkdir -p ~/docker; docker save vvakame/review > ~/docker/image.tar # 執筆環境で使うコマンドとは以下の2点が異なる # 1. --rm オプションがエラーになるので使わない # See: https://github.com/docker/docker/issues/4897 # 2. .texmf-varフォルダをマウントしない # キャッシュするためにはdependenciesでキャッシュを作らないといけない test: override: - cd src; docker run -v $(pwd):/work vvakame/review:latest /bin/sh -c "cd /work && review-pdfmaker config.yml" # 生成したPDFを成果物として保存する general: artifacts: - "src/*.pdf"
ジョブは以下の場所から閲覧できます。成果物は自分しか見えないようですが。
forkしたソースコードは以下の場所に置いてあります。
参考
- Configuring CircleCI - CircleCI
https://circleci.com/docs/configuration - Continuous Integration and Delivery with Docker - CircleCI
https://circleci.com/docs/docker - vvakame/docker-review
https://github.com/vvakame/docker-review - [ReVIEW Tips] DockerでRe:VIEW - Qiita
http://qiita.com/takahashim/items/406421d515ef1d4f1189 - Can't destroy container on btrfs: Failed to destroy btrfs snapshot: device or resource busy · Issue #4897 · docker/docker
https://github.com/docker/docker/issues/4897 - boot2dockerでのVolume問題が解決しそう | SOTA
http://deeeet.com/writing/2014/10/08/boot2docker-guest-additions/