"Ładna" ciągła Integracja dla Pythona

To jest trochę.. próżne pytanie, ale wydajność Buildbota nie jest szczególnie przyjemna..

Na przykład, w porównaniu do..

..i inni, BuildBot wygląda raczej. archaiczne

[[9]}obecnie gram z Hudsonem, ale jest to bardzo Java-centric (chociaż z to przewodnik, uważam, że jest łatwiejszy w konfiguracji niż BuildBot i mam więcej informacji)

Zasadniczo: czy istnieją jakieś Systemy ciągłej integracji skierowane do Pythona, które wytwarzają wiele błyszczących wykresów i tym podobnych?


Update: od tego czasu Projekt Jenkins zastąpił Hudsona jako wersję społecznościową pakietu. Oryginalni autorzy przenieśli się również do tego projektu. Jenkins jest obecnie standardowym pakietem na Ubuntu/Debian, RedHat/Fedora/CentOS i innych. Na następująca aktualizacja jest nadal zasadniczo poprawna. Punkt wyjścia do zrobienia tego z Jenkins jest inny.

Aktualizacja: po wypróbowaniu kilku alternatyw, myślę, że zostanę przy Hudsonie. Uczciwość była miła i prosta, ale dość ograniczona. Myślę, że Buildbot lepiej nadaje się do posiadania wielu niewolników kompilacji, niż do wszystkiego, co działa na jednej maszynie, tak jak ja jej używałem.

Ustawienie Hudsona dla projektu Pythona było całkiem proste:

  • Pobierz Hudson z http://hudson-ci.org /
  • uruchom go z java -jar hudson.war
  • Otwórz interfejs WWW na domyślnym adresie http://localhost:8080
  • przejdź do Zarządzaj, Wtyczki, kliknij "Aktualizuj" lub podobne
  • Zainstaluj wtyczkę Git (musiałem ustawić ścieżkę git w globalnych preferencjach Hudsona)
  • Utwórz nowy projekt, wejdź do repozytorium, przedziały ankiety SCM i tak dalej
  • Install nosetests via easy_install Jeśli nie już
  • w kroku budowania a dodaj nosetests --with-xunit --verbose
  • zaznacz "Publish JUnit test result report" i ustaw "Test report XMLs" na **/nosetests.xml
To wszystko, co jest wymagane. Możesz skonfigurować powiadomienia e-mail, a wtyczki są warte obejrzenia. Kilka obecnie używam dla projektów Pythona:
  • SLOCCount plugin do liczenia linii kodu(i wykresu!)- musisz zainstalować sloccount oddzielnie
  • naruszenia do analizuj wyjście PyLint (możesz ustawić progi ostrzegawcze, wykreślić liczbę naruszeń przy każdej kompilacji)
  • Cobertura może analizować coverage.py wyjście. Nosetest może gromadzić zasięg podczas wykonywania testów, używając nosetests --with-coverage (zapisuje wynik do **/coverage.xml)
Author: rickfoosusa, 2008-10-22

14 answers

Możesz sprawdzić Nose i wtyczkę wyjściową xUnit. Możesz uruchomić testy jednostkowe i sprawdzić zasięg za pomocą tego polecenia:

nosetests --with-xunit --enable-cover

To będzie pomocne, jeśli chcesz przejść trasę Jenkins, lub jeśli chcesz użyć innego serwera CI, który ma wsparcie dla raportowania testów JUnit.

Podobnie można uchwycić wyjście pylint za pomocą wtyczki violations dla Jenkins

 41
Author: Jason Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 13:33:56

Nie wiem, czy to zrobi : Bitten jest tworzony przez facetów, którzy piszą Trac i jest zintegrowany z Trac. Apache Gump jest narzędziem CI używanym przez Apache. Jest napisany w Pythonie.

 10
Author: edomaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 13:46:55

Odnieśliśmy wielki sukces z TeamCity jako naszym serwerem CI i używając nose jako naszego testowego biegacza. wtyczka TeamCity dla nosetestów daje czytelny wyświetlacz liczenia pass / fail dla nieudanego testu (który można wysłać E-mailem). Możesz nawet zobaczyć szczegóły błędów testowych podczas pracy stosu.

Jeśli oczywiście obsługuje rzeczy takie jak uruchamianie na wielu komputerach i jest o wiele prostsze w konfiguracji i utrzymaniu niż buildbot.

 9
Author: Kozyarchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-23 01:30:17

Strona buildbota może być znacznie ulepszona. Oto fajny przykład http://build.chromium.org/buildbot/waterfall/waterfall

 8
Author: Noufal Ibrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 09:16:55

Atlassian ' s Bamboo jest również zdecydowanie warte sprawdzenia. Cały pakiet Atlassian (JIRA, Confluence, FishEye itp.) jest całkiem fajny.

 6
