Условные команды в 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

Другие вопросы по тегам