r-travisでRのCIを高速化
RでCI、あんまりまじめにしないよなあ。。と思ってたら、ふとTravis CIを使うことがあったので、ちょこっとメモっておきます。
追記(10/23):
r-travisを使うのはもう古いやり方のようです。。すみません。
これ、travis 標準の r_binary_packages というタグを使った方がよさそうです
http://t.co/aNAs7uGtM7
— sinhrks (@sinhrks) 2015, 10月 19
r-travisとは
Dirkがこんな記事を書いてました。
依存パッケージが多くてインストールに時間がかかる、という話らしいです。「Hadley Tax」とは言い得て妙です。(Hadleyは反論してた気がしますけど)
遅いのはなぜかというと、Linuxの場合は毎回パッケージのビルドが必要になるためです。(Windowsはバイナリをインストールするだけなのでその点はお手軽です)。 でも、Linuxでもバイナリをインストールする方法があります。それは、OSのパッケージ管理(Ubuntuだとapt)を使うことです。
とりあえず普通にやってみる
まずはr-travisを使わずにやってみます。devtools
パッケージにデフォルトの.travis.ymlを生成してくれるuse_travis()
という関数があるのでそれを使います。
devtools::use_travis()
以下のような.travis.ymlができているはずです。
language: r warnings_are_errors: true sudo: required
たった三行。シンプルです。これだけでパッケージをビルドして、テストを走らせてくれます。
warning_are_errors
はデフォルトではtrue
になってますが、これはかなり厳しいチェックなので、CRANに送るパッケージでなければfalse
にしておいてもいいかもしれません。
たとえば、ひとつでもドキュメントのない関数があるとワーニングが出てビルドが失敗したとみなされます。
ビルドステータスを表示させるには、READMEに下の一行を書いておきます。USER/REPO
の部分は実際のユーザ名とレポジトリ名に読み替えてください。
[![Travis-CI Build Status](https://travis-ci.org/USER/REPO.svg?branch=master)](https://travis-ci.org/USER/REPO)
試しにqiitr
のレポジトリでやってみました。2分半ほどかかっています。
(https://travis-ci.org/yutannihilation/qiitr/builds/85903010)
ちなみに、もっと細かいオプションを指定することもできます。たとえば、今回は引っかかりませんでしたが、依存している外部ライブラリがある場合はapt_packages
に指定します。ドキュメントはこれ:Building an R Project - Travis CI
r-travisを使ってみる
r-travisの場合は、以下のような.travis.ymlになります。上で3行だったのが一転、長いです。
sudo: required language: c before_install: ## r-travis by Craig Citro et al - curl -OL http://raw.github.com/craigcitro/r-travis/master/scripts/travis-tool.sh - chmod 755 ./travis-tool.sh - ./travis-tool.sh bootstrap install: - ./travis-tool.sh install_aptget r-cran-testthat r-cran-XXX r-cran-YYY script: - ./travis-tool.sh run_tests notifications: email: on_success: change on_failure: change
(https://github.com/yutannihilation/qiitr/blob/master/.travis.yml)
まず、language
がc
になっています。自力でPPAからRをインストールするためです。
before_install
では、travis-tool.shをダウンロードしてきて、travis-tool.sh bootstrap
しています。これによって、R本体やTeXなど、最低限必要なパッケージがインストールされます。
install
では、必要なRのパッケージをインストールしています。ここがちょっと面倒で、language: r
にする場合と違って、必要なパッケージは自分で羅列しないといけません。aptのパッケージ名はだいたい「r-cran-パッケージ名」という命名規則になってますが、違ったり、パッケージがないこともありえます。
travis-tool.sh install_deps
とするとCRANから必要なパッケージをインストールしてくれるんですが、こっちはやっぱりソースからコンパイルしてしまうので少し時間がかかります。
script
では流すテストを書きます。travis-tool.sh run_tests
とすると、すべてのテストを流してくれます。
こっちでやると、45秒でおわりました。速い。
(https://travis-ci.org/yutannihilation/qiitr/builds/85904062)
感想
どちらがいいかは微妙なところです。r-travisは速いですが、依存パッケージが増えたら自分でインストール対象に書く必要があるのがめんどくさそうです。どっかにベストプラクティスころがってないかな...