Условные команды в tox? (Tox, Travis-CI и комбинезон)
ТЛ; др:
Я настраиваю CI для моего проекта, размещенного на github, используя tox
а также travis-ci
, В конце сборки я запускаю converalls
подтолкнуть отчеты о покрытии к coveralls.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
Этот файл позволяет мне запускать тесты локально. Однако из-за финала 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
3 ответа
У меня похожая установка с Трэвисом, токсиком и комбинезоном. Моя идея состояла в том, чтобы только выполнить coveralls
если TRAVIS
переменная окружения установлена. Тем не менее, кажется, что это не так легко сделать, так как tox не может разобрать команды с кавычками и амперсандами. Кроме того, это запутано Travis меня много
В конце концов я написал простой скрипт на 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
,
Альтернативным решением будет префикс 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
Я использую переменную среды для запуска дополнительных команд.
tox.ini
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. При запуске из Трэвиса запускаются кодеки.
Альтернативное решение, если вы используете 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
к commands