Какова наилучшая практика для обработки системной информации при управлении версиями? - PullRequest
6 голосов
/ 07 января 2009

Я новичок в управлении версиями, поэтому я прошу прощения, если есть известное решение для этого. В частности, для этой проблемы я использую git, но мне любопытно, как с этим справиться для всех систем контроля версий.

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

Я мог бы либо:

  1. Переконфигурируйте сервер разработки, чтобы использовать тот же путь, что и рабочий
  2. Редактировать два экземпляра каждый раз, когда производство обновляется.

Мне не нравится # 1, потому что я бы предпочел сохранить гибкость приложения для любых будущих изменений. Мне не нравится №2, потому что если я начну разрабатывать на втором сервере разработки с третьим путем, мне придется менять это для каждого коммита и обновления.

Какой лучший способ справиться с этим? Я думал о:

  1. Использование пользовательских ключевых слов и раскрытие переменных (например, установка свойства $ PATH $ в свойствах управления версиями и расширение его во всех файлах). Git не поддерживает это, потому что это будет огромный удар по производительности.

  2. Использование хуков после обновления и предварительной фиксации. Возможно, вероятное решение для git, но каждый раз, когда я проверял состояние, он сообщал об изменении двух файлов. Не очень чистый.

  3. Извлечение пути из файла конфигурации вне контроля версий. Тогда я должен был бы иметь файл конфигурации в одном месте на всех серверах. Может быть, просто начать с того же пути.

Есть ли простой способ справиться с этим? Я слишком обдумал это?

Ответы [ 6 ]

12 голосов
/ 07 января 2009

НИКОГДА не используйте данные конфигурации жесткого кода, такие как пути файловой системы, и не пытайтесь сопоставить несколько развертываний. Это темная сторона, где много страданий.

Я считаю полезным и простым создание моих систем для поддержки нескольких конфигураций, и я регулярно добавляю файлы конфигурации в систему управления исходным кодом параллельно, но производственные данные запутаны (без реальных паролей), а разработки - шаблонные checkout не может перезаписать конфигурацию разработчика). Код всегда упакован в независимой от конфигурации манере - один и тот же двоичный файл может быть развернут где угодно.

К сожалению, большинство языковых платформ / платформ разработки не поддерживают это (в отличие от Ruby on Rails). Поэтому вы должны строить его самостоятельно, в разной степени.

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

Я считаю, что ОЧЕНЬ полезно разрабатывать приложения, чтобы иметь возможность сообщать об их конфигурации и проверять ее. В большинстве случаев отсутствующий или недействительный элемент конфигурации должен привести к прерыванию приложения. Насколько это возможно, выполнить эту проверку (и прервать) при запуске = быстро потерпеть неудачу. Жесткий код по умолчанию только тогда, когда они могут надежно использоваться.

Абстрагируйте доступ к конфигурации, чтобы большая часть приложения не знала, откуда оно и как оно обрабатывается. Я предпочитаю создавать Config классы, которые предоставляют настраиваемые параметры в виде отдельных свойств (строго типизированных при необходимости), а затем я «внедряю» их в классы приложений через IOC. Не заставляйте все ваши классы приложений напрямую вызывать необработанную структуру конфигурации выбранной вами платформы; абстракция - твой друг.

В большинстве организаций корпоративного класса (Fortune 500) никто не видит конфигурации производственной (или даже тестовой) среды, кроме группы администраторов для этой среды. Файлы конфигурации никогда не развертываются в выпуске, они редактируются вручную командой администраторов. Соответствующие файлы конфигурации, конечно же, никогда не проверяются в исходном коде рядом с кодом. Административная команда может использовать контроль версий, но это их собственный закрытый репозиторий. Sarbanes-Oxley и аналогичные правила также имеют тенденцию строго запрещать разработчикам иметь общий доступ к (почти) производственным системам или любым конфиденциальным данным конфигурации. Будьте внимательны при разработке вашего подхода.

Наслаждайтесь.

4 голосов
/ 07 января 2009

Вы всегда должны отделять историзацию (для чего нужен Source Control) от развертывания.

Развертывание включает в себя:

  • идентифицированный набор данных (для которого пригодится тег или метка, предоставленные СКМ)
  • процесс, манипулирующий этими данными (по крайней мере, для их копирования в нужном месте, но также для расширения некоторых сжатых файлов и т. Д.)

Среди различных операций, которые выполняет развертывание, вы должны включить фазу de-variabilization .

Переменная - это ключевое слово, представляющее все, что может измениться в зависимости от вашей платформы развертывания (например, ПК для непрерывной интеграции, Linux для базовой омологации, старый Solaris8 для подготовки к производству и Full F15K Solaris10 с зонами. для производства: он короткий, он может сильно варьироваться). См. ответ Джонатана Леффлера для практических примеров.

Переменная может представлять путь, версию JVM, некоторые настройки JVM и т. Д., И то, что вы помещаете в SCM, должно быть данными с переменными, а не жестко заданными настройками.

Следующим шагом будет включение в ваш исполняемый файл способа обнаружения любых изменений в файлах настроек для обновления при запуске некоторых параметров (исключая последовательность «выключение / изменение настроек / перезапуск»).
Это означает, что они являются двумя типами переменных развертывания :

  • статические единицы (которые никогда не изменятся),
  • динамические единицы (которые в идеале следует учитывать во время сеанса во время выполнения)
2 голосов
/ 07 января 2009

Избегайте абсолютных путей, где это возможно.

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

Самый простой подход работает для меня: иметь «config.live» и «config» настроен для разработки. Во время развертывания просто переместите config.live в config, и все в порядке. Для более сложных конфигураций может потребоваться подкаталог для каждой конфигурации.

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

Что-то более сложное почти наверняка вызовет больше проблем, чем решит.

1 голос
/ 07 января 2009

Используйте SCM, такой как Git для контроля версий, и инструмент развертывания , например Capistrano для развертывания . Хотя Capistrano изначально создавался для Ruby on Rails, его вполне можно использовать для других сред и языков.

Главное, что конкретный инструмент развертывания даст вам всю гибкость для автоматизации таких вещей, как пути на обоих концах.

0 голосов
/ 07 января 2009

Похоже, ваш рабочий код является полным репозиторием git, а для обновления производства вы делаете git pull? Возможно, вы захотите попробовать отдельный процесс сборки, который проверяет код из вашего хранилища и создает чистую сборку (без папки .git). Вы можете иметь конфигурационные файлы для конкретной среды, которые содержат ваши пути, которые копируются или создаются вместе с ним.

0 голосов
/ 07 января 2009

Мне нравится, как Ruby on Rails решает эту проблему - специфические для среды файлы конфигурации. Rails поддерживает соединения с базами данных разработки, тестирования и производства - управляется конфигурацией в файле database.yml. Вот запись в блоге о создании других параметров конфигурации, относящихся к среде, она предназначена для Rails, но может дать вам некоторые идеи о том, как сделать что-то подобное для вашей среды. http://usablewebapps.com/2008/09/yaml-and-custom-config-for-rails-projects/

...