Python tox中的条件命令?(tox、travis ci和工作服)
tl;博士: 我正在使用Python tox中的条件命令?(tox、travis ci和工作服),python,travis-ci,tox,coveralls,Python,Travis Ci,Tox,Coveralls,tl;博士: 我正在使用tox和travis-CI为我的一个项目建立CI,该项目托管在github上。在构建结束时,我运行converalls将覆盖率报告推送到covergalls.io。我想让这个命令成为“有条件的”——仅当测试在travis上运行时才执行;当它们在我的本地机器上运行时就不会了。有没有办法做到这一点 详情如下: 我尝试测试的包是一个python包。我正在使用/计划使用以下“基础设施”来设置测试: 测试本身属于py.test类型 可以说,CI脚本来自tox。这让我可以在本地运行
tox
和travis-CI
为我的一个项目建立CI,该项目托管在github上。在构建结束时,我运行converalls
将覆盖率报告推送到covergalls.io
。我想让这个命令成为“有条件的”——仅当测试在travis上运行时才执行;当它们在我的本地机器上运行时就不会了。有没有办法做到这一点
详情如下:
我尝试测试的包是一个python包。我正在使用/计划使用以下“基础设施”来设置测试:
- 测试本身属于
类型py.test
- 可以说,CI脚本来自
。这让我可以在本地运行测试,这对我来说相当重要。我不想每次需要测试运行时都要推到github。我还在包中使用tox
和numpy
,因此在matplotlib
上运行大量的测试周期对我来说太浪费了。因此,单独使用travis ci
和tox
是不可取的.travis.yml
- CI服务器是
travis CI
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
这个文件允许我在本地运行测试。但是,由于最后的工作服调用,测试原则上失败,原因是:
py27 runtests: commands[1] | coveralls
You have to provide either repo_token in .coveralls.yml, or launch via Travis
ERROR: InvocationError: ...coveralls'
这是预期的错误。passenv
位从travis
发送必要的信息,以便能够写入工作服
,如果travis不提供这些信息,命令应该会失败。我也不想把结果推到workalls.io上。仅当测试在travis ci
上进行时,我希望运行工作服。有没有什么方法可以让这个命令有条件地运行,或者设置一个构建配置来达到相同的效果
我已经尝试将工作服部分移动到.travis.yml
,但是执行时工作服
似乎无法找到要发送的相应.coverage
文件。我在这方面做了各种尝试,除了上面列出的组合之外,没有一次成功地提交到covergalls.io
。以下是我希望能起作用的,因为当我在本地运行tox
时,我最终会在我期望的地方得到一个.coverage
文件——在我的源代码树的根文件夹中
不服从工作服。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
我对特拉维斯、托克斯和工作服也有类似的安排。我的想法是,如果设置了TRAVIS
环境变量,则只执行workalls
。然而,这似乎不是那么容易做到,因为tox在解析带有引号和符号的命令时遇到了麻烦。此外,这一点也很重要
最后,我编写了一个简单的python脚本run_workalls.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
中,用python{toxinidir}/run_-coveralls.py替换coveralls
命令,另一种解决方案是在coveralls
命令前面加一个破折号(-
),告诉tox
忽略其退出代码,如前所述。这种方式甚至会忽略<>代码>封面>代码>,<>代码> 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
我正在使用环境变量来运行其他命令
伊氏弓形虫
commands =
coverage run runtests.py
{env:POST_COMMAND:python --version}
特拉维斯·伊梅尔先生
language: python
python:
- "3.6"
install: pip install tox-travis
script: tox
env:
- POST_COMMAND=codecov -e TOX_ENV
现在在我的本地设置中,它打印python版本。从Travis运行时,它会运行codecov。如果您使用生成文件
并且不需要新的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中
添加制作工作服
到命令
很好的解决方案!但是最好将脚本命名为run\u coveralls.py
,以避免名称与实际的coveralls
包冲突。我想知道如何最方便地包含/调用run\u coveralls.py
?出现错误消息无法打开文件“run_coveralls.py”:[Errno 2]没有此类文件或目录
,因为该文件未复制到tox虚拟环境。我想不应该把它作为一揽子计划的一部分,我想我自己设法找到了一个解决办法python{toxinidir}/run_workalls.py
似乎可以工作。您应该删除import sys
,因为您的解决方案不需要它……请参阅示例tox.ini
和更高级的workalls.py
。这就是方法{env:POST_COMMAND:python--version}
是辉煌的体现,因为当环境变量未定义时,它会无声地减少到noop。对