Chi*_*ank 19 python travis-ci tox 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这个文件让我在本地运行测试.但是,由于最后的coveralls呼叫,测试原则上失败了:
py27 runtests: commands[1] | coveralls
You have to provide either repo_token in .coveralls.yml, or launch via Travis
ERROR: InvocationError: ...coveralls'
Run Code Online (Sandbox Code Playgroud)
这是预期的错误.该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
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是在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
Run Code Online (Sandbox Code Playgroud)
我和Travis,tox和工作服有类似的设置.我的想法是只coveralls在TRAVIS设置环境变量时才执行.但是,似乎这并不容易,因为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)
Run Code Online (Sandbox Code Playgroud)
在tox.ini,coveralls用python {toxinidir}/run_coveralls.py.替换你的命令.
我正在使用环境变量来运行其他命令。
配置文件
commands =
coverage run runtests.py
{env:POST_COMMAND:python --version}
Run Code Online (Sandbox Code Playgroud)
.travis.yml
language: python
python:
- "3.6"
install: pip install tox-travis
script: tox
env:
- POST_COMMAND=codecov -e TOX_ENV
Run Code Online (Sandbox Code Playgroud)
现在在我的本地设置中,它打印 python 版本。从 Travis 运行时,它会运行 codecov。
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |