繁体   English   中英

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

[英]Conditional Commands in tox? (tox, travis-ci, and coveralls)

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。 我希望只有在travis-ci上进行测试时才运行coveralls 有什么方法可以让我有条件地运行这个命令,或者设置一个实现相同效果的构建配置?

我已经尝试将工作服部分移动到.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

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

我对 Travis、tox 和工作服有类似的设置。 我的想法是仅在设置了TRAVIS环境变量时才执行coveralls 但是,这似乎并不容易,因为 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

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

配置文件

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。

如果您使用Makefile并且不想要新的 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 tox.ini commands

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM