Slide 1

Slide 1 text

Сборка Python-проекта Эдуард Искандаров

Slide 2

Slide 2 text

Moscow Django MeetUp №17 fabric workflow $ fab stop_services $ fab backup $ fab pull $ fab migrate $ fab start_services

Slide 3

Slide 3 text

Moscow Django MeetUp №17 Workflow в Mail.Ru Group Разработка Эксплуатация RPM* в продакшн чик-чик-чик * любой другой формат бинарный пакетов

Slide 4

Slide 4 text

Moscow Django MeetUp №17 Терминология • Пакет это директория, содержащая файлы Python • Python файлы называются модулями • Дистрибутив - бинарный дистрибутив или дистрибутив исходных кодов проекта в виде tar или zip архива

Slide 5

Slide 5 text

Moscow Django MeetUp №17 Абстрактные требования • Понятный способ организации файлов • Воспроизводимость окружения • Контроль версий Python пакетов • Контроль версий системных пакетов • Контроль процесса установки проекта • Cценарии до и после установки • Предоставить удобные инструменты эксплуатации • Init скрипты • Различные утилиты

Slide 6

Slide 6 text

Moscow Django MeetUp №17 Кристаллизованные требования • distutils/setuptools • virtualenv • pip • rpmbuild system

Slide 7

Slide 7 text

Moscow Django MeetUp №17 Инструменты сборки • distutils (python setup.py bdist_rpm) • pypi2rpm (python setup.py bdist_rpm2) • наследует класс distutils.command.bdist_rpm.bdist_rpm • можно задавать внешний .spec файл, но при этом теряется мета информация

Slide 8

Slide 8 text

Moscow Django MeetUp №17 Инструменты сборки • distutils (python setup.py bdist_rpm) • pypi2rpm (python setup.py bdist_rpm2) • наследует класс distutils.command.bdist_rpm.bdist_rpm • можно задавать внешний .spec файл, но при этом теряется мета информация virtualenv не поддерживается

Slide 9

Slide 9 text

Moscow Django MeetUp №17 Схематичный процесс сборки Дерево исходных кодов Python source distribution RPM

Slide 10

Slide 10 text

Moscow Django MeetUp №17 Да будет RPM! $ make rpm

Slide 11

Slide 11 text

Moscow Django MeetUp №17 https://github.com/toidi/pony-homepage

Slide 12

Slide 12 text

Moscow Django MeetUp №17 pony-homepage $ tree . ├── contrib │ └── pony-homepage.spec ├── pony_homepage │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── Makefile ├── manage.py └── setup.py ! 2 directories, 8 files

Slide 13

Slide 13 text

Moscow Django MeetUp №17 https://github.com/toidi/pony-homepage

Slide 14

Slide 14 text

