вторник, 26 июня 2012 г.

Разработка под Bitrix с Mercurial

Недавно мне задали вопрос, как у нас в студии обходятся с системой контроля и Битриксом, а также тем, как у нас организованы переносы всяких обновлений между разными локальными копиями разработческих сайтов и всё такое. Я решил написать пост об этом всём таком.

В разработке мы используем распределённую систему контроля версий Mercurial. В репозиториях мы храним только то, что сделали сами, а исходники Битрикса - нет. Причин для этого несколько, самая основная - это обеспечение переносимости. Наши наработки можно взять и спокойно перетащить с одной установки Битрикса на другую, просто сделав hg clone. Таким образом, если одна копия Битрикса протухает, можно установить новую и продолжить работу, не беспокоясь о покупке лицензий для нескольких разработчиков (ага, купите всей команде лицензии на локальные установки корппортала по несколько сот тысяч рублей каждая, ну-ну), об обновлениях Битрикса и о том, что его исходники весят несколько десятков мегабайт.

Тут картиночка с менее фиолетовым, чем с похмелья, небом.

Она, конечно, тут не очень к месту, но пусть будет. На ней изображены аккуратно насыпанные говна для более удобного, чем по новому мосту, пешего перехода через пруд.

Для точечного исключения исходников Битрикса, чтоб hg st обнаруживал новые файлы среди модулей и наших компонентов, мы сочиняем длинный .hgignore. Вот типовой пример с одного из наших проектов:
^bitrix/help
^yandex-landing/*
^.access.php
^.htaccess
glob:*.log
^bitrix/admin/*
^bitrix/backup/*
^bitrix/cache/*
^bitrix/components/bitrix/*
^bitrix/*.php
^bitrix/gadgets/bitrix/*
^bitrix/image_uploader/*
^bitrix/images/fileman/*
^bitrix/images/1.gif
^bitrix/images/iblock/*
^bitrix/images/icons/*
^bitrix/images/install/*
^bitrix/images/main/*
^bitrix/images/search/*
^bitrix/images/seo/*
^bitrix/js/fileman/*
^bitrix/js/iblock/*
^bitrix/js/main/*
^bitrix/js/search/*
^bitrix/managed_cache/*
^bitrix/modules/compression/*
^bitrix/modules/fileman/*
^bitrix/modules/iblock/*
^bitrix/modules/main/*
^bitrix/modules/perfmon/*
^bitrix/modules/search/*
^bitrix/modules/seo/*
^bitrix/modules/sitecorporate/*
^bitrix/modules/socialservices/*
^bitrix/p3p.xml
^bitrix/php_interface/after_connect.php
^bitrix/php_interface/dbconn.php
^bitrix/sounds/*
^bitrix/templates/print/components/bitrix/*
^bitrix/templates/print/description.php
^bitrix/templates/print/footer.php
^bitrix/templates/print/header.php
^bitrix/templates/print/lang/*
^bitrix/templates/print/styles.css
^bitrix/templates/print/template_styles.css
^bitrix/templates/web20/*
^bitrix/themes/.default/*
^bitrix/tools/*
^bitrix/update/*
^bitrix/web.config
^bitrix/wizards/bitrix/*
^images/01.gif
^images/1.gif
^images/demo_course/*
^images/help.gif
^images/icons/edit_iblock_news.gif
^images/icons/edit_news.gif
^images/icons/edit_page.gif
^images/pdf_doc.gif
^images/rss20.gif
^robots.txt
^upload/*
^web.config
^bitrix/activities/bitrix/*
^bitrix/images/advertising/*
^bitrix/images/bizproc/*
^bitrix/images/blog/*
^bitrix/images/controller/*
^bitrix/images/form/*
^bitrix/images/forum/*
^bitrix/images/intranet/*
^bitrix/images/ldap/*
^bitrix/images/learning/*
^bitrix/images/lists/*
^bitrix/images/mail/*
^bitrix/images/security/*
^bitrix/images/socialnetwork/*
^bitrix/images/statistic/*
^bitrix/images/subscribe/*
^bitrix/images/support/*
^bitrix/images/vote/*
^bitrix/images/wiki/*
^bitrix/images/workflow/*
^bitrix/js/advertising/*
^bitrix/js/bizproc/*
^bitrix/js/form/*
^bitrix/js/intranet/*
^bitrix/js/learning/*
^bitrix/modules/advertising/*
^bitrix/modules/bizproc/*
^bitrix/modules/bizprocdesigner/*
^bitrix/modules/blog/*
^bitrix/modules/controller/*
^bitrix/modules/clouds/*
^bitrix/modules/extranet/*
^bitrix/modules/form/*
^bitrix/modules/forum/*
^bitrix/modules/intranet/*
^bitrix/modules/ldap/*
^bitrix/modules/learning/*
^bitrix/modules/lists/*
^bitrix/modules/mail/*
^bitrix/modules/photogallery/*
^bitrix/modules/security/*
^bitrix/modules/socialnetwork/*
^bitrix/modules/statistic/*
^bitrix/modules/subscribe/*
^bitrix/modules/support/*
^bitrix/modules/translate/*
^bitrix/modules/video/*
^bitrix/modules/videoport/*
^bitrix/modules/vote/*
^bitrix/modules/webdav/*
^bitrix/modules/webservice/*
^bitrix/modules/wiki/*
^bitrix/modules/workflow/*
^bitrix/modules/xmpp/*
^bitrix/modules/bitrix.sitecorporate/*
^bitrix/php_interface/subscribe/*
^bitrix/sounds/socialnetwork/*
^bitrix/stack_cache/*
^bitrix/templates/empty/*
^bitrix/templates/learning/*
^bitrix/templates/light/*
^bitrix/tmp/*
^bitrix/video/*
^bitrix/webdav/*
^images/bp/*
^images/icons/arrows.gif
^images/icons/bullet_calendar.gif
^images/icons/bullet_dot.gif
^images/icons/line.gif
^images/portal_user/*
^images/requests/*
^bitrix/modules/sitepersonal/*
^bitrix/modules/sitecommunity/*
^bitrix/components/demo/*
^bitrix/templates/books/*
^bitrix/modules/currency/*
^bitrix/images/currency/*
glob:*.komodoproject
^.bottom.menu.php
^.top_links.menu.php
^workgroups/*
^services/*
^images/docs/*
^images/company/*
^docs/*
^company/*
^community/*
^bitrix/updates/*
glob:*.zip
glob:files/*
^feedback.xls
^bitrix/templates/test_page/
^bitrix/php_interface/*
^bitrix/modules/sitestore/*
^bitrix/modules/sale/*
^bitrix/otp/*
^bitrix/modules/catalog/*
^bitrix/images/*
^bitrix/templates/.default/*
^auth/.section.php
^auth/index.php
^bitrix/js/socialservices/*
^content/*
^personal/*
^search/*
^bitrix/js/form_info.js
^bitrix/js/form_taskbar.js
^bitrix/js/form_validators.js
^.section.php
^.top.menu.php
^index_inc.php
^sect_inc.php
^work/
^products/
^sect_inc_head_main.php
^corp/
^contacts/
^.service.menu.php
^agents/
^banner/*
^bitrix/modules/.htaccess
^bitrix/templates/2cols/*
^forum/index.php
^bitrix/js/jquery-1.6.1.min.js
^editors/*
^int_page_header.php
^map/*
^support/*
^urlrewrite.php

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

На наших серверах мы поднимаем две копии сайта, тестовую и показную (testing и stage соответственно), иногда обходимся без показной; все разработчики делают себе локальные рабочие копии, и начинается работа.

Помимо изменений кода, существуют также изменения в БД, касающиеся разработки. Ну, например, для создания какого-нибудь раздела новостей нужно сделать инфоблок, в нём секции, в них, может быть, элементы. Для того, чтоб все разработчики не тратили время, создавая у себя такие же инфоблоки, мы придумали простую систему апдейтов.

В отдельной папочке хранятся файлики с именами формата [\d]{6}[a-zA-Z]*\.php. Соответственно, номера файлов должны увеличиваться со временем с каждым новым апдейтом. В админке Битрикса мы сделали кнопочку "обновить". Скрипт обновления смотрит, какой номер файла обновлялся последним, и по порядку запускает ещё невыполненные скрипты. На тот случай, если несколько разработчиков хотят параллельно делать скрипты обновления, для того, чтоб не было коллизий в номерах и невыполненных скриптов, предусмотрены буковки. Файлики обновлений с именами с буковками имеют отдельную нумерацию (например, 000001ds.php, 000002ds.php, ...) и версии с буковками считаются отдельно.

6 комментариев:

  1. Я, конечно, не думал сильно много, но у меня сразу возникло подозрение, что ту же задачу (объединение в одном месте двух источников исходного кода) можно решить с помощью аналога svn:externals или git submodule в mercurial

    ОтветитьУдалить
    Ответы
    1. В этом нет необходимости, да я и не знаю, что это такое. В меркуриале есть субрепозитории, но это не годится, так как субрепозитории не могут быть взаимопроникающими (как я понял из документации, которую читал давным-давно), а наши исходники плавно размазаны по всему битриксу - что-то в компонентах, что-то в шаблонах, что-то в модулях, проще сунуть всё ненаше в игнор, как мне кажется.

      Удалить
  2. Вы бд обновляете php-скриптами? :D

    ОтветитьУдалить
    Ответы
    1. Ну да. Опыт показывает, что лучше не напрямую лазить в бд, а вызывать всякие высокоуровневые врапперы, потому что способ хранения этого дела в таблицах может различаться в разных версиях Битрикса, и стопудово отличается в случае разных СУБД.

      Удалить
    2. А есть способ автоматически создавать скрипты для миграций, или вы пишете все руками?

      Удалить
    3. У нас такого способа нет, мы пишем всё руками. Вернее, копипастим из уже имеющихся подобных скриптов и правим незначительно.

      Удалить

Ублюдочный Гугл поломал форму комментариев. Извините.