2009-09-14 32 views
31

Chez moi, nous utilisons actuellement Atlassian Bamboo pour notre outil d'intégration continue. Nous utilisons actuellement Java pour tous nos projets, donc cela fonctionne très bien. Cependant, nous envisageons d'utiliser un Django + Python pour l'une de nos nouvelles applications. Je me demandais s'il était possible d'utiliser Bamboo pour ça. Tout d'abord, laissez-moi vous dire que j'ai un faible niveau de familiarité avec Bamboo, car je ne l'ai jamais utilisé, pas configuré (autre que de simples changements comme changer le répertoire svn checkout pour une construction).Bambou Atlassian avec Django & Python - Possible?

De toute évidence, il n'y a pas grand intérêt à exécuter une build (puisque les projets Python ne se construisent pas vraiment), mais j'aimerais pouvoir utiliser Bamboo pour exécuter la suite de tests, ainsi que l'utilisation bamboo pour déployer le dernier code dans nos différents environnements de test comme nous le faisons avec nos projets Java.

Est-ce que Bamboo supporte ce genre de chose avec un projet Python?

+0

Ancienne question. Mais j'ai ajouté py.test en tant qu'exécutable Bamboo et je l'utilise simplement pour lancer les tests (avec la sortie junit-xml spécifiée).Ensuite, l'analyseur de test JUnit doit être exécuté en tant que travail distinct. –

+0

@ SamuelO'Malley pouvez-vous poster un exemple de la façon dont vous avez eu ce travail? – MikeyE

+1

@MikeyE - J'ai effectivement changé la façon dont cela est fait depuis que ce commentaire a été posté. Maintenant, j'étais une tâche de script Bamboo et j'ai le contenu comme 'py.test --junit-xml results.xml' et après cela j'ai' if [$? -ne 0]; puis écho "Échec du test"; fi' pour avaler le code de retour. Sinon, Bamboo ne vous permettra pas de mettre en quarantaine un résultat de test individuel et marquera l'ensemble du Job comme ayant échoué. –

Répondre

25

Bamboo essentiellement court juste un script shell, donc cela pourrait tout aussi bien être:

./manage.py test 

comme il est généralement:

mvn clean install 

ou:

ant compile 

Vous pouvez avoir à masser à la sortie du coureur de test Django dans la sortie XML JUnit traditionnelle, de sorte que Bamboo peut vous donner graphiques sur le nombre de tests passés. Regardez this post à propos de l'utilisation de xmlrunner.py pour que Python fonctionne avec Hudson. Jetez également un coup d'oeil à NoseXUnit.

13

Vous pouvez même ajouter un bootstrap pour pépin et virtualenv sur un environnement propre assez facilement, ce qui est 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 

Attention, source bin/activate ne fonctionne pas comme les tâches de script en ligne sont stockées dans un fichier sh (donc bash exécutez-le en mode de compatibilité sh).

Modifier

Mieux encore, nous pouvons exécuter des tests unitaires sur le dessus de celui-ci, avec des sorties XML qui peuvent être analysés par le JUnit de bambou:

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

@Raffi, pouvez-vous développer un peu plus sur pourquoi la source bin/activate ne fonctionne pas dans les scripts de fichiers? Je l'ai utilisé très bien dans les scripts en ligne, mais je voudrais déplacer autant que possible vers les fichiers de scripts car il est plus facile à maintenir (contrôle de version, etc). – Xabs

+1

Dans le journal de construction de Bamboo et pour les scripts en ligne, j'ai quelque chose comme 'Commencer à exécuter le processus externe pour construire 'XXX Django artefactsZZZ # 35' \ n ... ligne de commande en cours d'exécution: \ n/bin/sh/tmp/SW -DCD-JOB1-35-ScriptBuildTask-9100354988645888838.sh'. Le script en ligne est vidé dans un fichier '.sh' et'/bin/sh' est exécuté. 'sh' n'a pas de commande interne' source' ('type source' renvoie une erreur). Donc '.' est plus compatible avec ce que je veux ici – Raffi

0

Si vous utilisez pytest vous pouvez simplement utiliser py.test --junitxml=/path/to/results/xml/file.xml

4

Il s'avère que c'est possible. Il y a deux tâches d'intégration principales: les résultats du testeur et les résultats de la couverture du code. Je suppose la base de code Python 3 normale et la suite de tests standard unittest.

test coureur

Bamboo attend les résultats de coureur de test dans JUnit XML format. Il ya separate test runner sur le magasin de fromage capable de produire une telle sortie, mais il faudrait que vous écrivez un petit code pour l'exécuter, ce qui n'est pas agréable. Une meilleure façon de garder la base de code intacte est d'utiliser les fonctionnalités de pytest.

couverture Code

Bamboo ne supporte que le format XML de Clover Atlassian. Remarque importante ici: vous n'avez pas besoin du plugin Atlassian Clover activé (et d'une licence qui coûte un peu d'argent). Bamboo travaille seul.

L'outil de couverture de code standard Python de fait, coverage, produit quelque peu format Cobertura XML, mais il y a un converter. Il y a un pytest plugin pour l'intégration avec l'outil de couverture.

Solution

est ici l'environnement Tox où je pytest pour faire le travail à la fois des intégrations de bambou.

[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 

Notez que les deux pytest et pytest-CoV utilisation tox.ini pour la configuration non pris en charge sur la ligne de commande. Encore une fois, cela vous évite d'avoir un fouillis supplémentaire à la racine de votre repo. pytest essaie de lire tox.ini automatiquement. pytest-cov contourne .coveragerc, mais parce que c'est aussi un fichier INI, tox.ini correspond. Sur le côté Bambou, ajoutez un script task qui exécute tox -e bamboo. Ensuite, ajoutez le au travail. Dans son dialogue, sous Spécifier les répertoires de résultats personnalisés mettre results.xml.

La configuration de la couverture est effectuée d'une autre manière.

  1. Ouvert Divers onglet de votre travail
  2. Check Utilisez Clover pour recueillir la couverture du code pour cette construction
  3. Select Clover est déjà intégré dans cette version et un fichier clover.xml sera produit
  4. type clover.xml en XML Clover Lieu

enter image description here

À ce stade, lors de la construction prochaine, vous verrez une couverture totale et deux tableaux: histoire de couverture et lignes de l'histoire de code. Il est également agréable d'avoir du HTML interactif produit par l'outil de couverture, de sorte que vous pouvez explorer jusqu'à une certaine ligne de code.

Les réglages effectués ci-dessus (au moins en bambou 5.7) a créé Rapport Clover (Système) dans-artefact onglet travail. Ouvrez-le et définissez htmlcov sur Emplacement champ et *.* sur Copie modèle. Bamboo va maintenant collecter les rapports HTML. Vous pouvez le voir à Clover onglet de votre plan.