首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >毒理中的条件命令?(毒理,特拉维斯,和工作服)

毒理中的条件命令?(毒理,特拉维斯,和工作服)
EN

Stack Overflow用户
提问于 2015-09-24 09:22:36
回答 3查看 3.2K关注 0票数 22

tl;dr:

我正在为我的一个项目建立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

代码语言:javascript
运行
复制
language: python
python: 2.7
env:
  - TOX_ENV=py27
install:
  - pip install tox
script:
  - tox -e $TOX_ENV

tox.ini

代码语言:javascript
运行
复制
[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调用,测试原则上失败,原因如下:

代码语言:javascript
运行
复制
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提交

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

发布于 2016-11-25 11:04:10

另一种解决方案是在coveralls命令前面加上一个破折号(-),告诉tox忽略它的退出代码,就像解释的在文件中一样。这样,即使是来自coveralls的失败也将被忽略,tox将认为在本地执行时测试执行是成功的。

使用上面的示例配置,如下所示:

代码语言:javascript
运行
复制
[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
票数 11
EN

Stack Overflow用户

发布于 2018-02-19 17:04:15

我使用一个环境变量来运行其他命令。

tox.ini

代码语言:javascript
运行
复制
commands =
    coverage run runtests.py
    {env:POST_COMMAND:python --version}

.travis.yml

代码语言:javascript
运行
复制
language: python
python:
  - "3.6"
install: pip install tox-travis
script: tox
env:
  - POST_COMMAND=codecov -e TOX_ENV

现在,在我的本地设置中,它打印python版本。从特拉维斯跑的时候它运行codecov。

票数 5
EN

Stack Overflow用户

发布于 2020-02-26 21:38:19

如果您使用Makefile而不需要一个新的py文件,则可以选择其他解决方案:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32757765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档