Подтвердить что ты не робот

Условные команды в токсике? (токсины, travis-ci и комбинезоны)

TL;DR:

Я настраиваю 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, и без трайва там, чтобы предоставить эту информацию, команда должна выйти из строя. Я не хочу, чтобы это подталкивало результаты к 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
4b9b3361

Ответ 1

У меня есть аналогичная установка с Трэвисом, токсином и комбинезонами. Моя идея состояла в том, чтобы выполнить только coveralls, если установлена ​​переменная среды TRAVIS. Однако, кажется, это не так легко сделать, поскольку у токсина возникают проблемы с обработкой команд с помощью котировок и амперсандов. Кроме того, это смутило меня .

В конце концов я написал простой python script 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.

Ответ 2

Альтернативным решением было бы префикс команды 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

Ответ 3

Я использую переменную окружения для запуска дополнительных команд.

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. При запуске из Travis он запускает кодеки.