【问题标题】:Atlassian Bamboo with Django & Python - Possible?带有 Django 和 Python 的 Atlassian Bamboo - 可能吗?
【发布时间】:2010-11-28 00:35:16
【问题描述】:

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

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

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

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

Bamboo 是否在 Python 项目中支持这种类型的东西?

【问题讨论】:

  • 老问题。但是我已经将 py.test 添加为 Bamboo 可执行文件,并简单地使用它来运行测试(指定了 junit-xml 输出)。然后需要将 JUnit 测试解析器作为单独的作业运行。
  • @SamuelO'Malley 你能发一个例子来说明你是如何做到的吗?
  • @MikeyE - 自从发布此评论以来,我实际上已经改变了它的完成方式。现在我是一个 Bamboo Script Task,内容为py.test --junit-xml results.xml,之后我有if [ $? -ne 0 ]; then echo "Test Failed"; fi 吞下返回码。否则,Bamboo 将不允许您隔离单个测试结果,并将整个作业标记为失败。

标签: python django deployment continuous-integration bamboo


【解决方案1】:

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

./manage.py test

通常是这样的:

mvn clean install

或:

ant compile

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

【讨论】:

    【解决方案2】:

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

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

    编辑

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

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

    【讨论】:

    • @Raffi,您能否详细说明为什么 source bin/activate 在文件脚本中不起作用?在内联脚本中使用它很好,但希望尽可能多地移动到文件脚本,因为它更容易维护(版本控制等)。
    • 在 Bamboo 的构建日志和内联脚本中,我有类似 Beginning to execute external process for build 'XXX Django artifactsZZZ #35'\n ... running command line: \n/bin/sh /tmp/SW-DCD-JOB1-35-ScriptBuildTask-9100354988645888838.sh 的内容。内联脚本被刷新到.sh 文件中并执行/bin/shsh 没有 source 内置命令(type source 返回错误)。所以.更符合我这里的要求
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      测试运行器

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

      代码覆盖率

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

      Python 事实上的标准代码覆盖工具,coverage,产生了一些 Cobertura XML 格式,但有一个converter。有一个pytest plugin 用于与覆盖工具集成。

      解决方案

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

      在 Bamboo 侧添加一个运行 tox -e bambooscript task。然后将JUnit parse task 添加到作业中。在其对话框中,在指定自定义结果目录下输入results.xml

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

      1. 打开工作的杂项标签
      2. 检查使用 Clover 收集此构建的代码覆盖率
      3. 选择 Clover 已集成到此构建中,并且将生成一个 clover.xml 文件
      4. Clover XML Location中输入clover.xml

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        相关资源
        最近更新 更多