Author: Russ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-28 18:08:12

Myślę, że ten wątek jest dość stary, ale oto moje podejście do niego z Hudsonem:

Postanowiłem pójść z pip i ustawić repo (bolesne do pracy, ale ładny wygląd eggbasket), który hudson auto wgrywa z udanych testów. Oto mój szorstki i gotowy skrypt do użycia z konfiguracją jak: /var/lib/hudson/venv/main/bin/hudson_script.py -w $WORKSPACE-P my.package-v $BUILD_NUMBER, wystarczy wpisać * * /coverage.xml, pylint.txt i nosetesty.xml w konfiguracji bity:

#!/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()

Jeśli chodzi o instalowanie rzeczy, możesz zrobić coś takiego:

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

I wtedy ludzie mogą rozwijać rzeczy za pomocą:

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

To zakłada, że masz strukturę repo na pakiet z setup.py i zależności wszystko skonfigurowane wtedy możesz po prostu sprawdzić bagażnik i uruchomić te rzeczy na nim.

Mam nadzieję, że to komuś pomoże.

------Aktualizacja---------

Dodałem epydoc, który pasuje do Hudsona. Wystarczy dodać javadoc do swojego konfiguracja z folderem html

Zauważ, że pip nie obsługuje obecnie poprawnie flagi-E, więc musisz utworzyć swój venv oddzielnie

 6
Author: Nick Holden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-25 11:31:26

Kolejny: Shining Panda to hostowane narzędzie dla Pythona

 3
Author: edomaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 08:28:42

Jeśli rozważasz hostowane rozwiązanie CI i robisz open source, powinieneś również przyjrzeć się Travis CI - ma bardzo ładną integrację z GitHub. Chociaż zaczęło się jako narzędzie Ruby, dodano obsługę Pythona jakiś czas temu.

 3
Author: Alex Dupuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 12:43:00

Sygnał jest inną opcją. Możesz dowiedzieć się więcej na ten temat i obejrzeć film również tutaj.

 2
Author: Diego Carrion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-29 04:05:02

Rozważyłbym CircleCi - ma świetne wsparcie dla Pythona i bardzo ładne wyjście.

 2
Author: Paul Biggar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 16:41:53

Continuum ' s binstar Teraz jest w stanie uruchomić Kompilacje z github i może skompilować dla Linuksa, osx i windows ( 32 / 64 ). fajne jest to, że naprawdę pozwala ściśle powiązać dystrybucję i ciągłą integrację. To przekroczenie t i kropkowanie I integracji. Strona, przepływ pracy i narzędzia są naprawdę dopracowane, a AFAIK conda jest najbardziej solidnym i pythonicznym sposobem dystrybucji złożonych modułów Pythona, gdzie musisz owinąć i rozpowszechniać Biblioteki C / C++ / Fot.

 1
Author: Jelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 19:01:39

Użyliśmy bitten dość dużo. Jest ładny i dobrze integruje się z Trac, ale jest to ból w tyłku, aby dostosować, jeśli masz jakiś niestandardowy przepływ pracy. Ponadto po prostu nie ma tak wielu wtyczek, jak są dla bardziej popularnych narzędzi. Obecnie oceniamy Hudsona jako zastępcę.

 0
Author: Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-06 15:03:28

Sprawdź rultor.com . Jak Ten artykuł wyjaśnia, używa Dockera dla każdej kompilacji. Dzięki temu możesz skonfigurować, co chcesz wewnątrz obrazu dokera, w tym Pythona.

 0
Author: yegor256,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-03 17:27:27

Mały disclaimer, właściwie musiałem zbudować rozwiązanie takie jak to dla klienta, który chciał sposób na automatyczne testowanie i wdrażanie dowolnego kodu na git push plus zarządzanie biletami wydań poprzez Git notes. Doprowadziło to również do mojej pracy nad projektem AIMS .

Można łatwo skonfigurować system gołych węzłów, który ma użytkownika build i zarządzać ich kompilacji poprzez make(1), expect(1), crontab(1)/systemd.unit(5), i incrontab(1). Można nawet pójść o krok dalej i użyć ansible i selera do dystrybucji buduje z magazynu plików gridfs/nfs.

Chociaż nie spodziewałbym się, że ktoś inny niż Siwobrody UNIKSOWIEC lub inżynier / architekt, posuną się tak daleko. Po prostu sprawia, że dobry pomysł i potencjalne doświadczenie uczenia się, ponieważ serwer kompilacji jest niczym więcej niż sposobem na arbitralne wykonywanie zadań skryptowych w sposób zautomatyzowany.

 0
Author: Dwight Spencer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 19:14:47