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箇所ほど手を入れれば動くはずです。

github.com

中身

本題は下記の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
  • envmatrix で対象の処理系を指定します
    • 処理系の足し引きで要書き換えな箇所その1
  • before_installtest-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 へのプロジェクト設置
  • ここで 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 します。

ということで小ネタでした。