22

tl;博士:

我正在为我的一个项目设置 CI,托管在 github 上,使用toxtravis-ci. 在构建结束时,我运行converalls将覆盖率报告推送到coveralls.io. 我想让这个命令“有条件”——仅在 travis 上运行测试时执行;不是当它们在我的本地机器上运行时。有没有办法做到这一点?

细节:

我要测试的包是一个 python 包。我正在使用/计划使用以下“基础设施”来设置测试:

  • 测试本身是py.test多种多样的。
  • 可以说,CI 脚本来自tox. 这让我可以在本地运行测试,这对我来说相当重要。我不想每次需要测试运行时都推送到 github。我也在我的包中使用numpymatplotlib,所以运行大量的测试周期对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]
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。我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
4

4 回答 4

11

另一种解决方案是在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
于 2016-11-25T11:04:10.923 回答
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)

tox.ini中,将您的coveralls命令替换为python {toxinidir}/run_coveralls.py

于 2015-10-08T09:50:46.827 回答
5

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

毒物

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。

于 2018-02-19T17:04:15.160 回答
1

Makefile如果您使用 a并且不想要新的 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_commands

于 2020-02-26T21:38:19.527 回答