«Довольно» непрерывной интеграции для Python - PullRequest
116 голосов
/ 22 октября 2008

Это немного .. напрасный вопрос, но вывод BuildBot не особенно хорош для рассмотрения ..

Например, по сравнению с ..

.. и другие BuildBot выглядит довольно .. архаично

В настоящее время я играю с Хадсоном, но он очень ориентирован на Java (хотя с этим руководством я нашел его проще в настройке, чем BuildBot, и получил больше информации)

В основном: существуют ли системы непрерывной интеграции, нацеленные на python, которые производят множество блестящих графиков и тому подобное?


Обновление: С этого времени проект Jenkins заменил Hudson как версию пакета для сообщества. Авторы оригинала также перешли к этому проекту. Теперь Jenkins является стандартным пакетом для Ubuntu / Debian, RedHat / Fedora / CentOS и других. Следующее обновление все еще по существу правильно. Начальная точка для этого с Jenkins отличается.

Обновление: Попробовав несколько альтернатив, я думаю, что останусь с Хадсоном. Целостность была приятной и простой, но довольно ограниченной. Я думаю, что Buildbot лучше подходит для использования множества сборочных ведомых, а не для того, чтобы все работало на одной машине, как я ее использовал.

Настройка Hudson для проекта Python была довольно простой:

  • Скачать Hudson с http://hudson -ci.org /
  • Запустите его с java -jar hudson.war
  • Открыть веб-интерфейс по адресу по умолчанию http://localhost:8080
  • Зайдите в Управление Hudson, Плагины, нажмите «Обновить» или подобное
  • Установите плагин Git (мне пришлось установить путь git в глобальных настройках Hudson)
  • Создайте новый проект, введите репозиторий, интервалы опроса SCM и т. Д.
  • Установите nosetests через easy_install, если это еще не
  • На этапе сборки добавьте nosetests --with-xunit --verbose
  • Установите флажок «Опубликовать отчет о результатах тестирования JUnit» и установите для «XML отчета о тестировании» значение **/nosetests.xml

Это все, что требуется. Вы можете настроить уведомления по электронной почте, и плагины стоит посмотреть. Несколько я сейчас использую для проектов Python:

  • Плагин SLOCCount для подсчета строк кода (и построения графика!) - вам нужно установить sloccount отдельно
  • Нарушения для анализа вывода PyLint (вы можете настроить пороги предупреждений, график количества нарушений для каждой сборки)
  • Cobertura может анализировать файл cover.py. Nosetest может собрать покрытие во время выполнения ваших тестов, используя nosetests --with-coverage (это записывает вывод в **/coverage.xml)

Ответы [ 14 ]

41 голосов
/ 20 марта 2009

Возможно, вы захотите проверить Нос и плагин вывода Xunit . Вы можете запустить его модульные тесты и проверки покрытия с помощью этой команды:

nosetests --with-xunit --enable-cover

Это будет полезно, если вы хотите пойти по маршруту Jenkins или если вы хотите использовать другой CI-сервер, который поддерживает отчеты по тестам JUnit.

Аналогичным образом вы можете захватить вывод pylint, используя плагин нарушения для Jenkins

10 голосов
/ 22 октября 2008

Не знаю, будет ли это: Укушенный сделан парнями, которые пишут Trac, и интегрирован с Trac. Apache Gump - это инструмент CI, используемый Apache. Написано на Python.

9 голосов
/ 23 октября 2008

Мы добились большого успеха с TeamCity в качестве нашего CI-сервера и использованием носа в качестве нашего тестового бегуна. Плагин Teamcity для тестов на носу дает вам счетчик пройден / не пройден, читаемый дисплей для неудачного теста (который можно отправить по электронной почте) Вы даже можете увидеть подробности тестовых сбоев во время работы стека.

Если, конечно, поддерживаются такие вещи, как запуск на нескольких машинах, и гораздо проще в настройке и обслуживании, чем buildbot.

8 голосов
/ 08 января 2010

Страница водопада Buildbot может быть значительно предварительно подтверждена. Вот хороший пример http://build.chromium.org/buildbot/waterfall/waterfall

6 голосов
/ 28 июня 2011

Atlassian's Бамбук также определенно стоит проверить. Весь набор Atlassian (JIRA, Confluence, FishEye и т. Д.) Очень милый.

6 голосов
/ 25 февраля 2011

Я думаю, что эта тема довольно старая, но вот мое мнение о ней с Хадсоном:

Я решил пойти с pip и настроить репо (больно работать, но приятно выглядящий баклажан), на который hudson auto загружает успешные тесты. Вот мой грубый и готовый скрипт для использования со скриптом выполнения конфигурации hudson, например: /var/lib/hudson/venv/main/bin/hudson_script.py -w $ WORKSPACE -p my.package -v $ BUILD_NUMBER, просто вставьте ** / cover.xml, pylint.txt и nosetests.xml в битах конфигурации:

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

Когда дело доходит до развертывания, вы можете сделать что-то вроде:

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

И тогда люди могут разрабатывать вещи, используя:

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

Этот материал предполагает, что у вас есть структура репо для каждого пакета с setup.py и все настроенные зависимости, тогда вы можете просто проверить транк и запустить этот материал на нем.

Надеюсь, это кому-нибудь поможет.

------ обновление ---------

Я добавил эпидок, который очень хорошо сочетается с Хадсоном. Просто добавьте javadoc в вашу конфигурацию с помощью папки html

Обратите внимание, что в эти дни pip не поддерживает флаг -E должным образом, поэтому вам нужно создать свой venv отдельно

3 голосов
/ 28 апреля 2012

Если вы рассматриваете размещенное CI-решение и работаете с открытым исходным кодом, вам следует обратить внимание и на Travis CI - он очень хорошо интегрирован с GitHub. Хотя он начинался как инструмент Ruby, они добавили поддержку Python некоторое время назад.

3 голосов
/ 20 декабря 2011

еще один: Shining Panda - это хост-инструмент для python

2 голосов
/ 08 ноября 2012

Я бы рассмотрел CircleCi - у него отличная поддержка Python и очень приятный вывод.

2 голосов
/ 29 марта 2010

Сигнал другой вариант. Вы можете узнать больше об этом и посмотреть видео также здесь .

...