[英]Conditional Commands in tox? (tox, travis-ci, and coveralls)
tl;博士:
我正在为我的一个项目设置 CI,托管在 github 上,使用tox
和travis-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]
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。 我希望只有在travis-ci
上进行测试时才运行coveralls
。 有什么方法可以让我有条件地运行这个命令,或者设置一个实现相同效果的构建配置?
我已经尝试将工作服部分移动到.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
另一种解决方案是在coveralls
命令前加上一个破折号 ( -
) 来告诉tox
忽略它在文档中解释的退出代码。 这样,即使是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
我对 Travis、tox 和工作服有类似的设置。 我的想法是仅在设置了TRAVIS
环境变量时才执行coveralls
。 但是,这似乎并不容易,因为 tox 无法解析带有引号和与号的命令。 此外,这令人困惑 特拉维斯 我很多。
最后我写了一个简单的 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
。
我正在使用环境变量来运行其他命令。
配置文件
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。
如果您使用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
tox.ini
commands
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.