2009-09-14 19 views
31

Nella mia azienda, attualmente utilizziamo Atlassian Bamboo per il nostro strumento di integrazione continua. Al momento utilizziamo Java per tutti i nostri progetti, quindi funziona benissimo.Atlassian Bamboo con Django e Python - Possibile?

Tuttavia, stiamo considerando l'utilizzo di un Python Django + per una delle nostre nuove applicazioni. Mi stavo chiedendo se è possibile usare Bamboo per questo.

Prima di tutto, lasciami dire che ho un basso livello di familiarità con Bamboo, come l'ho sempre usato, non configurato (a parte semplici modifiche come cambiare la directory di svn checkout per una compilazione).

Ovviamente non c'è molto senso solo nell'esecuzione di una build (dato che i progetti Python non vengono realmente creati), ma mi piacerebbe poter usare Bamboo per eseguire la suite di test, oltre che usare bambù per distribuire l'ultimo codice ai nostri vari ambienti di test come facciamo con i nostri progetti Java.

Bamboo supporta questo tipo di cose con un progetto Python?

+0

Vecchia domanda. Ma ho aggiunto py.test come un eseguibile Bamboo e lo uso semplicemente per eseguire i test (con l'output junit-xml specificato).Quindi il parser del test JUnit deve essere eseguito come processo separato. –

+0

@ SamuelO'Malley puoi pubblicare un esempio di come hai funzionato? – MikeyE

+1

@MikeyE - In realtà ho cambiato il modo in cui è stato fatto da quando questo commento è stato pubblicato. Ora ero un Bamboo Script Task e ho il contenuto come 'py.test --junit-xml results.xml' e dopo che ho' if [$? -ne 0]; quindi echo "Test fallito"; fi' per ingoiare il codice di ritorno. Altrimenti, Bamboo non ti permetterà di mettere in quarantena un singolo risultato del test e segnerà l'intero lavoro come fallito. –

risposta

25

Bamboo essenzialmente solo esegue uno script di shell, quindi questo potrebbe facilmente essere:

./manage.py test 

in quanto in genere è:

mvn clean install 

o:

ant compile 

Si può Devi massaggiare l'output del runner di prova di Django nell'output tradizionale di JUnit XML, in modo che Bamboo possa darti un bel risultato grafici su quanti test sono passati. Guarda this post sull'utilizzo di xmlrunner.py per ottenere Python che funziona con Hudson. Dai un'occhiata anche allo NoseXUnit.

13

È anche possibile aggiungere un bootstrap per pip e virtualenv in un ambiente pulito abbastanza facilmente, che è cool:

wget https://bootstrap.pypa.io/get-pip.py 
python get-pip.py --root=${bamboo.build.working.directory}/tmp --ignore-installed 
export PATH=${bamboo.build.working.directory}/tmp/usr/local/bin:$PATH 
export PYTHONPATH=${bamboo.build.working.directory}/tmp/usr/local/lib/python2.7/dist-packages:$PYTHONPATH 
pip install --root=${bamboo.build.working.directory}/tmp --ignore-installed virtualenv 
virtualenv virtual_tmp 
cd virtual_tmp 
. bin/activate 
echo Pip is located `which pip` 
pip install django 
pip install djangorestframework 

Attenzione, source bin/activate non funziona come le attività di script in linea vengono memorizzate in un file sh (quindi bash eseguilo nella modalità di compatibilità sh).

Modifica

Ancora meglio, siamo in grado di eseguire unit test sulla parte superiore di esso, con uscite XML che può essere analizzato dal JUnit di bambù:

pip install unittest-xml-reporting 
python manage.py test --noinput --testrunner="xmlrunner.extra.djangotestrunner.XMLTestRunner" 
+0

@Raffi, puoi approfondire un po 'il motivo per cui bin/attivazione sorgente non funziona negli script di file? Lo stavo usando bene negli script inline, ma mi piacerebbe muovermi il più possibile per archiviare gli script poiché è più facile da mantenere (controllo della versione, ecc.). – Xabs

+1

Nel log di costruzione di Bamboo e per gli script inline, ho qualcosa come: "Iniziare ad eseguire il processo esterno per creare 'XXX Django artefactsZZZ # 35' \ n ... eseguendo la riga di comando: \ n/bin/sh/tmp/SW -DCD-JOB1-35-ScriptBuildTask-9100354988645888838.sh'. Lo script inline viene scaricato in un file '.sh' e viene eseguito'/bin/sh'. 'sh' non ha il comando incorporato' source' ('digita source' restituisce un errore). Quindi '.' è più compatibile con quello che voglio qui – Raffi

0

Se si utilizza pytest si può semplicemente utilizzare py.test --junitxml=/path/to/results/xml/file.xml

4

Si scopre che è possibile. Esistono due principali attività di integrazione: risultati del test runner e risultati di copertura del codice. Presumo normali codebase Python 3 e suite di test standard unittest.

prova corridore

Bamboo si aspetta che i risultati di test corridore in JUnit XML format. C'è lo separate test runner nel Cheese Shop in grado di produrre tale output, ma richiederebbe di scrivere un piccolo codice per eseguirlo, il che non è carino. Il modo migliore per mantenere intatto il codebase è utilizzare le funzioni di pytest.

copertura Codice

Bamboo supporta solo il formato XML di Atlassian Clover. Nota importante: non è necessario il plugin Atlassian Clover abilitato (e la licenza per esso che costa qualche dollaro). Bamboo funziona da solo.

Lo strumento di copertura del codice standard di Python, coverage, produce in qualche modo il formato XML Cobertura , ma c'è uno converter. C'è uno pytest plugin per l'integrazione con lo strumento di copertura.

Soluzione

Ecco il Tox ambiente in cui ho usato pytest di fare sia il lavoro integrazioni di bambù.

[tox] 
envlist = py34 
skipsdist = True 

[testenv] 
setenv  = LANG=C.UTF-8 
basepython = python3.4 
deps  = -r{toxinidir}/requirements.txt 

[testenv:bamboo] 
commands = 
    py.test --junitxml=results.xml \ 
    --cov=project_name --cov-config=tox.ini --cov-report=xml \ 
    --cov-report=html project_name/test 
    coverage2clover -i coverage.xml -o clover.xml 
deps = 
    {[testenv]deps} 
    pytest 
    pytest-cov 
    coverage2clover 

# read by pytest 
[pytest] 
python_files = *.py 

# read by coverage 
[run] 
omit=project_name/test/*,project_name/__main__.py 

noti che sia pytest e l'uso pytest-COV tox.ini per la configurazione non supportata sulla linea di comando. Ti salva di nuovo dall'avere ulteriore confusione nella radice del tuo repository. pytest prova a leggere automaticamente tox.ini. pytest-cov bypassa a .coveragerc, ma poiché è anche un file INI, tox.ini si adatta.

Sul lato Bamboo aggiungere script task che viene eseguito tox -e bamboo. Quindi aggiungere JUnit parse task al lavoro. Nel suo dialogo, sotto Specificare le directory dei risultati personalizzati inserire results.xml.

La configurazione della copertura viene eseguita in un altro modo.

  1. Aprire Varie scheda del tuo lavoro
  2. check Usa Clover per raccogliere Code Coverage per questa build
  3. Select Clover è già integrato in questa build e sarà prodotto un file clover.xml
  4. Tipo clover.xml in Clover XML Località

enter image description here

A questo punto della tua prossima costruzione vedrete copertura totale e due grafici: Copertura storia e Linee di storia codice. È anche bello avere HTML interattivo prodotto dallo strumento di copertura, in modo da poter eseguire il drill-down su una determinata riga di codice.

Le impostazioni effettuate in precedenza (almeno in Bamboo 5.7) ha creato Clover Report (System) in Artefatto scheda di lavoro. Aprilo e imposta htmlcov su nel campo e *.* a Copia modello. Bamboo raccoglierà ora i report HTML. Puoi vederlo alla scheda Clover del tuo piano.

Problemi correlati