概要
GitHub などでホストしているプロジェクトのテストに,Travis CI などのクラウド CI サービスを利用するケースは多いだろう.
基本的に,ローカルの開発環境でテストに通ったことを確認してから,コミット,プッシュを行うはずなので,Travis 上でもテストはパスするはずである.しかし,Travis の設定ファイルである.travis.yml
のミスや,依存ライブラリの追加忘れなどのうっかりで時々テストが失敗する.特に依存ライブラリの場合,開発環境ではたまたまインストールされていると,ローカルでのテストはパスしてしまうため,見落とすことがある.
テストが失敗すると,ローカル環境で修正の後,再プッシュとなりリモートブランチのコミット履歴が汚れて行くので,ミスはできるだけ避けるべきである(特に,他人のリポジトリでやらかすと気まずい).そこで,Python または Go 言語のプロジェクト用に,Docker を使ってローカルにまっさらな環境を用意し,.travis.yml
に記載された通りにテストを実行するツール,Loci を作成した.
デモ
インストール
まず,Docker が必要になるので,あらかじめインストールしておく(Docker の導入方法については割愛する).
Loci のインストールは,Go がインストールされている環境ならば,
$ go get github.com/jkawamoto/loci
Homebrew がインストールされている環境ならば,
$ brew tap jkawamoto/loci
$ brew install loci
にて行える.それ以外の場合は,GitHubにコンパイル済みのバイナリがあるので,ダウンロードしてパスの通ったところへ置けば良い.
使い方
カレントディレクトリに,.travis.yml
がある場合,loci
コマンドを実行するだけで良い.別ファイルをテストする場合は,loci <filepath>
とファイルパスを渡す.
Loci はカレントディレクトリ以下に含まれるファイルを持ち,.travis.yml
に記載されたパッケージをインストールしたコンテナイメージを作成する.元になるイメージは ubuntu:latest
である.初回実行時は,パッケージのインストールなどである程度の時間を要するが,2回目以降は,依存パッケージに変更がなければ,過去のコンテナイメージを適宜再利用する(Dockerの機能).
もし自前で, APT キャッシュサーバや PyPI キャッシュサーバを用意している場合,--apt-proxy
や --pypi-proxy
フラッグを使うことで,それらを利用するようになる.(参考: QNAP に Apt キャッシュサーバを建てる, QNAP に Pypi キャッシュサーバを建てる)
全部のコマンドオプションは次の通り.
loci [global options] [script file]
If script file isn't given, .travis.yml will be used.
GLOBAL OPTIONS:
--name NAME, -n NAME creating a container named NAME to run tests,
and that container will not be deleted.
--tag TAG, -t TAG creating an image named TAG.
--base TAG, -b TAG use image TAG as the base image.
(default: "ubuntu:latest")
--verbose verbose mode, which prints Dockerfile and
entrypoint.sh.
--apt-proxy URL URL for a proxy server of apt repository.
[$APT_PROXY]
--pypi-proxy URL URL for a proxy server of pypi repository.
[$PYPI_PROXY]
--http-proxy URL URL for a http proxy server. [$HTTP_PROXY]
--https-proxy URL URL for a https proxy server. [$HTTPS_PROXY]
--no-proxy LIST Comma separated URL LIST for which proxies won't
be used. [$NO_PROXY]
--help, -h show help
--version, -v print the version
今後の予定
現在のところ,Python と Go にしか対応していないので,随時対応言語を増やす予定.