2015-09-24 19 views
13

tl; dr:Comandi condizionali in tox? (Tox, Travis-ci, e tute)

Sono la creazione di CI per un mio progetto, ospitato su GitHub, utilizzando tox e travis-ci. Alla fine della compilazione, eseguo converalls per inviare i rapporti sulla copertura a coveralls.io. Vorrei rendere questo comando 'condizionale' - per l'esecuzione solo quando i test vengono eseguiti su travis; non quando sono eseguiti sulla mia macchina locale. C'è un modo per farlo accadere?

I dettagli:

Il pacchetto che sto cercando di testare è un pacchetto python. Sto usando/pianificando di utilizzare la seguente 'infrastruttura' per impostare i test:

  • I test stessi sono della varietà py.test.
  • Lo script IC, per così dire, è da tox. Questo mi consente di eseguire i test localmente, il che è piuttosto importante per me. Non voglio dover passare a Github ogni volta che ho bisogno di una corsa di prova. Io uso anche numpy e matplotlib nel mio pacchetto, quindi eseguire un numero imprecisato di cicli di test su travis-ci mi sembra troppo dispendioso. Come tale, l'ammaraggio tox e semplicemente l'uso di .travis.yml da soli non sono un'opzione.
  • Il server C'è travis-ci

Gli script di prova pertinenti simile a questa:

.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 

Questo file mi consente di eseguire i test localmente. Tuttavia, a causa della coveralls chiamata finale, il test non riesce in linea di principio, con:

py27 runtests: commands[1] | coveralls 
You have to provide either repo_token in .coveralls.yml, or launch via Travis 
ERROR: InvocationError: ...coveralls' 

Questo è un errore previsto. Il bit passenv invia le informazioni necessarie da travis per poter scrivere su coveralls e, in assenza di travis per fornire queste informazioni, il comando dovrebbe fallire. Non voglio che questo spinga i risultati alla tuta. Mi piacerebbe avere coveralls eseguito solo se il test si verifica su travis-ci. C'è un modo in cui posso eseguire questo comando in modo condizionale o impostare una configurazione di build che ottenga lo stesso effetto?

Ho già provato a spostare la porzione tute in .travis.yml, ma quando questo viene eseguito coveralls sembra essere in grado di individuare il file appropriato .coverage di inviare oltre. Ho fatto vari tentativi in ​​questa direzione, nessuno dei quali ha portato a una sottomissione riuscita a coveralls.io eccetto la combinazione sopra elencata. Quello che avrei sperato avrebbe funzionato, dato che quando eseguo tox localmente mi ritrovo con un file .coverage dove mi aspetterei - nella cartella radice del mio albero dei sorgenti.

Nessun invio a tute.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 

risposta

7

Ho una configurazione simile con Travis, tox e tute. La mia idea era di eseguire solo coveralls se la variabile di ambiente TRAVIS è impostata. Tuttavia, sembra che non sia così facile da fare, dato che il tox ha problemi nell'analizzare i comandi con citazioni ed e commerciali. Inoltre, questo confused Travis me a lot.

Alla fine ho scritto un semplice script 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) 

In tox.ini, sostituire il vostro comando coveralls con python {toxinidir}/run_coveralls.py.

+0

Bella soluzione! Ma è meglio dare un nome allo script 'run_coveralls.py', per evitare il conflitto di nomi con il vero pacchetto' delle tute '. – alexanderlukanin13

+0

Mi chiedo come 'run_coveralls.py' dovrebbe essere più facilmente incluso/chiamato? C'è un messaggio di errore 'impossibile aprire il file 'run_coveralls.py': [Errno 2] Nessun file o directory come il file non viene copiato nell'ambiente virtuale tox '. Suppongo che non dovrebbe essere incluso come parte del pacchetto. –

+0

Penso di essere riuscito a trovare una soluzione da solo. 'python {toxinidir}/run_coveralls.py' sembra funzionare. –

7

Una soluzione alternativa potrebbe essere quella di precedere il comando coveralls con un trattino (-) per dire tox di ignorare il codice di uscita come spiegato in the documentation. In questo modo anche gli errori da coveralls verranno ignorati e tox considererà l'esecuzione del test come eseguita correttamente localmente.

Utilizzando l'esempio di configurazione di cui sopra, sarebbe la seguente:

[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 
0

Sto usando una variabile ambientale per eseguire comandi aggiuntivi.

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 

Ora, nel mio setup locale, stampare la versione di Python. Quando viene eseguito da Travis, esegue codecov.