Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Сборка Python-проекта v2

Сборка Python-проекта v2

Сборка — важный и ответственный этап жизненного цикла программного продукта. В мире Python этот процесс связан с некоторыми заблуждениями и необоснованными усложнениями. Доклад содержит обзор проблем со сборкой и способ их решений на примере Django проекта. Предложенный подход естественным образом вписывает проект в экосистему Python, чем значительно упрощает эксплуатацию и предоставляет ряд преимуществ.
Вторая часть предназначается для конференции UfaPy и отличается от первой большей проработкой.

Avatar for Eduard Iskandarov

Eduard Iskandarov

October 15, 2014
Tweet

More Decks by Eduard Iskandarov

Other Decks in Programming

Transcript

  1. UfaPy Терминология • Пакет это директория, содержащая файлы Python •

    Python файлы называются модулями • Дистрибутив - бинарный дистрибутив или дистрибутив исходных кодов проекта в виде tar или zip архива
  2. UfaPy Workflow в Mail.Ru Group Разработка Эксплуатация Сборка RPM* в

    продакшн чик-чик-чик * deb, dmg, pkg, msi, …
  3. UfaPy Инструменты сборки • distutils (python setup.py bdist_rpm) • pypi2rpm

    (python setup.py bdist_rpm2) virtualenv не поддерживается
  4. UfaPy 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
  5. UfaPy Зачем делать сборку? • Понятный способ организации файлов •

    Контроль версий RPM и Python пакетов • Контроль процесса раскладки проекта • Удобные инструменты эксплуатации
  6. UfaPy 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
  7. UfaPy 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.7.0', 'django-pony==1.0'], ! # metadata for upload to PyPI author = 'Eduard Iskandarov', author_email = '[email protected]', )
  8. UfaPy Закрепим результат # Сборка дистрибутива выполняется командой $ python

    setup.py egg_info -RDb "" sdist ! ! # Пример установки из локальной ФС: $ pip install dist/pony-homepage-0.1.0.tar.gz
  9. UfaPy 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}'::' {} \;
  10. UfaPy Makefile 12 build_prepare: 13 mkdir -p SOURCES 14 git

    archive --format tar --output \ SOURCES/$(NAME)-$(VERSION).tar.gz HEAD: 15 16 srpm: build_prepare 17 mock --buildsrpm \ 18 --resultdir=. \ 19 --spec=contrib/pony-homepage.spec \ 20 --sources=SOURCES \ 29 30 rpm: srpm 31 mock --rebuild *.src.rpm \ 32 --resultdir=. \
  11. UfaPy Поехали $ /opt/pony-homepage/bin/gunicorn pony_homepage.wsgi ! ! $ uwsgi --http

    :8000 -—virtualenv /opt/pony-homepage\ —wsgi pony_homepage.wsgi
  12. UfaPy Бонусы 1. syncdb $ /opt/pony-homepage/bin/manage.py syncdb ! ! !

    2. ! ! ! ! ! $ /opt/pony-homepage/bin/python -m pony_homepage What does the pony say? IGOGO!
  13. UfaPy Структура директорий # tree -L 5 -d /opt/ /opt/

    └── pony-homepage ├── bin ├── include │ └── python2.7 ├── lib │ └── python2.7 │ ├── config │ ├── distutils │ ├── encodings │ ├── lib-dynload │ └── site-packages │ ├── django │ ├── _markerlib │ ├── pip │ ├── pony │ ├── pony_homepage │ └── setuptools └── lib64 -> lib ! 23 directories virtualenv
  14. UfaPy Куда двигаться дальше? • запуск проекта после установки (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
  15. UfaPy Ссылки • 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