"Красивая" непрерывная интеграция для Python
это немного.. напрасный вопрос, но вывод BuildBot не особенно приятно смотреть..
например, по сравнению с..
..и другие BuildBot выглядит довольно.. архаичный
Я в настоящее время играет с Хадсоном, но он очень Java-ориентирован (хотя и с данное руководство, я нашел его легче настроить, чем BuildBot, и произвел больше информации)
в основном: есть ли какие-либо системы непрерывной интеграции, направленные на python, которые производят много блестящих графиков и тому подобное?
обновление: С этого времени проект Дженкинс заменил Хадсон в качестве версии сообщества пакета. Оригинальные авторы переехали в и этот проект тоже. Jenkins теперь является стандартным пакетом на Ubuntu/Debian, RedHat/Fedora/CentOS и других. Следующее обновление по-прежнему является по существу правильным. Отправной точкой для этого является Дженкинс разное.
обновление: попробовав несколько альтернатив, я думаю, что буду придерживаться Хадсона. целостность было приятно и просто, но довольно ограничено. Я думаю Buildbot лучше подходит многочисленные встроенные рабы, а не все, что работает на одной машине, как я ее использовал.
настройка Hudson для проекта Python была довольно простой:
- скачать Хадсон изhttp://hudson-ci.org/
- С
java -jar hudson.war
- откройте веб-интерфейс по адресу по умолчанию
http://localhost:8080
- перейти к управлению Hudson, Плагины, нажмите кнопку "Обновить" или аналогичный
- установите плагин Git (I пришлось установить
gitпуть в глобальных настройках Гудзона) - создайте новый проект, войдите в репозиторий, интервалы опроса SCM и так далее
- установить
nosetestsчерезeasy_installесли это еще не - на этапе сборки a добавьте
nosetests --with-xunit --verbose
- Проверьте "опубликовать отчет о результатах теста JUnit" и установите "отчет по тесту XMLs" в
**/nosetests.xml
это все, что требуется. Вы можете настроить уведомления по электронной почте, и в Плагины стоит посмотреть. Некоторые из них я в настоящее время использую для проектов Python:
плагин SLOCCount для подсчета строк кода (и график это!) - вам нужно установить sloccount отдельно
нарушения чтобы проанализировать вывод PyLint (вы можете настроить пороги предупреждения, график количества нарушений по каждой сборке)
Cobertura можно разобрать coverage.py выход. Nosetest может собирать покрытие во время выполнения тестов, используяnosetests --with-coverage(это записывает вывод в**/coverage.xml)
14 ответов:
вы, возможно, захотите, чтобы проверить нос и выходной плагин Xunit. Вы можете запустить модульные тесты и проверки покрытия с помощью этой команды:
nosetests --with-xunit --enable-coverэто будет полезно, если вы хотите пойти по маршруту Дженкинса, или если вы хотите использовать другой сервер CI, который имеет поддержку JUnit test reporting.
аналогично вы можете захватить вывод pylint с помощью нарушений плагин для Jenkins
Не знаю, будет ли это делать:укусил сделан ребятами, которые пишут Trac и интегрирован с Trac. Apache Gump это инструмент CI, используемый Apache. Он написан на Python.
У нас был большой успех с TeamCity как наш сервер CI и, используя нос в качестве наших тестов. плагин Teamcity для nosetests дает вам подсчет pass / fail, читаемый дисплей для неудачного теста (который может быть отправлен по электронной почте). Вы даже можете увидеть детали сбоев теста во время работы стека.
Если, конечно, поддерживает такие вещи, как запуск на нескольких машинах, и это гораздо проще настроить и поддерживать, чем buildbot.
страница водопада Buildbot может быть значительно украшена. Вот хороший пример http://build.chromium.org/buildbot/waterfall/waterfall
компании Atlassian-это бамбук также определенно стоит проверить. Весь Atlassian suite (JIRA, Confluence, FishEye и т. д.) довольно сладкий.
Я думаю, что эта нить довольно старая, но вот мой взгляд на нее с Хадсоном:
я решил пойти с pip и создать РЕПО (болезненно, чтобы работать, но приятно смотреть eggbasket), который Хадсон автоматически загружает с успешными тестами. Вот мой грубый и готовый скрипт для использования с Hudson config execute script, например: /var/lib/hudson/venv/main/bin/hudson_script.py -w $WORKSPACE-p my.пакет-v $BUILD_NUMBER, просто введите * * / coverage.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этот материал предполагает, что у вас есть структура РЕПО на пакет с a setup.py и все зависимости настроены, тогда вы можете просто проверить багажник и запустить этот материал на нем.
Я надеюсь, что это помогает кто-то.
------обновление---------
я добавил epydoc, который вписывается очень мило с Хадсоном. Просто добавьте javadoc в свою конфигурацию с помощью HTML-папки
обратите внимание, что pip не поддерживает флаг-E должным образом в эти дни, так что вы должны создать свой venv отдельно
другой : Сияющий Панда это размещенный инструмент для python
Если вы рассматриваете размещенное решение CI и делаете открытый исходный код, вы должны заглянуть в Travis CI а также-он имеет очень хорошую интеграцию с GitHub. Хотя это началось как инструмент Ruby, у них есть добавлена поддержка Python некоторое время назад.
сигнал-это еще один вариант. Вы можете узнать больше об этом и посмотреть видео здесь.
Я считаю CircleCi - это имеет большую поддержку Python и очень красивый выход.
ума binstar теперь может запускать сборки из github и может компилироваться для linux, osx и windows ( 32 / 64 ). самое приятное то, что он действительно позволяет тесно сочетать распределение и непрерывную интеграцию. Это пересечение т и расставление точек I интеграции. Сайт, рабочий процесс и инструменты действительно отполированы, а AFAIK conda-это самый надежный и pythonic способ распространения сложных модулей python, где вам нужно обернуть и распространяйте библиотеки C/C++/Fotran.
мы использовали укушенный совсем немного. Это довольно и хорошо интегрируется с Trac, но это боль в заднице, чтобы настроить, если у вас есть какой-либо Нестандартный рабочий процесс. Также есть просто не так много плагинов, как для более популярных инструментов. В настоящее время мы оцениваем Хадсона как замену.
проверить rultor.com. Как в этой статье объясняет, он использует Docker для каждой сборки. Благодаря этому вы можете настроить все, что вам нравится в вашем образе Docker, включая Python.
немного отказ от ответственности, я на самом деле должен был построить решение, как это для клиента, который хотел способ автоматического тестирования и развертывания любой код на git push plus управляет выпуском билетов через Git notes. Это также приведет к моей работе над цель проекта.
можно было бы легко просто настроить голую систему узлов, которая имеет пользователя сборки и управлять их сборкой через
make(1),expect(1),crontab(1)/systemd.unit(5)иincrontab(1). Можно даже пойти дальше и используйте ansible и celery для распределенных сборок с хранилищем файлов gridfs/nfs.хотя, я бы не ожидал, что кто-то, кроме седобородого парня UNIX или инженера/архитектора принципиального уровня, действительно зайдет так далеко. Просто делает для хорошей идеи и потенциального опыта обучения, так как сервер сборки-это не что иное, как способ произвольного выполнения скриптовых задач в автоматическом режиме.
Comments