2009-09-14 16 views
31

En mi empresa, actualmente usamos Atlassian Bamboo para nuestra herramienta de integración continua. Actualmente usamos Java para todos nuestros proyectos, por lo que funciona de maravilla.Atlassian Bamboo con Django y Python - ¿Es posible?

Sin embargo, estamos considerando utilizar un Django + Python para una de nuestras nuevas aplicaciones. Me preguntaba si es posible usar Bamboo para esto.

En primer lugar, déjenme decir que tengo un bajo nivel de familiaridad con Bamboo, ya que solo lo he usado, no configurado (aparte de cambios simples como cambiar el directorio svn checkout para una compilación).

Obviamente, no tiene mucho sentido ejecutar una compilación (ya que los proyectos de Python en realidad no se compilan), pero me gustaría poder usar Bamboo para ejecutar el conjunto de pruebas, así como también usar bambú para implementar el último código en nuestros diversos entornos de prueba de la misma manera que lo hacemos con nuestros proyectos de Java.

¿Admite Bamboo este tipo de cosas con un proyecto de Python?

+0

Pregunta anterior. Pero he agregado py.test como un ejecutable de Bamboo y simplemente lo utilizo para ejecutar las pruebas (con la salida junit-xml especificada).Entonces el analizador de prueba JUnit debe ejecutarse como un trabajo por separado. –

+0

@ SamuelO'Malley puede publicar un ejemplo de cómo lo hizo funcionar? – MikeyE

+1

@MikeyE - De hecho, he cambiado la forma en que se hace desde que se publicó este comentario. Ahora era una tarea de script de bambú y tengo el contenido como 'py.test --junit-xml results.xml' y después de eso tengo' if [$? -ne 0]; luego echo "Prueba fallida"; fi' tragar el código de retorno. De lo contrario, Bamboo no le permitirá poner en cuarentena el resultado de una prueba individual y marcará todo el Trabajo como fallido. –

Respuesta

25

bambú esencialmente sólo se ejecuta un script de shell, así que esto podría fácilmente ser:

./manage.py test 

ya que por lo general es:

mvn clean install 

o:

ant compile 

Usted puede tiene que dar masajes a la salida del corrector de prueba Django en la salida XML de JUnit tradicional, para que Bamboo pueda darle bastante gráficos sobre cuántas pruebas pasaron Consulte this post sobre el uso de xmlrunner.py para que Python trabaje con Hudson. También echa un vistazo a NoseXUnit.

13

Usted puede incluso añadir un arranque para PIP y virtualenv en un ambiente limpio con bastante facilidad, lo cual es genial:

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 

Advertencia, source bin/activate no funciona como las tareas de secuencias de comandos en línea se almacenan en un archivo sh (para que bash lo ejecute en el modo de compatibilidad sh).

Editar

Aún mejor, podemos ejecutar pruebas unitarias en la parte superior de la misma, con salidas XML que se pueden analizar por el JUnit de bambú:

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

@Raffi, ¿puede explicar un poco más sobre por qué el bin/activar fuente no funciona en los scripts de archivos? He estado usando bien en scripts en línea, pero me gustaría mover tanto como sea posible a las secuencias de comandos de archivos, ya que es más fácil de mantener (control de versiones, etc.). – Xabs

+1

En el registro de compilación de Bamboo y para las secuencias de comandos en línea, tengo algo como 'Principio para ejecutar el proceso externo para la compilación 'XXX Django artifactsZZZ # 35' \ n ... ejecutando la línea de comandos: \ n/bin/sh/tmp/SW -DCD-JOB1-35-ScriptBuildTask-9100354988645888838.sh'. El script en línea se vacía en un archivo '.sh' y'/bin/sh' se ejecuta. 'sh' no tiene el comando' source' builtin ('type source' devuelve un error). Entonces '.' es más compatible con lo que quiero aquí – Raffi

0

Si utiliza PYtest puede simplemente use py.test --junitxml=/path/to/results/xml/file.xml

4

Resulta que es posible. Hay dos tareas de integración principales: resultados de prueba de corredor y resultados de cobertura de código. Asumo la base de código Python 3 normal y la suite de prueba estándar unittest.

corredor de prueba

bambú espera resultados corredor de prueba en JUnit XML format. Hay un separate test runner en la tienda de quesos capaz de producir tal salida, pero requeriría que escriba un pequeño código para ejecutarlo, lo cual no es agradable. Una mejor manera de mantener la base de código intacta es usar las características de pytest.

cobertura de código

bambú sólo es compatible con el formato XML de Atlassian trébol. Nota importante aquí es que no necesita el plugin de Atlassian Clover habilitado (y la licencia para ello, que cuesta algunos dólares). Bamboo funciona por sí mismo.

La herramienta de cobertura de código estándar de Python de facto, coverage, produce un poco de formato XML Cobertura, pero hay un converter. Hay un pytest plugin para la integración con la herramienta de cobertura.

Solución

Aquí está el ambiente Tox donde solía PYtest hacer tanto integraciones de bambú trabajo.

[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 

Tenga en cuenta que tanto PYtest y el uso PYtest-CoV tox.ini para la configuración que no es compatible en la línea de comandos. De nuevo le evita tener desorden adicional en la raíz de su repositorio. Pytest intenta leer tox.ini automáticamente. pytest-cov pasa a .coveragerc, pero debido a que también es un archivo INI, tox.ini encaja.

En el lado de bambú agregue un script task que ejecuta tox -e bamboo. A continuación, agregue JUnit parse task al trabajo. En su diálogo, bajo Especifique los directorios de resultados personalizados ponga results.xml.

La configuración de cobertura se realiza de otra manera.

  1. abierto Varios pestaña de su trabajo
  2. Comprobar Uso del trébol para recoger cobertura de código para esta construcción
  3. Seleccionar Clover ya está integrado en esta construcción y se producirá un archivo clover.xml
  4. Tipo clover.xml en trébol XML Ubicación

enter image description here

En este punto en su próxima construcción verá la cobertura total y dos tablas: historia Cobertura y Líneas de historial de códigos. También es bueno tener HTML interactivo producido por la herramienta de cobertura, por lo que puede profundizar en cierta línea de código.

Los ajustes realizados anteriormente (por lo menos en 5,7 bambú) ha creado trébol Informe (Sistema) en Artefacto pestaña de trabajo. Ábralo y establezca htmlcov en Ubicación campo y *.* en Copie el patrón. Bamboo ahora recopilará los informes HTML. Puede verlo en ficha Clover de su plan.

Cuestiones relacionadas