Travis でのテストを事前にローカルで試す

Posted: , Modified:   Go Docker Python TravisCI Qiita

本稿は Qiita 投稿記事 のバックアップです.

概要

English

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 にしか対応していないので,随時対応言語を増やす予定.