У нас есть несколько приложений Python 2.6, работающих в Linux. Некоторые из них - это веб-приложения Pylons, другие - просто длительные процессы, которые мы запускаем из командной строки с помощью nohup
. Мы также используем virtualenv
, как в разработке, так и в производстве. Каков наилучший способ развертывания этих приложений на рабочем сервере?
В разработке мы просто получаем исходное дерево в любой каталог, настраиваем virtualenv и запускаем - достаточно просто. Мы могли бы сделать то же самое в производстве, и, возможно, это действительно самое практичное решение, но просто кажется, что работать в svn update
просто не так. Мы также пробовали fab
, но он просто никогда не работает в первый раз. Для каждого приложения что-то не так. Мне кажется, что весь процесс слишком тяжелый, учитывая то, что мы пытаемся достичь, в корне очень прост. Вот что мы хотим от процесса развертывания.
- Мы должны запустить одну простую команду, чтобы развернуть обновленную версию приложения. (Если начальное развертывание требует немного дополнительной сложности, это прекрасно.)
- Когда мы запускаем эту команду, она должна скопировать определенные файлы, либо из репозитория Subversion, либо из локальной рабочей копии, в указанную "среду" на сервере, что, вероятно, означает другой virtualenv. У нас есть как промежуточная, так и производственная версия приложений на одном сервере, поэтому их нужно как-то сохранить отдельно. Если он устанавливает в site-пакеты, это тоже хорошо, если это работает.
- У нас есть некоторые файлы конфигурации на сервере, которые должны быть сохранены (т.е. не перезаписаны или не удалены процессом развертывания).
- Некоторые из этих приложений импортируют модули из других приложений, поэтому они должны иметь возможность ссылаться друг на друга как пакеты как-то. Это та часть, с которой у нас были самые проблемы! Меня не волнует, работает ли он через относительный импорт, сайт-пакеты или что-то еще, если он надежно работает как в разработке, так и в производстве.
- В идеале процесс развертывания должен автоматически устанавливать внешние пакеты, от которых зависят наши приложения (например, psycopg2).
Это действительно так! Как трудно это быть?