Moscow Django MeetUp №17 urls.py и settings.py urlpatterns = patterns('', (r'^$', TemplateView.as_view( template_name='pony/pony.html'))) INSTALLED_APPS = ( 'pony_homepage', 'pony', 'django.contrib.admin', urls.py settings.py

Slide 15

Slide 15 text

Moscow Django MeetUp №17 setup.py from setuptools import setup, find_packages setup( name = 'pony-homepage', version = '0.1.0', packages = find_packages(), scripts = ['manage.py'], ! install_requires = ['Django==1.6.2', 'django-pony==1.0'], ! # metadata for upload to PyPI author = 'Eduard Iskandarov', author_email = '[email protected]', description = 'Pony Homepage', long_description = 'AWESOME application for every pony', license = 'BSD', keywords = 'django pony rpm spec virtualenv rpm', url = 'https://github.com/toidi/pony-homepage', )

Slide 16

Slide 16 text

Moscow Django MeetUp №17 Закрепим результат # Сборка дистрибутива выполняется командой $ python setup.py egg_info -RDb "" sdist ! ! # Пример установки из локальной ФС: $ pip install dist/pony-homepage-0.1.0.tar.gz

Slide 17

Slide 17 text

Moscow Django MeetUp №17 pony-homepage.spec 24 %prep 25 %setup -qc 26 27 %build 28 python setup.py egg_info -RDb "" sdist 29 30 %install 31 virtualenv %{buildroot}/opt/%{_name} ! 32 %{buildroot}/opt/%{_name}/bin/python -m pip install\ dist/%{_name}-%{_version}.tar.gz 33 34 # fix path 35 find %{buildroot}/opt/%{_name}/bin -type f\ 36 -exec sed -i 's:'%{buildroot}'::' {} \;

Slide 18

Slide 18 text

Moscow Django MeetUp №17 Makefile 18 rpm: archive 19 mv $(NAME)-$(VERSION).tar.gz ~/rpmbuild/SOURCES ! 20 cp contrib/pony-homepage.spec ~/rpmbuild/SPECS ! 21 rpmbuild ~/rpmbuild/SPECS/pony-homepage.spec -bb\ 22 --define "_name $(NAME)"\ 23 --define "_version $(VERSION)"\ 24 --define "_release $(RELEASE)"\ 25 --define "_description $(DESCRIPTION)"\ 26 --define "_license $(LICENSE)"\ 27 --define "_url $(URL)"\ 28 --define '_long_description $(LONG_DESCRIPTION)'

Slide 19

Slide 19 text

Moscow Django MeetUp №17 RPM готов! $ make rpm ! # yum localinstall ponyhomepage—0.1.0-1.el6.x86_64.rpm

Slide 20

Slide 20 text

Moscow Django MeetUp №17 Структура директорий # tree -L 5 -d /opt/ /opt/ └── pony-homepage ├── bin ├── include │ └── python2.7 -> /usr/include/python2.7 ├── lib │ └── python2.7 │ ├── config -> /usr/lib64/python2.7/config │ ├── distutils │ ├── encodings -> /usr/lib64/python2.7/encodings │ ├── lib-dynload -> /usr/lib64/python2.7/lib-dynload │ └── site-packages │ ├── django │ ├── Django-1.6.2-py2.7.egg-info │ ├── django_pony-1.0-py2.7.egg-info │ ├── _markerlib │ ├── pip │ ├── pip-1.4.1-py2.7.egg-info │ ├── pony │ ├── pony_homepage │ ├── pony_homepage-0.1.0-py2.7.egg-info │ ├── setuptools │ └── setuptools-0.9.8-py2.7.egg-info └── lib64 -> lib ! 23 directories virtualenv

Slide 21

Slide 21 text

Moscow Django MeetUp №17 Поехали $ /opt/pony-homepage/bin/gunicorn pony_homepage.wsgi ! ! ! ! $ uwsgi --http :8000 --virtualenv /opt/pony-homepage\ —wsgi pony_homepage.wsgi

Slide 22

Slide 22 text

Moscow Django MeetUp №17 http://192.168.56.101:8000

Slide 23

Slide 23 text

Moscow Django MeetUp №17 Best practice • Применяем setuptools • Устанавливаем проект в virtualenv • Пакуем все в RPM

Slide 24

Slide 24 text

Moscow Django MeetUp №17 Куда двигаться дальше? • запуск проекта после установки (init script, supervisord, daemon tools, runit, systemd) • requirements.txt • vendor lock (рассмотренный пример относится к rpm-based дистрибутивам) • страницы с руководством (man pages) (distutils, sphinx) • конфигурация проекта • advanced python packaging • конфигурация веб сервера (gunicorn, uwsgi, circus) связка с nginx • continuous integration • private pypi

Slide 25

Slide 25 text

Moscow Django MeetUp №17 Бонусы 1. syncdb $ /opt/pony-homepage/bin/manage.py syncdb ! ! ! 2. ! ! ! ! ! $ /opt/pony-homepage/bin/python -m pony_homepage What does the pony say? IGOGO!

Slide 26

Slide 26 text

Moscow Django MeetUp №17 Ссылки • https://github.com/toidi/pony-homepage! • http://docs.python.org/2.7/distutils/builtdist.html! • http://pythonhosted.org/setuptools! • https://bitbucket.org/tarek/pypi2rpm! • http://www.virtualenv.org! • http://www.pip-installer.org! • http://wiki.centos.org/HowTos/SetupRpmBuildEnvironment! • http://fedoraproject.org/wiki/How_to_create_an_RPM_package

Slide 27

Slide 27 text

Moscow Django MeetUp №17 Вопросы?

Slide 28

Slide 28 text

Moscow Django MeetUp №17 PROBLEMS?! # Activate the virtual environment cd $DJANGODIR source ../bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH ! # Create the run directory if it doesn't exist RUNDIR=$(dirname $SOCKFILE) test -d $RUNDIR || mkdir -p $RUNDIR ! # Start your Django Unicorn # Programs meant to be run under supervisor should not # daemonize themselves (do not use --daemon) exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --log-level=debug \ --bind=unix:$SOCKFILE

Slide 29

Slide 29 text

Moscow Django MeetUp №17 Эдуард Искандаров [email protected] Контакты