37

在我的公司,我们目前使用Atlassian Bamboo作为我们的持续集成工具。我们目前在所有项目中都使用 Java,所以效果很好。

但是,我们正在考虑将 Django + Python 用于我们的一个新应用程序。我想知道是否可以为此使用 Bamboo。

首先,让我说我对 Bamboo 的熟悉程度很低,因为我只使用过它,没有配置它(除了简单的更改,比如更改构建的 svn checkout 目录)。

显然,仅仅运行一个构建并没有什么意义(因为 Python 项目并没有真正构建),但我希望能够使用 Bamboo 来运行测试套件,以及使用竹子来部署以我们处理 Java 项目的方式,将最新代码添加到我们的各种测试环境中。

Bamboo 是否通过 Python 项目支持这种类型的事情?

4

4 回答 4

27

Bamboo 本质上只是运行一个 shell 脚本,所以这很容易:

./manage.py test

因为它通常是:

mvn clean install

或者:

ant compile

您可能需要将 Django 测试运行程序的输出转换为传统的 JUnit XML 输出,以便 Bamboo 可以为您提供关于通过了多少测试的漂亮图表。查看这篇关于使用 xmlrunner.py 让 Python 与Hudson一起工作的帖子。也看看NoseXUnit

于 2009-09-14T04:51:13.430 回答
16

您甚至可以很容易地在干净的环境中为 pip 和 virtualenv 添加引导程序,这很酷:

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因此不起作用。bashsh

编辑

更好的是,我们可以在它上面运行单元测试,输出可以被竹子的 JUnit 解析的 xml 输出:

pip install unittest-xml-reporting
python manage.py test --noinput --testrunner="xmlrunner.extra.djangotestrunner.XMLTestRunner"
于 2014-09-04T13:49:23.307 回答
9

事实证明这是可能的。有两个主要的集成任务:测试运行器结果和代码覆盖率结果。我假设普通的 Python 3 代码库和标准unittest测试套件。

测试赛跑者

Bamboo 期望JUnit XML 格式的测试运行器结果。Cheese Shop 上有单独的测试运行器能够产生这样的输出,但它需要你编写一些代码来运行它,这并不好。保持代码库完整的更好方法是使用pytest的功能。

代码覆盖率

Bamboo 仅支持 Atlassian Clover 的 XML 格式。这里的重要说明是,您不需要启用 Atlassian Clover 插件(以及需要花费一些钱的许可)。竹子自己工作。

Python 事实上的标准代码覆盖工具coverage产生了某种 Cobertura XML 格式,但是有一个转换器。有一个用于与覆盖工具集成的pytest 插件。

解决方案

这是我使用 pytest 使 Bamboo 集成工作的Tox环境。

[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用于命令行不支持的配置。它再次使您免于在 repo 的根目录中产生额外的混乱。pytest 尝试tox.ini自动读取。pytest-cov 绕过.coveragerc,但因为它也是一个 INI 文件,所以tox.ini适合。

在 Bamboo 端添加一个运行的脚本任务tox -e bamboo。然后将JUnit 解析任务添加到作业中。在其对话框中,在指定自定义结果目录下放置results.xml

覆盖配置以其他方式完成。

  1. 打开工作的其他选项卡
  2. 选中使用 Clover 收集此构建的代码覆盖率
  3. Select Clover 已集成到此构建中,并且将生成一个 clover.xml 文件
  4. 输入clover.xmlClover XML 位置

在此处输入图像描述

此时,在您的下一个构建中,您将看到总覆盖率和两个图表:覆盖历史代码行历史。覆盖工具生成交互式 HTML 也很不错,因此您可以深入到特定的代码行。

上面所做的设置(至少在 Bamboo 5.7 中)在Artifact作业的选项卡中创建了Clover Report (System) 。打开它并设置为Location字段,并设置为Copy pattern。Bamboo 现在将收集 HTML 报告。您可以在计划的Clover选项卡上看到它。htmlcov*.*

于 2016-09-15T10:54:43.940 回答
0

如果您使用 pytest,您可以简单地使用py.test --junitxml=/path/to/results/xml/file.xml

于 2015-07-13T21:31:24.307 回答