2010-02-10 3 views
38

Просто интересно, как люди разворачивают свои проекты Django в сочетании с virtualenvДжанго и VirtualEnv развитие/развертывание Best Practices

  • Более конкретно, как вы держите ваши производственные virtualenv-х синхронизируется правильно с вашей машиной?

Я использую Git для ВСМА, но у меня нет моего virtualenv внутри мерзавца репо - я должен, или, что лучше всего использовать пип заморозить, а затем заново создать среду на сервере, используя выход замораживания ? (Если вы сделаете это, не могли бы вы описать шаги, - я нахожу очень мало хорошую документацию на разморозка процесса - это что-то вроде pip install -r freeze_output.txt возможно?)

ответ

21

Я просто установил что-то подобное на работе, используя pip, Fabric и git. Поток в основном, как это, и заимствует из this script:

  1. В нашем исходном дереве, мы сохраняем файл requirements.txt. Мы будем поддерживать это вручную.
  2. Когда мы создаем новый выпуск, скрипт Fabric создает архив на основе любого дерева, которое мы передаем.
  3. Ткань найдет SHA для того, что мы используем с git log -1 --format=format:%h TREEISH. Это дает нам SHA_OF_THE_RELEASE
  4. Ткань получит последний SHA для нашего файла требований с git log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt. Это выплескивает короткую версию хеша, например 1d02afc, которая является SHA для этого файла для этой конкретной версии.
  5. Затем скрипт Fabric заглянет в каталог, в котором наши виртуальные имена хранятся на удаленных хостах.
    1. Если не директория с именем 1d02afc, создается новая virtualenv и установка с pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt
    2. Если является существующий path/to/venv/1d02afc, ничего не делается

Маленькая магия часть этого пропускает любые древовидные вы хотите git, и имея это сделать упаковку (из ткани). Используя git archive my-branch, git archive 1d02afc или что-то еще, я гарантированно получаю правильные пакеты, установленные на моих удаленных компьютерах.

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

+0

Ссылка не действительна + ( –

4

Я использую этот bootstrap.py: http://github.com/ccnmtl/ccnmtldjango/blob/master/ccnmtldjango/template/bootstrap.py

которая ожидает это каталог, называемый «требованиями», который выглядит примерно так: http://github.com/ccnmtl/ccnmtldjango/tree/master/ccnmtldjango/template/requirements/

В файле apps.txt есть файл libs.txt (в который входит apps.txt - я просто хочу, чтобы приложения django были отделены от других модулей python) и src, который содержит фактические файлы.

Когда запускается ./bootstrap.py, он создает виртуальный диск (протирая предыдущий, если он существует) и устанавливает все из него/apps.txt в него. В любом случае я ничего не устанавливаю в virtualenv. Если я хочу включить новую библиотеку, я поставил tarball в требования/src /, добавлю строку в один из текстовых файлов и снова запустил ./bootstrap.py.

bootstrap.py и требования проверяются в контроле версий (также копия pip.py, поэтому мне даже не нужно иметь установленную систему в любом месте). Сам virtualenv не является. Сценарии, которые у меня есть, которые выталкивают на производство, запускают ./bootstrap.py на рабочем сервере каждый раз, когда я нажимаю. (bootstrap.py также идет на несколько длин, чтобы убедиться, что он придерживается Python 2.5, так как это то, что мы имеем на производственных серверах (Ubuntu Hardy), а моя машина dev (Ubuntu Karmic) по умолчанию использует Python 2.6, если вы не будете осторожны)

+1

Ссылки в этом ответе разбиты. Пожалуйста, вы можете исправить ситуацию? – Kev

+1

Ссылки обновляются. Благодарю. – thraxil