TL; DR:
我正在使用tox
和travis-ci
在github上托管我的项目的CI。在构建结束时,我运行converalls
将覆盖率报告推送到coveralls.io
。我想让这个命令'有条件' - 只有当测试在travis上运行时才能执行;不是当他们在我的本地机器上运行时。有没有办法让这种情况发生?
详情:
我正在尝试测试的包是一个python包。我正在使用/计划使用以下“基础设施”来设置测试:
py.test
种。tox
。这让我可以在本地运行测试,这对我来说非常重要。我不想每次需要测试运行时都要推送到github。我在我的软件包中也使用了numpy
和matplotlib
,因此在travis-ci
上运行多个测试周期对我来说似乎过于浪费。因此,放弃tox
并单独使用.travis.yml
不是一种选择。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
答案 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