Автоматизация управления релизами, структурирование проекта Django

Наверное одно из самых важных в эффективной работе непосредственно над реализацией задуманного проекта — структурирование данных и файлов.

  1. Разработчик интуитивно понимает нахождение и функцию того или иного модуля проекта. Уменьшается порог вхождения для стороннего разработчика.

  2. Системный администратор может следить за изменениями версии проекта и с легкостью обновлять код на тестовых и боевых серверах вручную или автоматическими средствами.

В своих проектах я использую следующую структуру, частично позаимствованную у проекта Twisted

. (корень проекта)

burus$ ls -l1 .
__init__.py
admin
config
init_db.mysql
manage.py
patch-х.х.х.mysql
patch-after-first-install.mysql
src
topfiles

ADMIN

Скрипты для разработчика проекта, в частности скрипт cpyrght и release.

  1. /admin/cpyrght — позволяет добавлять строчку о авторском праве в исходный файл

  2. /admin/release — скрипт автоматизации создания тэгов и релизов проекта

    burus$ ./admin/release
    Django project auto release tool usage:
    
    $ release options
    
        options:
            -c comment, --commit-changes=comment : Commit latests changes,
                                               edit CHANGELOG and VERSION files
            -t, --tag                            : Make TAG from current repository version
            -r, --release                        : Make TAG and TALLBAR from current repository
                                               version
            -h, --help                           : Print usage help
    

CONFIG

Директория с файлами настройки проекта системным администратором.

burus$ ls -l1 config/
__init__.py
includes
settings.py
  1. includes содержит различные HTML шаблоны, в которых могут изменять контент без ведома программиста. Например это блоки рекламы, шапка, нижний блок сайта и т.п.

  2. settings.py — параметры и переменные для настройки системы, программист должен отделить скрытые параметры системы от переменных для настройки приложения в боевых/тестовых условия. Публичные или скорее защищенные параметры. Это нужно чтобы не злить администратора кучей бесполезного для него кода и условными обозначениями, ведь у него может быть множество подотчетных проектов на разных языках и платформах. Без фанатизма =).

Пример config/settings.py

burus$ cat config/settings.py
DEBUG = True # turn off for the perfomance in the production server

DOMAIN = 'django.local.lh'
STATIC_URL = 'static.local.lh'

CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
CACHE_TIMEOUT = 1*60 # seconds

PROJECT_ADMINS = ('support@domain.com',)

DATABASE_ENGINE = 'mysql'    # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'django-example'      # Or path to database file if using sqlite3.
DATABASE_USER = 'django'             # Not used with sqlite3.
DATABASE_PASSWORD = '***'         # Not used with sqlite3.
DATABASE_HOST = '127.0.0.1'             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

Скрипты xSQL

В корне проекта есть скрипты для установки иили модификации базы данных. Постфикс файла устанавливается в зависимости от используемой базы данных, чтобы проект можно было адаптировать к любой базе без особых усилий, не вспоминая что изменялось под тот или иной движок.

  1. init_db.mysql — скрипт создания базы данных.
  2. patch-х.х.х.mysql — патч базы с учетом версии релизв в котором изменения вступают в силу.
  3. patch-after-first-install.mysql — патч на базу, который применяется сразу после запуска ./manage.py syncdb в первый раз. Бывают проекты в которых сразу же нужно добавить в базу свои UNIQUE INDEX для генерации Exception и/или PL/SQL процедуры.

После использования патча и перехода на новую версию, старый патч удаляется вручную. На самом деле он остается в системе контроля версии (svn, cvs, mercurial, etc…), а в новой версии ПО в нем обычно уже нет необходимости.

SRC

В этой директории исходный код, который обновляется программистом от версии к версии. Код изолируется для того чтобы облегчить управление проектом и предостеречь путаницу с файлами конфигурации. Стандартный набор директории по умолчанию:

burus$ ls -l1 src/
__init__.py
_version.py
app
lib
settings.py
templates
urls.py
  1. _version.py — создается автоматически в ходе использования скрипта /admin/release
  2. app — одно из наших приложений с собственным urls.py, models.py, view.py, admin.py, forms.py и т.д.
  3. lib — библиотека общих утилит, декораторов и всяких вкусностей для нашего проекта. В этой директории хранится скрипт для управления версией проекта и обновления списка changelog. (decorators.py, version.py)
  4. settings.py — классический файл конфигурации проекта
  5. templates — директория для хранения шаблонов наших приложений и общих шаблонов проекта.
  6. urls.py — файл для управление первичным распределением URI между приложениями.

TOPFILES

Это временная директория для хранения информационных файлов, которые редактирую вручную или автоматически, при помощи /admin/release.

burus$ ls -l1 topfiles/
CHANGELOG
CHECKLIST
INSTALL
LICENSE
README
VERSION
init.d
setup.py

Большинство этих файлов будут находиться в корне проекта после создания tallbar релиза и не требуют комментариев. init.d — скрипт автозапуска приложения, после инсталляции перекочует в /etc/init.d/projet_name, где имя присваивается автоматически по названию проекта(директории). CHECKLIST — краткое пособие для black box тестирования.

Заключение

  1. Данный подход позволяет значительно сократить время на сборку и модификацию релиза проекта.
  2. Changelog сохраняется один к одному по комментариям в commit операции. Комментарии рекомендую делать в виде идентификаторов задач в системе Trac, JIRA и т.п.. Такой подход увеличит срок ващей жизни пощадив нервы, когда вам придется быстро откатиться на старую версию и/или найти разницу в коде связанную с определенной задачей.
  3. Удобно критиковать код и ход выполнения проекта.
  4. commit нужно делать через скрипт /admin/release, чтобы сохранялись логи изменения кода в src/_version.py.
  5. Когда вы делаете тэг проекта “/admin/release -t”, автоматически обновляются файлы VERSION, CHANGELOG, _version.py и создается тэг в ветке репозитория tags/x.x.x.

Скачать

Примеры исходного кода можно скачать и посмотреть тут dajngo auto release example или сразу тут

hg clone https://django-auto-release-example.googlecode.com/hg/ django-auto-release-example

Надеюсь мой опыт пригодится вам. На данном этапе не работает setup.py и авто tallbar, нет универсализации под mercurial, но в ближайшее время я обновлю код и сделаю первый его релиз для публичного использования. Не хочу слушать про EGG и “блага” от Zope3 =).


Добавить пост в:   Yandex.ru Google Yahoo Bobrdobr.ru Newsland.ru Smi2.ru Rumarkz.ru Memori.ru Myscoop.ru 100zakladok.ru Rucity.com Moemesto.ru News2.ru Delicious Reddit Slashdot Digg Technorati
Комментировать

Поля не обязательны для заполнения, по умолчанию комментарий от Anonymous

captcha
Оставить комментарий используя OpenID

Пожалуйста выберите сервер с вашим аккаунтом: