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 anchenumpy
ematplotlib
nel mio pacchetto, quindi eseguire un numero imprecisato di cicli di test sutravis-ci
mi sembra troppo dispendioso. Come tale, l'ammaraggiotox
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
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
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. –
Penso di essere riuscito a trovare una soluzione da solo. 'python {toxinidir}/run_coveralls.py' sembra funzionare. –