Условные команды в токсике? (токсины, 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
Ответы
Ответ 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 он запускает кодеки.