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

Chi*_*ank 19 python travis-ci tox coveralls

TL;博士:

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

细节:

我正在尝试测试的包是一个python包.我正在使用/计划使用以下"基础架构"来设置测试:

  • 测试本身就是py.test多种多样的.
  • 可以说,CI脚本来自tox.这让我可以在本地运行测试,这对我来说非常重要.我不想每次需要测试运行时都要推送到github.我也用numpy,并matplotlib在我的包,因此在运行测试周期的空洞的数量上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
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)

jco*_*ado 9

另一种解决方案是在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)


Bre*_*els 8

我和Travis,tox和工作服有类似的设置.我的想法是只coverallsTRAVIS设置环境变量时才执行.但是,似乎这并不容易,因为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,coverallspython {toxinidir}/run_coveralls.py.替换你的命令.


Fed*_* JM 5

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

配置文件

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。