【发布时间】:2017-01-24 15:24:58
【问题描述】:
我当前的工作流程是在 Travis CI 上测试的 github PR 和构建,使用 tox 测试 pytest 并将覆盖率报告给 codeclimate。
travis.yml
os:
- linux
sudo: false
language: python
python:
- "3.3"
- "3.4"
- "3.5"
- "pypy3"
- "pypy3.3-5.2-alpha1"
- "nightly"
install: pip install tox-travis
script: tox
tox.ini
[tox]
envlist = py33, py34, py35, pypy3, docs, flake8, nightly, pypy3.3-5.2-alpha1
[tox:travis]
3.5 = py35, docs, flake8
[testenv]
deps = -rrequirements.txt
platform =
win: windows
linux: linux
commands =
py.test --cov=pyCardDeck --durations=10 tests
[testenv:py35]
commands =
py.test --cov=pyCardDeck --durations=10 tests
codeclimate-test-reporter --file .coverage
passenv =
CODECLIMATE_REPO_TOKEN
TRAVIS_BRANCH
TRAVIS_JOB_ID
TRAVIS_PULL_REQUEST
CI_NAME
但是,Travis 没有为拉取请求传递我的环境变量,这导致我的覆盖率报告失败。 Travis 文档将其显示为解决方案:
script:
- 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then bash ./travis/run_on_pull_requests; fi'
- 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./travis/run_on_non_pull_requests; fi'
但是,在 tox 中,这不起作用,因为 tox 正在使用 subprocess python 模块并且不识别 if 作为命令(自然)。
如何仅针对构建而不针对基于 TRAVIS_PULL_REQUEST 变量的拉取请求运行 codeclimate-test-reporter?我必须创建自己的脚本并调用它吗?有更智能的解决方案吗?
【问题讨论】:
-
tox.ini文件不理解流控制(这是可以理解的,它们是.ini文件)。使用逻辑创建自定义脚本是一种选择。第二种选择是将 CI 相关功能移至.travis.yml。归根结底,tox.ini应该包含可以并且应该在每台开发本地机器上运行的逻辑。pylint做了类似的事情。coverallsvenv 在 tox 中声明,但由.travis.yml中的条目触发。 -
我认为要通过 bash 进行控制流工作,您需要 tox 将
shell=True传递给子进程。这是硬编码的,而且埋得很深:github.com/tox-dev/tox/blob/… -
/bin/bash -c这样的东西可以工作吗?
标签: python travis-ci tox code-climate