python django deployment continuous-integration bamboo

Atlassian Bamboo con Django y Python-¿Posible?



deployment continuous-integration (4)

En mi empresa, actualmente utilizamos Atlassian Bamboo para nuestra herramienta de integración continua. Actualmente usamos Java para todos nuestros proyectos, por lo que funciona de maravilla.

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

En primer lugar, permítanme decir que tengo un bajo nivel de familiaridad con Bamboo, ya que solo lo he usado, no lo he configurado (aparte de cambios simples como cambiar el directorio de comprobación de svn 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 utilizar Bamboo para ejecutar el conjunto de pruebas, así como también usar bambú para implementar el desarrollo. código más reciente para nuestros diversos entornos de prueba de la misma manera que lo hacemos con nuestros proyectos de Java.

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


Bamboo básicamente solo ejecuta un script de shell, así que esto podría ser igual de fácil:

./manage.py test

como suele ser:

mvn clean install

o:

ant compile

Es posible que deba realizar un masaje a la salida del corrector de prueba de Django en la salida XML de JUnit tradicional, de modo que Bamboo pueda darle bonitos gráficos sobre la cantidad de pruebas aprobadas. Mire esta publicación sobre el uso de xmlrunner.py para que Python trabaje con Hudson . También echa un vistazo a NoseXUnit .


Incluso puede agregar un bootstrap para pip y virtualenv en un entorno 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, la source bin/activate no funciona, ya que las tareas de script en línea se almacenan en un archivo sh (por lo que bash ejecuta en el modo de compatibilidad sh ).

Editar

Aún mejor, podemos ejecutar pruebas unitarias en la parte superior, con salidas xml que pueden ser analizadas por el JUnit de bambú:

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


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 unittest estándar.

Corredor de prueba

Bamboo espera los resultados del corredor de prueba en formato JUnit XML . Hay un corredor de prueba independiente 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 forma de mantener intacta la base de código es usar las características de pytest .

Cobertura de código

Bamboo solo es compatible con el formato XML de Atlassian Clover. 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 cobertura y la herramienta de cobertura de código estándar de Python producen un formato Cobertura XML, pero hay un converter . Hay un complemento de Pytest para la integración con la herramienta de cobertura.

Solución

Aquí está el entorno Tox donde utilicé Pytest para hacer que ambas integraciones de Bamboo funcionen.

[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 como pytest-cov usan tox.ini para la configuración que no es compatible con 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 por .coveragerc , pero debido a que también es un archivo INI, tox.ini ajusta.

En Bamboo side, agrega una tarea de script que ejecute tox -e bamboo . A continuación, agregue la tarea de análisis JUnit al trabajo. En su diálogo, en Especificar resultados personalizados, los directorios ponen results.xml .

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

  1. Abre la pestaña Misceláneo de tu trabajo
  2. Seleccione Usar trébol para recopilar cobertura de código para esta compilación
  3. Select Clover ya está integrado en esta compilación y se producirá un archivo clover.xml
  4. Escriba clover.xml en Clover XML Location

En este punto de su próxima compilación, verá la cobertura total y dos gráficos: Historial de 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.

La configuración anterior (al menos en Bamboo 5.7) ha creado Clover Report (System) en la pestaña del trabajo Artifact . htmlcov y configure htmlcov en el campo Ubicación , y *.* Copiar patrón . Bamboo ahora recopilará los informes HTML. Puedes verlo en la pestaña Clover de tu plan.


Si usa Pytest, simplemente puede usar py.test --junitxml=/path/to/results/xml/file.xml