私の会社では、現在、継続的インテグレーションツールに Atlassian Bamboo を使用しています。現在、すべてのプロジェクトでJavaを使用しているため、うまく機能します。
ただし、新しいアプリケーションの1つにDjango + Pythonを使用することを検討しています。これに、Bambooを使用できるかどうか疑問に思いました。
まず、Bambooを使用したことがあり、構成していなかったため(ビルド用にsvn checkoutディレクトリを変更するなどの単純な変更を除く)、Bambooについての知識は低いと言えます。
明らかに、ビルドを実行するだけではあまり意味がありません(Pythonプロジェクトは実際にはビルドされないため)が、Bambooを使用してテストスイートを実行できるようにしたいと思います)また、bambooを使用して、Javaプロジェクトの場合と同じように、さまざまなテスト環境に最新のコードをデプロイします。
BambooはPythonプロジェクトでこのタイプのものをサポートしていますか?
Bambooは基本的にシェルスクリプトを実行するだけなので、これは簡単に次のようになります。
./manage.py test
通常は次のとおりです。
mvn clean install
または:
ant compile
Djangoテストランナーを従来のJUnitXML出力に出力するためにマッサージする必要があるかもしれません。そうすれば、Bambooは、合格したテストの数に関するきれいなグラフを提供できます。 thisを見てください。 post xmlrunner.pyを使用してPython Hudson を操作する方法について。 NoseXUnitもご覧ください。 。
クリーンな環境でpipとvirtualenvにbootstrapを追加することもできますが、これはすばらしいことです。
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py --root=${bamboo.build.working.directory}/tmp --ignore-installed
export PATH=${bamboo.build.working.directory}/tmp/usr/local/bin:$PATH
export PYTHONPATH=${bamboo.build.working.directory}/tmp/usr/local/lib/python2.7/dist-packages:$PYTHONPATH
pip install --root=${bamboo.build.working.directory}/tmp --ignore-installed virtualenv
virtualenv virtual_tmp
cd virtual_tmp
. bin/activate
echo Pip is located `which pip`
pip install Django
pip install djangorestframework
警告、インラインスクリプトタスクはshファイルに保存されているため、source bin/activate
は機能しません(したがって、bash
はsh
互換モードで実行します)。
さらに良いことに、bambooのJUnitで解析できるxml出力を使用して、その上でユニットテストを実行できます。
pip install unittest-xml-reporting
python manage.py test --noinput --testrunner="xmlrunner.extra.djangotestrunner.XMLTestRunner"
それは可能であることがわかりました。 2つの主要な統合タスクがあります。テストランナーの結果とコードカバレッジの結果です。通常のPython 3コードベースと標準のunittest
テストスイートを想定しています。
Bambooは、テストランナーの結果が JUnit XML形式 になることを期待しています。 Cheese Shopにはそのような出力を生成できる 別のテストランナー がありますが、それを実行するには小さなコードを記述する必要がありますが、これはニースではありません。コードベースをそのまま維持するためのより良い方法は、 pytest の機能を使用することです。
Bambooは、AtlassianCloverのXML形式のみをサポートします。ここで重要なのは、Atlassian Cloverプラグインを有効にする必要がないことです(そして、そのライセンスにはいくらかの費用がかかります)。竹はそれ自体で動作します。
Pythonのデファクトスタンダードコードカバレッジツールである coverage は、Cobertura XML形式をいくらか生成しますが、 converter があります。カバレッジツールと統合するための pytestプラグイン があります。
これが Tox 環境で、pytestを使用して両方のBamboo統合を機能させました。
[tox]
envlist = py34
skipsdist = True
[testenv]
setenv = LANG=C.UTF-8
basepython = python3.4
deps = -r{toxinidir}/requirements.txt
[testenv:bamboo]
commands =
py.test --junitxml=results.xml \
--cov=project_name --cov-config=tox.ini --cov-report=xml \
--cov-report=html project_name/test
coverage2clover -i coverage.xml -o clover.xml
deps =
{[testenv]deps}
pytest
pytest-cov
coverage2clover
# read by pytest
[pytest]
python_files = *.py
# read by coverage
[run]
omit=project_name/test/*,project_name/__main__.py
Pytestとpytest-covはどちらも、コマンドラインでサポートされていない構成にtox.ini
を使用することに注意してください。これにより、リポジトリのルートに余分な混乱が生じるのを防ぐことができます。 pytestはtox.ini
を自動的に読み取ろうとします。 pytest-covは .coveragerc
にバイパスしますが、これもINIファイルであるため、tox.ini
が適合します。
Bamboo側で、tox -e bamboo
を実行する スクリプトタスク を追加します。次に、 JUnit解析タスク をジョブに追加します。ダイアログのカスタム結果ディレクトリの指定の下にresults.xml
を入力します。
カバレッジ構成は他の方法で行われます。
clover.xml
をClover XML Locationに入力します次のビルドのこの時点で、合計カバレッジと2つのグラフが表示されます:カバレッジ履歴とコード履歴の行。また、カバレッジツールでインタラクティブなHTMLを作成できるので、特定のコード行にドリルダウンできます。
上記の設定(少なくともBamboo 5.7では)により、アーティファクトジョブのタブにクローバーレポート(システム)が作成されました。それを開き、htmlcov
をLocationフィールドに設定し、*.*
をCopy patternに設定します。 BambooはHTMLレポートを収集します。プランのクローバータブで確認できます。
Pytestを使用する場合は、単にpy.test --junitxml=/path/to/results/xml/file.xml
を使用できます。