Drupal -organizaciya_razrabotki

440 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
440
On SlideShare
0
From Embeds
0
Number of Embeds
47
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Drupal -organizaciya_razrabotki

  1. 1. Drupal: организация  разработки
  2. 2. Генеральный спонсор и организатор конференции DrupalConf 2011 При поддержке:
  3. 3. Спонсоры Информационные спонсоры Сайт конференции
  4. 4. Почему разработчики плачут? <ul><li>Drupal клевый: </li></ul><ul><li>  </li></ul><ul><ul><li>гибкость </li></ul></ul><ul><ul><li>настраиваемость </li></ul></ul><ul><ul><li>собираем из функциональных блоков что угодно </li></ul></ul><ul><ul><li>мощь инструментов Views, CCK, Rules и т.д. </li></ul></ul><ul><li>  </li></ul><ul><li>В чем же проблема? </li></ul>
  5. 5. Почему разработчики плачут? <ul><li>OMG, настройки в БД: </li></ul><ul><ul><li>Включенные модули и их настройки </li></ul></ul><ul><ul><li>Блоки, словари, типы контента CCK </li></ul></ul><ul><ul><li>Роли пользователей, настройки прав </li></ul></ul><ul><ul><li>настройки Views, Rules и др. </li></ul></ul><ul><li>  </li></ul><ul><li>Возникновение ошибок и трата времени: </li></ul><ul><ul><li>миграция изменений с сервера на сервер </li></ul></ul><ul><ul><li>миграция изменений между разработчиками </li></ul></ul><ul><li>  </li></ul>
  6. 6. Простой workflow <ul><ul><li>Несколько разработчиков, каждый работает на своем локальном сервере: нужно делиться изменениями </li></ul></ul><ul><ul><li>Тестовый сервер: нужно переносить настройки и контент </li></ul></ul><ul><ul><li>Боевой сервер: нужно переносить настройки, сохраняя контент </li></ul></ul><ul><li>  </li></ul>
  7. 7. Что делать? <ul><li>Что нам нужно: </li></ul><ul><ul><li>отслеживать изменения в конфигурации </li></ul></ul><ul><ul><li>переносить изменения в конфигурации </li></ul></ul><ul><li>Подходы: </li></ul><ul><ul><li>работать с миграциями изменений в БД </li></ul></ul><ul><ul><li>настройки - в код (code-driven development): экосистема Features </li></ul></ul>
  8. 8. Drush: лучший друг разработчика <ul><ul><li>cc - очистка кэша </li></ul></ul><ul><ul><li>dl, en, dis - работа с модулями </li></ul></ul><ul><ul><li>sql-dump, sql-sync - работа с дампами БД </li></ul></ul><ul><ul><li>rsync - синхронизация файлов </li></ul></ul><ul><ul><li>remote-backup, remote-restore - бэкапы </li></ul></ul>
  9. 9. Migraine: наш опыт <ul><ul><li>Migraine by Noosphere Networks http://ashearer.com/software/server-administration/migraine  </li></ul></ul><ul><ul><li>модификация для D6 by mukesh.agarwal17 http://www.blisstering.com/migraine-synchronize-your-development-staging-and-production-sites-databases-drupal-6 </li></ul></ul><ul><ul><li>drush </li></ul></ul><ul><ul><li>скрипты для drush от Данила Семеленова </li></ul></ul><ul><li>  </li></ul><ul><li>Подробнее про Migraine </li></ul><ul><ul><li>http://www.slideshare.net/drupalindia/migraine-drupal-syncing-your-staging-and-live-sites-presentation </li></ul></ul>
  10. 10. Что делает Migraine <ul><li>Migraine: разделение таблиц </li></ul><ul><ul><li>config_tables: blocks blocks_roles boxes, filters filter_formats, imagecache_action, imagecache_preset... </li></ul></ul><ul><ul><li>content_tables*: node, node_revisions, search_dataset, search_index, term_data, term_node... </li></ul></ul><ul><ul><li>temp_tables: accesslog, watchdog... </li></ul></ul><ul><ul><li>cache_tables: cache, cache_block, cache_filter, cache_menu, cache_page, cache_views... </li></ul></ul><ul><ul><li>ignore_tables: ... </li></ul></ul><ul><li>_______________________________________________ </li></ul><ul><li>* - все таблицы content_type_* и content_field_* определяются как контентные автоматически </li></ul>
  11. 11. Расширения Drush <ul><li>Оболочка для команд Migraine </li></ul><ul><ul><li>migrate-db-dump — создание дампа локальной БД </li></ul></ul><ul><ul><li>migrate-db-restore — восстановление БД из локального дампа </li></ul></ul><ul><ul><li>migrate - полная миграция сайта, включая исходные файлы и БД </li></ul></ul><ul><ul><li>sync - cинхронизация файлов локальной версии сайта с удаленной. </li></ul></ul>
  12. 12. Что еще нужно подготовить <ul><ul><li>/sites/xxxx для всех площадок </li></ul></ul><ul><ul><li>aliases.drushrc.php: алиасы площадок @dev, @test, @prod, реквизиты доступа (см. drush/examples/example.aliases.drushrc.php) </li></ul></ul><ul><ul><li>settings.php для индивидуальных настроек внутри /sites/xxxx </li></ul></ul>
  13. 13. Migraine: workflow <ul><li>Разработчик 1 </li></ul><ul><ul><li>Работаем над кодом и конфигурацией </li></ul></ul><ul><ul><li>Делаем дамп migrate-db-dump (можно повесить на pre-commit hook для git) </li></ul></ul><ul><ul><ul><li>  возможно, занесение новых таблиц в tables.py или tables.php </li></ul></ul></ul><ul><ul><li>commit, push </li></ul></ul><ul><li>  </li></ul><ul><li>Разработчик 2 </li></ul><ul><ul><li>pull (возможно, разрешаем конфликты) </li></ul></ul><ul><ul><li>Делаем migrate-db-restore </li></ul></ul><ul><ul><li>Изменения в конфигурации мигрировали </li></ul></ul>
  14. 14. Migraine: workflow <ul><li>drush @dev migrate @test: </li></ul><ul><ul><li>drush @dev migrate-db-dump </li></ul></ul><ul><ul><li>drush @dev sync @test </li></ul></ul><ul><ul><li>миграция БД </li></ul></ul><ul><li>  </li></ul><ul><li>drush @dev migrate @prod: </li></ul><ul><ul><li>drush @dev migrate-db-dump </li></ul></ul><ul><ul><li>drush @dev sync @prod </li></ul></ul><ul><ul><li>миграция БД (кроме содержимого контентных таблиц) </li></ul></ul><ul><ul><ul><li>(возможно) изменение схемы контентных таблиц (при изменении типов данных через CCK) </li></ul></ul></ul><ul><li>  </li></ul>
  15. 15. Migraine: плюсы и минусы <ul><li>Хорошо: </li></ul><ul><ul><li>таблицы классифицированы - больше думать не надо </li></ul></ul><ul><ul><li>нет зависимости от предоставления модулями каких-то интерфейсов для экспорта-импорта </li></ul></ul><ul><li>  </li></ul><ul><li>Плохо: </li></ul><ul><ul><li>в случае конфликтов разбираться в дампах тяжело, легко ошибиться </li></ul></ul><ul><ul><li>каша остается кашей </li></ul></ul><ul><ul><li>все равно приходится думать </li></ul></ul>
  16. 16. Features Code-driven development! Конфигурация - в код!   Features так или иначе умеют: типы нод, поля CCK, таксономия, imagecahe, роли и права, Views, Rules...
  17. 17. Features: экосистема <ul><ul><li>Features  </li></ul></ul><ul><ul><li>Ctools exportables </li></ul></ul><ul><ul><li>Strongarm - переменные   </li></ul></ul><ul><ul><li>Boxes - кастомные блоки (альтернатива стандартному add block)   </li></ul></ul><ul><ul><li>Context - блоки, breadcrumbs и т.д.   </li></ul></ul><ul><ul><li>Diff - инструмент для работы с различиями в состояниях feature </li></ul></ul>
  18. 18. Анатомия feature <ul><li>feature - это модуль </li></ul><ul><ul><li>feature_name.info - мета-информация, зависимости </li></ul></ul><ul><ul><li>feature_name.module - место для кастомного кода </li></ul></ul><ul><ul><li>feature_name.features.inc  </li></ul></ul><ul><ul><li>feature_name.install </li></ul></ul><ul><li>  </li></ul><ul><li>Фрагменты конфигурации: </li></ul><ul><ul><li>feature_name.context.inc </li></ul></ul><ul><ul><li>feature_name.features.content.inc </li></ul></ul><ul><ul><li>feature_name.views_default.inc </li></ul></ul><ul><ul><li>feature_name.features.user_permission.inc </li></ul></ul><ul><ul><li>... </li></ul></ul>
  19. 19. Возможные состояния feature <ul><li>Features сравнивает для feature: </li></ul><ul><ul><li>состояние кода (1) </li></ul></ul><ul><ul><li>предыдущее состояние кода (2) </li></ul></ul><ul><ul><li>актуальное состояние (обычно в БД) (3) </li></ul></ul><ul><li>  </li></ul><ul><li>В зависимости от разницы между ними: </li></ul><ul><ul><li>Default: (1) == (3) или (3) не существует, для обновления feature достаточно обновления кода </li></ul></ul><ul><ul><li>Overridden: (1)!=(3), для обновления feature нужно сделать revert </li></ul></ul><ul><ul><li>  Needs review: (1)!=(2)!=(3), для обновления нужно разбираться вручную </li></ul></ul><ul><ul><li>Rebuildable (для faux-exportables): (1)!=(3), (3)==(2) </li></ul></ul>
  20. 20. Workflow отдельно взятой feature <ul><li>Разработчик 1 </li></ul><ul><ul><li>Создание </li></ul></ul><ul><ul><li>Включение </li></ul></ul><ul><ul><li>Работа по изменению конфигурации </li></ul></ul><ul><ul><li>Обновление кода </li></ul></ul><ul><ul><li>commit, push </li></ul></ul><ul><li>  </li></ul><ul><li>Разработчик 2 </li></ul><ul><ul><li>pull </li></ul></ul><ul><ul><li>Установка/Обновление из кода </li></ul></ul><ul><ul><li>Конфигурация перенесена! </li></ul></ul>
  21. 21. Управление Features <ul><ul><li>Веб-интерфейс </li></ul></ul><ul><ul><li>Drush </li></ul></ul><ul><ul><ul><li>drush features (fl) - список всех доступных feature </li></ul></ul></ul><ul><ul><ul><li>drush features-export (fe) [feature name] [component list] - создание новой feature с указанными компонентами </li></ul></ul></ul><ul><ul><ul><li>drush features-update (fu) [feature name] - из БД в код </li></ul></ul></ul><ul><ul><ul><li>drush features-revert (fr) [feature name] - из кода в БД </li></ul></ul></ul><ul><ul><ul><li>drush features-diff (fd) [feature name] - различия между состоянием в кодe и в БД </li></ul></ul></ul>
  22. 22. Feature: без UI <ul><li>Создание </li></ul><ul><ul><li>feature_name.info: мета-информаци, зависимости и т.д. </li></ul></ul><ul><ul><li>feature_name.module: include_once('feature_name.features.inc'); </li></ul></ul><ul><ul><li>feature_name.features.inc </li></ul></ul><ul><ul><li>drush en feature_name </li></ul></ul><ul><ul><li>drush fu feature_name </li></ul></ul><ul><li>Добавление чего-нибудь </li></ul><ul><ul><li>Добавляем зависимость в .info (например: features[views][] = &quot;view_news&quot;) </li></ul></ul><ul><ul><li>drush fu feature_name </li></ul></ul>
  23. 23. Подумаем о других <ul><li>Изменения не сводятся только к конфигурации. Но feature - модуль, поэтому есть hook_install() и hook_update(). </li></ul><ul><li>  </li></ul><ul><ul><li>включение модулей </li></ul></ul><ul><ul><li>добавление ролей </li></ul></ul><ul><ul><li>добавление словарей </li></ul></ul><ul><ul><li>любой код </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><li>hook_update() - делимся с теми, кто работает параллельно </li></ul><ul><li>drush updatedb -y && drush cc all </li></ul><ul><li>hook_install() - делимся с новыми разработчиками </li></ul>
  24. 24. Controller Feature: центр управления всем остальным Включаются все остальные features: dependencies[] = &quot;feature_name_1&quot; dependencies[] = &quot;feature_name_2&quot; ...   hook_update и hook_install - отражают общие изменения в состоянии системы function feature_controller_update_6003() { $return = array(); $modules = array('feature_name_1', 'feature_name_2'); drupal_install_modules($modules); $return[] = array('success' => TRUE, 'query' => 'Enabling some cool features'); return $return; }
  25. 25. Features: собираем все вместе <ul><ul><li>project.profile: включаем необходимые модули и Controller Feature </li></ul></ul><ul><ul><li>Работаем: пишем код, добавляем модули, меняем структуру и настройки, разрабатываем и подключаем новые features. </li></ul></ul><ul><ul><li>Поддерживаем актуальность .install Controller Feature (пишем код вручную). </li></ul></ul><ul><ul><li>Поддерживаем актуальность кода остальных features (drush fu feature_name) </li></ul></ul><ul><ul><li>Вся история в репозитории в виде кода! </li></ul></ul>
  26. 26. Features <ul><li>Хорошо: </li></ul><ul><ul><li>с кодом легко работать в системе контроля версий </li></ul></ul><ul><ul><li>законченные куски функционала, которые можно использовать повторно </li></ul></ul><ul><ul><li>красиво </li></ul></ul><ul><li>  </li></ul><ul><li>Плохо:  </li></ul><ul><ul><li>требует больше внимания к вынесению изменений в код  </li></ul></ul><ul><ul><li>на самом деле сложно правильно разделить на куски из-за зависимостей </li></ul></ul><ul><ul><li>не все компоненты exportable (решаемо) </li></ul></ul>
  27. 27. Credits <ul><ul><li>http://nuvole.org/blog/code-driven-development </li></ul></ul><ul><ul><li>http://developmentseed.org/blog </li></ul></ul>
  28. 28. Контакты Анна Федорук [email_address]   http://devteam.sterno.ru/ @sternodevteam
  29. 29. Генеральный спонсор и организатор конференции DrupalConf 2011 При поддержке:
  30. 30. Спонсоры Информационные спонсоры Сайт конференции

×