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

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。这让我可以在本地运行

tl;博士:

我正在使用
tox
travis-CI
为我的一个项目建立CI,该项目托管在github上。在构建结束时,我运行
converalls
将覆盖率报告推送到
covergalls.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
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。对