tox中的条件命令? (tox,travis-ci和工作服)

时间:2015-09-24 09:22:36

标签: python travis-ci tox coveralls

TL; DR:

我正在使用toxtravis-ci在github上托管我的项目的CI。在构建结束时,我运行converalls将覆盖率报告推送到coveralls.io。我想让这个命令'有条件' - 只有当测试在travis上运行时才能执行;不是当他们在我的本地机器上运行时。有没有办法让这种情况发生?

详情:

我正在尝试测试的包是一个python包。我正在使用/计划使用以下“基础设施”来设置测试:

  • 测试本身属于py.test种。
  • 可以说,CI脚本来自tox。这让我可以在本地运行测试,这对我来说非常重要。我不想每次需要测试运行时都要推送到github。我在我的软件包中也使用了numpymatplotlib,因此在travis-ci上运行多个测试周期对我来说似乎过于浪费。因此,放弃tox并单独使用.travis.yml不是一种选择。
  • CI服务器为travis-ci

相关的测试脚本如下所示:

.travis.yml

language: python
python: 2.7
env:
  - TOX_ENV=py27
install:
  - pip install tox
script:
  - tox -e $TOX_ENV

tox.ini

[tox]
envlist = py27

[testenv]
passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH
deps =
    pytest
    coverage
    pytest-cov
    coveralls
commands =
    py.test --cov={envsitepackagesdir}/mypackage --cov-report=term --basetemp={envtmpdir}
    coveralls

此文件允许我在本地运行测试。但是,由于最终的coveralls调用,测试原则上失败了:

py27 runtests: commands[1] | coveralls
You have to provide either repo_token in .coveralls.yml, or launch via Travis
ERROR: InvocationError: ...coveralls'

这是预期的错误。 passenv位从travis发送必要信息以便能够写入coveralls,并且没有travis那里提供此信息,命令应该失败。我不希望这会把结果推到coveralls.io。我希望coveralls只有在travis-ci上进行测试时才会运行。有没有什么方法可以让我有条件地运行这个命令,或者设置一个实现相同效果的构建配置?

我已经尝试将工作服部分移动到.travis.yml,但是当执行时coveralls似乎无法找到要发送的相应.coverage文件。我在这方面做了各种尝试,除了上面列出的组合之外,没有一个尝试成功提交coveralls.io。以下是我希望可以工作的内容,因为当我在本地运行tox时,我最终得到了一个.coverage文件,我希望它在我的源代码树的根文件夹中。

没有提交到coveralls.io

language: python
python: 2.7
env:
  - TOX_ENV=py27
install:
  - pip install tox
  - pip install python-coveralls
script:
  - tox -e $TOX_ENV
after_success:
  - coveralls

4 个答案:

答案 0 :(得分:9)

另一种解决方案是在coveralls命令前加上短划线(-),告诉tox忽略其退出代码,如in the documentation所述。这样,即使来自coveralls的失败也将被忽略,tox将在本地执行时将测试执行视为成功。

使用上面的示例配置,它将如下:

[tox]
envlist = py27

[testenv]
passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH
deps =
    pytest
    coverage
    pytest-cov
    coveralls
commands =
    py.test --cov={envsitepackagesdir}/mypackage --cov-report=term --basetemp={envtmpdir}
    - coveralls

答案 1 :(得分:8)

我和Travis,tox和工作服有类似的设置。我的想法是,如果设置了coveralls环境变量,则只执行TRAVIS。但是,似乎这并不容易,因为tox在使用引号和&符号解析命令时遇到问题。另外,这是confused Travis me a lot

最后我写了一个简单的python脚本run_coveralls.py

#!/bin/env/python

import os

from subprocess import call


if __name__ == '__main__':
    if 'TRAVIS' in os.environ:
        rc = call('coveralls')
        raise SystemExit(rc)

tox.ini中,将coveralls命令替换为python {toxinidir}/run_coveralls.py

答案 2 :(得分:2)

我正在使用环境变量来运行其他命令。

tox.ini

commands =
    coverage run runtests.py
    {env:POST_COMMAND:python --version}

.travis.yml

language: python
python:
  - "3.6"
install: pip install tox-travis
script: tox
env:
  - POST_COMMAND=codecov -e TOX_ENV

现在在我的本地设置中,它会打印python版本。从Travis运行时,它运行codecov。

答案 3 :(得分:1)

如果您使用Makefile并不想创建新的py文件,则为替代解决方案:

define COVERALL_PYSCRIPT
import os
from subprocess import call

if __name__ == '__main__':
    if 'TRAVIS' in os.environ:
        rc = call('coveralls')
        raise SystemExit(rc)
    print("Not in Travis CI, skipping coveralls")
endef
export COVERALL_PYSCRIPT

coveralls: ## runs coveralls if TRAVIS in env
    @python -c "$$COVERALL_PYSCRIPT"

tox.ini中将make coveralls添加到commands