116 votes

Intégration continue "jolie" pour Python

C'est un peu.. vain question, mais BuildBot de sortie n'est pas particulièrement agréable à regarder..

Par exemple, comparativement aux..

..et les autres, BuildBot semble plutôt archaïque..

Je suis en train de jouer avec d'Hudson, mais il est très Java (bien qu'avec ce guide, je l'ai trouvé plus facile à mettre en place que BuildBot, et produit plus d'info)

En gros: est-il Continu d'Intégration de systèmes visant à python, qui produisent beaucoup de shiney graphiques et les aime?


Mise à jour: Après avoir essayé quelques solutions de rechange, je pense que je vais rester avec Hudson. L'intégrité a été agréable et simple, mais assez limité. Je pense que Buildbot est mieux adapté pour avoir de nombreuses esclaves, plutôt que de tout ce qui tourne sur une machine unique comme je l'utilise.

Réglage de l'Hudson pour un projet de Python est assez simple:

  • Télécharger Hudson à partir de http://hudson-ci.org/
  • L'exécuter en java -jar hudson.war
  • Ouvrez l'interface web sur l'adresse par défaut de http://localhost:8080
  • Accédez à Gérer Hudson, Plugins, cliquez sur "mettre à Jour" ou similaire
  • Installer le plugin Git (j'ai dû mettre de l' git chemin dans l'Hudson global de préférences)
  • Créer un nouveau projet, entrer dans le référentiel, SCM intervalles d'interrogation et ainsi de suite
  • Installez nosetests par easy_install si c'est pas déjà
  • Dans l'étape de génération, ajoutez - nosetests --with-xunit --verbose
  • Cochez la case "Publier JUnit test du rapport de résultat" et mettre "rapport de Test XMLs" **/nosetests.xml

C'est tout ce qui est nécessaire. Vous pouvez configurer des notifications par courriel, et les plugins valent un coup d'oeil. Quelques je suis actuellement à l'aide de Python projets:

  • SLOCCount plugin pour compter les lignes de code (et graphique!) - vous devez installer sloccount séparément
  • Les Violations à analyser les PyLint de sortie (vous pouvez configurer les seuils d'avertissement, un graphique du nombre de violations au cours de chaque build)
  • Cobertura peut analyser l'coverage.py de sortie. Nosetest peut recueillir de couverture lors de l'exécution de vos tests à l'aide de nosetests --with-coverage (ce qui écrit la sortie dans **/coverage.xml)

41voto

Jason Baker Points 56682

Vous voudrez peut-être consulter le Nez et la Xunit de sortie du plugin. Vous pouvez exécuter des tests unitaires, et de la couverture des contrôles avec cette commande:

nosetests --with-xunit --enable-cover

Ce sera utile si vous voulez aller à la Jenkins route, ou si vous voulez utiliser un autre serveur CI, qui a le soutien de JUnit test.

De même, vous pouvez capturer la sortie de pylint en utilisant les violations plugin Jenkins pour

10voto

edomaur Points 806

Je ne sais pas si cela ferait: Mordu est fait par les gars qui écrivent Trac et est intégré à Trac. Apache Gump est l'outil CI utilisé par Apache. Il est écrit en Python.

9voto

Kozyarchuk Points 4613

Nous avons eu beaucoup de succès avec TeamCity que notre serveur CI et à l'aide de nez que notre test runner. Teamcity plugin pour nosetests vous donne le comte de réussite/d'échec, écran lisible de l'échec de test( qui peut être Envoyé par E-mail). Vous pouvez même voir les détails de l'échec de test alors que vous la pile est en cours d'exécution.

Si des supports de cours des choses comme la course sur plusieurs machines, et c'est beaucoup plus simple à configurer et à maintenir que buildbot.

8voto

Noufal Ibrahim Points 32200

La page de cascade de Buildbot peut être considérablement améliorée. Voici un bel exemple: http://build.chromium.org/buildbot/waterfall/waterfall

6voto

Nick Holden Points 716

Je suppose que ce fil est assez ancien mais ici, c'est mon prendre sur elle avec hudson:

J'ai décidé d'aller avec le pip et mis en place un repo (le douloureux de se mettre au travail, mais agréable à regarder eggbasket), hudson automatique des téléchargements avec succès les tests. Voici mon rude script pour une utilisation avec un hudson config exécuter le script comme: /var/lib/hudson/venv/main/bin/hudson_script.py -w $de l'espace de travail -p mon.paquet -v $BUILD_NUMBER, il suffit de mettre dans **/coverage.xml, pylint.txt et nosetests.xml dans la config de bits:

#!/var/lib/hudson/venv/main/bin/python
import os
import re
import subprocess
import logging
import optparse

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s')

#venvDir = "/var/lib/hudson/venv/main/bin/"

UPLOAD_REPO = "http://ldndev01:3442"

def call_command(command, cwd, ignore_error_code=False):
    try:
        logging.info("Running: %s" % command)
        status = subprocess.call(command, cwd=cwd, shell=True)
        if not ignore_error_code and status != 0:
            raise Exception("Last command failed")

        return status

    except:
        logging.exception("Could not run command %s" % command)
        raise

def main():
    usage = "usage: %prog [options]"
    parser = optparse.OptionParser(usage)
    parser.add_option("-w", "--workspace", dest="workspace",
                      help="workspace folder for the job")
    parser.add_option("-p", "--package", dest="package",
                      help="the package name i.e., back_office.reconciler")
    parser.add_option("-v", "--build_number", dest="build_number",
                      help="the build number, which will get put at the end of the package version")
    options, args = parser.parse_args()

    if not options.workspace or not options.package:
        raise Exception("Need both args, do --help for info")

    venvDir = options.package + "_venv/"

    #find out if venv is there
    if not os.path.exists(venvDir):
        #make it
        call_command("virtualenv %s --no-site-packages" % venvDir,
                     options.workspace)

    #install the venv/make sure its there plus install the local package
    call_command("%sbin/pip install -e ./ --extra-index %s" % (venvDir, UPLOAD_REPO),
                 options.workspace)

    #make sure pylint, nose and coverage are installed
    call_command("%sbin/pip install nose pylint coverage epydoc" % venvDir,
                 options.workspace)

    #make sure we have an __init__.py
    #this shouldn't be needed if the packages are set up correctly
    #modules = options.package.split(".")
    #if len(modules) > 1: 
    #    call_command("touch '%s/__init__.py'" % modules[0], 
    #                 options.workspace)
    #do the nosetests
    test_status = call_command("%sbin/nosetests %s --with-xunit --with-coverage --cover-package %s --cover-erase" % (venvDir,
                                                                                     options.package.replace(".", "/"),
                                                                                     options.package),
                 options.workspace, True)
    #produce coverage report -i for ignore weird missing file errors
    call_command("%sbin/coverage xml -i" % venvDir,
                 options.workspace)
    #move it so that the code coverage plugin can find it
    call_command("mv coverage.xml %s" % (options.package.replace(".", "/")),
                 options.workspace)
    #run pylint
    call_command("%sbin/pylint --rcfile ~/pylint.rc -f parseable %s > pylint.txt" % (venvDir, 
                                                                                     options.package),
                 options.workspace, True)

    #remove old dists so we only have the newest at the end
    call_command("rm -rfv %s" % (options.workspace + "/dist"),
                 options.workspace)

    #if the build passes upload the result to the egg_basket
    if test_status == 0:
        logging.info("Success - uploading egg")
        upload_bit = "upload -r %s/upload" % UPLOAD_REPO
    else:
        logging.info("Failure - not uploading egg")
        upload_bit = ""

    #create egg
    call_command("%sbin/python setup.py egg_info --tag-build=.0.%s --tag-svn-revision --tag-date sdist %s" % (venvDir,
                                                                                                              options.build_number,
                                                                                                              upload_bit),
                 options.workspace)

    call_command("%sbin/epydoc --html --graph all %s" % (venvDir, options.package),
                 options.workspace)

    logging.info("Complete")

if __name__ == "__main__":
    main()

Quand il s'agit de déployer des choses que vous pouvez faire quelque chose comme:

pip -E /location/of/my/venv/ install my_package==X.Y.Z --extra-index http://my_repo

Et puis les gens peuvent développer des trucs à l'aide de:

pip -E /location/of/my/venv/ install -e ./ --extra-index http://my_repo

Ça suppose que vous avez une pension de structure par colis avec un setup.py et dépendances tous mis en place, alors vous pouvez simplement consulter le tronc et les exécuter ce genre de choses sur elle.

J'espère que cela aide quelqu'un.

------mise à jour---------

J'ai ajouté epydoc qui s'adapte vraiment bien avec hudson. Seulement ajouter de la javadoc de votre config avec le dossier html

Notez que pep ne prend pas en charge l'option-E correctement ces jours-ci, donc vous devez créer votre venv séparément

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X