Atlassian Bamboo与Django和Python搭配使用-是否可行?

37

在我们公司,我们目前使用 Atlassian Bamboo 作为我们的持续集成工具。由于我们所有项目都使用Java,所以它非常适用。

但是,我们正在考虑为我们的一个新应用程序使用Django + Python。我想知道是否可能在这种情况下使用Bamboo。

首先,让我说一下,我对Bamboo的熟悉程度很低,因为我只是使用过它,而没有配置过它(除了像更改svn检出目录等简单的更改)。

显然,仅仅运行构建是没有多大意义的(因为Python项目实际上并不需要构建),但我希望能够使用Bamboo来运行测试套件,并像我们处理Java项目那样使用Bamboo将最新代码部署到各种测试环境中。

Bamboo是否支持Python项目进行此类操作?


这是一个老问题。但是我已经将py.test添加为Bamboo可执行文件,只需使用它来运行测试(指定junit-xml输出)。然后需要单独运行JUnit测试解析器作为另一个任务。 - Samuel O'Malley
@SamuelO'Malley,你能发一个你是怎么做到的例子吗? - MikeyE
1
@MikeyE - 自从发表这个评论后,我已经改变了它的执行方式。现在,我使用Bamboo脚本任务,并将内容设置为py.test --junit-xml results.xml,然后再加上if [ $? -ne 0 ]; then echo "Test Failed"; fi来消耗返回代码。否则,Bamboo将不允许你隔离单个测试结果,并将标记整个作业为失败。 - Samuel O'Malley
4个回答

27

Bamboo基本上只是运行一个shell脚本,因此这也可以很容易地完成:

./manage.py test

通常情况下是这样的:

mvn clean install
或者:
ant compile

你可能需要将Django测试运行器的输出转换成传统的JUnit XML输出格式,以便Bamboo可以为你展示测试通过的数量和漂亮的图表。请查看此文章,了解如何使用xmlrunner.py让Python与Hudson配合工作。另外,还可以参考NoseXUnit


16

你甚至可以在干净的环境中很容易地为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

警告,source bin/activate 不起作用,因为内联脚本任务存储在 sh 文件中(所以 bash 会以 sh 兼容模式运行它)。

编辑

更好的方法是我们可以在其上运行单元测试,并使用可被 Bamboo 的 JUnit 解析的 xml 输出:

pip install unittest-xml-reporting
python manage.py test --noinput --testrunner="xmlrunner.extra.djangotestrunner.XMLTestRunner"

@Raffi,能否详细解释一下为什么在文件脚本中source bin/activate无法工作?在内联脚本中使用良好,但希望尽可能地将其移至文件脚本,因为这样更容易维护(版本控制等)。 - Xabs
1
在Bamboo的构建日志和内联脚本中,我有类似于开始执行外部进程以构建'XXX Django artifactsZZZ #35'\n ... 运行命令行:\n/bin/sh /tmp/SW-DCD-JOB1-35-ScriptBuildTask-9100354988645888838.sh的内容。内联脚本被刷新到一个.sh文件中,并执行/bin/shsh没有source内置命令(type source返回错误)。因此,.更符合我这里想要的内容。 - Raffi

9

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

测试运行器

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

代码覆盖率

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

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

解决方案

这是我使用pytest创建Tox环境,使两个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
覆盖率配置是通过其他方式完成的。
  1. 打开您的作业的杂项选项卡
  2. 勾选“使用Clover收集此构建的代码覆盖率”
  3. 选择“Clover已经集成到此构建中,将生成clover.xml文件”
  4. 在“Clover XML位置”中输入clover.xml

enter image description here

在下一次构建中,您将看到总覆盖率和两个图表:覆盖率历史代码行数历史。拥有交互式的HTML由覆盖工具生成也很不错,这样您可以深入挖掘某些代码行。
上述设置(至少在Bamboo 5.7中)已在Artifact作业选项卡中创建了Clover Report(System)。打开它并将htmlcov设置为位置字段,将*.*设置为复制模式。Bamboo现在将收集HTML报告。您可以在计划的Clover选项卡中查看它。

0
如果您使用pytest,只需使用py.test --junitxml=/path/to/results/xml/file.xml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接