cl-base + rove + Travis CI でテストする
Lisp Advent Calendar 2019 6日目の記事です。小ネタです。
動機
かねてより Common Lisp のリポジトリでは Roswell を利用して SBCL, CCL の2処理系ぐらいで Travis CI 上で CI を回すようにしています(例: .travis.yml)。ただ、(依存している SBCL の更新の影響が多い印象ですが)ちょくちょく Roswell のインストールに失敗して CI が死ぬことがあります(最近死んだ原因)。
そこで、Roswell インストール済みの拙作 eshamster/cl-base コンテナ上でテストを走らせることで、この辺りの悩みからある程度解放されるのでは...という期待がこの記事の動機です。なお、この cl-base の latest は週1で自動ビルドされています。バージョンタグは...気紛れで更新されます(現在 2.4.1 が最新)。
他、記事タイトルの rove は深町さん作のテストライブラリです。 package-inferred-system
に対応しているあたりを理由にいつも使わせて頂いています。
できたもの
本題に入る前に、下記のリポジトリを作って試行錯誤していました。CC0ライセンスなので万が一使いたい方が入れば適当にコピーして持っていってください。rove + Travis CI + SBCL & CCL な CI が目的であれば .travis.yml
ファイルと test-docker
フォルダをそのまま持っていけば動くはずです。(Roswellでインストール可能な)処理系を足し引きしたい場合は2箇所ほど手を入れれば動くはずです。
中身
本題は下記の4ファイルだけなのでササッと見ていきます。いずれも短いものなので全文コピーしています。
. ├── .travis.yml └──test-docker ├── Dockerfile ├── run.sh └── test.sh
まずは入口になる .travis.yml
を見ます。
https://github.com/eshamster/try-test-in-docker/blob/master/.travis.yml
services: - docker env: matrix: - LISP=sbcl-bin - LISP=ccl-bin before_install: - docker build -t test test-docker script: - test-docker/run.sh
env
のmatrix
で対象の処理系を指定します- 処理系の足し引きで要書き換えな箇所その1
before_install
はtest-docker
フォルダのファイルで docker build するだけですscript
も同フォルダのスクリプトを走らせるだけです
※2019/12/24 追記:警告が出ていたことに気付いたので若干修正しました
次に Dockerfile です。
https://github.com/eshamster/try-test-in-docker/blob/master/test-docker/Dockerfile
FROM eshamster/cl-base:2.4.1 ADD ./test.sh /root RUN ros install ccl-bin && \ ros install rove CMD ["/root/test.sh"]
- SBCL は Roswell と共に入るので、追加で CCL (ccl-bin) をインストールします
- 処理系の足し引きで要書き換えな箇所その2
次にここの CMD で走らせる test.sh
です。
https://github.com/eshamster/try-test-in-docker/blob/master/test-docker/test.sh
#!/bin/sh set -eux ros use ${LISP} cd ~/.roswell/local-projects/target rove *.asd
- 基本的に後述の
run.sh
のお膳立てのもとに rove を走らせるだけです- お膳立て1:
LISP
環境変数の供給 - お膳立て2:
~/.roswell/local-projects/target
へのプロジェクト設置
- お膳立て1:
- ここで
ros install ${LISP}
をすれば処理系足し引き時に Dockerfile の書き換えは不要になりますが build 時にやっておきたい気持ち
最後に run.sh
です。
https://github.com/eshamster/try-test-in-docker/blob/master/test-docker/run.sh
#!/bin/sh set -eux base_dir=$(dirname ${0}) cd ${base_dir}/.. docker run -e LISP=${LISP} -v $(pwd):/root/.roswell/local-projects/target -t test
test.sh
のためのお膳立てをして docker run します。
ということで小ネタでした。