YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

Jenkinsでtox経由のpytestの結果を受け取るように設定する

はじめに

こんにちは、Python界の情弱です。前回はJenkinsを導入するところまで。今回はPythonで書かれたプロジェクトのテストを走らせて結果を表示するまで。pytestを使った場合の結果の取得方法を調べたのでメモ。

参考

準備

まずテストを走らせるためにCIが実行するスクリプトが必要。Jenkinsはユーザjenkinsで動いているためそいつにPythonとかGitの設定をしてやらないといけない。

Gitの設定

GitHubにアクセスするときはempty identだとエラーになるので設定しておく。Gitのユーザ名とメールアドレスをJenkinsの管理画面で設定しておく。
Jenkinsの管理 > システムの管理でGit pluginの設定をする。
f:id:ymotongpoo:20120424205802p:image

jenkinsユーザがtoxを使えるようにする

jenkinsユーザはホームディレクトリがないので、pythonbrewとか使うにも色々設定したりするのがめんどくさい。しょうがないので、pipとtoxだけ素のPythonから使えるようにする。(自前でビルドしてjenkinsユーザのプロファイルにそのパスを追加しとくんでもいいけど、設定するのがめんどくさかったのでやめた)

(ymotongpoo)% sudo apt-get install python-pip
(ymotongpoo)% sudo pip install tox
(ymotongpoo)% sudo -u jenkins python -c "import tox; print tox.__version__"
1.3

無事jenkinsユーザからでもtoxが使えるようになりました。

Python Pluginのインストール

調べたらjenkinsユーザ自体がtoxを走らせるにはPython Pluginが一番便利っぽいということで入れる。
f:id:ymotongpoo:20120424203202p:image
いつものJenkinsの管理 > プラグインの管理からPython Pluginを探してインストール。

toxの準備

tox.iniファイルを作成します。

  • tox.ini
[tox]
envlist = py26, py27

[testenv:py27]
basepython = /opt/python/2.7/bin/python2.7

[testenv]
deps = 
  pytest
  requests

commands =
  py.test \
    --junitxml=junit-{envname}.xml \
    test

当方Ubuntu 10.04のためPython 2.7は自前ビルドなので、py27に実行ファイルまでのパスを教えてあげる。またJenkinsはJUnit形式のログしか読めないのでその旨記述。あとpy.testがtestディレクトリ以下のテストを実行するようにするためにディレクトリ指定。ちなみにプロジェクトの階層はこんな感じ。

% tree -L 1 <project>
<project>
├── LICENSE
├── README.rst
├── docs/
├── pavement.py
├── <package>/
├── samples/
├── setup.py
├── test/
└── tox.ini

あとtoxでテスト実行する際にsetup.pyでREADME.rstを読み込んでる部分がエラーになるので若干修正。関係あるところだけ抜き出すと

  • setup.py
import os.path

def read_file(name):
    path = os.path.join(os.path.dirname(__file__), name)
    with open(os.path.abspath(path), 'r') as f:
        data = f.read()
        return data

try:
    long_description = read_file('README.rst'),
except IOError:
    long_description = ""

どうせtoxはテスト時しか使わないのでsetup.pyに渡すlong_descriptionは適当で大丈夫。

プロジェクトの設定

やっと準備出来たのでJenkinsプロジェクトの設定をする。
ダッシュボード > 新規ジョブの作成 > マルチ構成プロジェクトのビルド を選択。
f:id:ymotongpoo:20120425105516p:image
そのままプロジェクトの設定画面になるので順次設定。ソースコード管理システムはGitを選んでレポジトリはJenkins側からコミットするわけでもなければGitHubならGit read-onlyのURLを渡しとけばいい。またテストを行うデフォルトのブランチ名も指定する。僕はgit-flow使ってるのでdevelopとしておく。
f:id:ymotongpoo:20120425105517p:image
ビルドトリガは適当に設定しておく。僕はSCMをポーリングを10分おきに行う設定にした。
次にマトリックスの設定。ここでユーザ定義でtoxのtestenvを記述していく。名前は適当でよくて、値のところにtoxのenv名を書いていく。今回はpy26とpy27とする。
f:id:ymotongpoo:20120425105518p:image
最後にビルドとビルド後の処理の設定をする。ここでPython Pluginを入れておいて良かった話になる。
f:id:ymotongpoo:20120425105520p:image
Execute Python Scriptにしてtoxがcommandを実行するように記述。またビルド後(テスト実行後)にtoxのテスト結果を取得できるように、tox.iniで-junitxmlに渡したファイル名を記述。

  • ビルド用(テスト実行用)スクリプト
import tox
tox.cmdline()
  • ビルド後(テスト実行後)の処理

JUnitテスト結果の集計」を選択して、テスト結果XMLを次のとおりにする。

**/junit-*.xml
テストを実行してみる

とりあえずプロジェクトのビルドを実行してみる。
f:id:ymotongpoo:20120425105521p:image
初回はワークスペースにGitレポジトリをチェックアウトしてきたり、tox用にvirtualenvの環境作ったりするので若干時間かかる。出力内容はコンソール出力で見られるので、テストが失敗してたらそこを確認すればだいたい分かる。
f:id:ymotongpoo:20120425105522p:image

Jenkinsを使ったPythonのテストやSphinxのビルドはBeProudさんで書かれたPythonプロフェッショナルプログラミングで1章割いてあります。こちらではMercurialを使っていたりSphinxのビルドを使っていたりします。ステマです。でもPythonプロジェクトの運用が書かれた日本語書籍は実質いまこれとエキスパートPythonプログラミングしかないと思います。

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング