13 июля 2012 г.

Копируем виртуальные окружения с помощью virtualenv-clone

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

Для начала еще раз поясню саму идею. Есть репозиторий, есть деплоймент сервис, который для каждого коммита может генерировать код/базы данных/бутстрап проекта/что-угодно и выдавать на гора результат в виде готового для доступа URL-адреса. Для вытаскивания кода и расположения его в определенной директории могут использоваться разные подходы, как впрочем и для работы с базой данных. Но бутстрап проекта для уже готовой базы данных хочется сделать просто:

$ virtualenv --distribute --system-site-packages env
$ . env/bin/activate
(env)$ pip install -r requirements.txt
(env)$ deactivate
$ cp project/settings_local.py{.deploy,}

И вроде бы все работает, но чем больше становится зависимостей и чем больше коммитов приходит на деплой тем система начинает работать все медленней и медленней и постоянно задыхается на этапе pip install -r requirements.txt. Не хорошо!

Потом появляется решение: надо просто сделать основное виртуальное окружение, а потом для каждого коммита копировать его и накатывать уже свежие изменения файла зависимостей и вуаля. Но вместе с решением приходит и вопрос, а как-то это реализовать? Чтоб оно работало то?

Первая идея была очень интересной: а что если новое виртуальное окружение создавать в активированом основном виртуальном окружении? YO DAWG, не иначе. В итоге получилось так же если б мы просто создали новое виртуальное окружение, локальные зависимости основного окружения не были доступны в новом окружении.

Второй идеей было использование --relocatable опции для основного окружения. Результат: после копирования окружения и установки зависимостей, зависимости обновлялись и в основном окружении, а это нам совсем не нужно.

Третьей идеей было таки спросить у гугла "python virtualenv copy" на что гугл выдал мне ссылку на virtualenvwrapper, откуда я путем быстрого рисёрча исходников попал на virtualenv-clone и радостно захлопал в ладоши - то, что нужно!

Так что задача полноценного копирования виртуальных окружений решается просто:

$ sudo pip install virtualenv-clone
$ virtualenv-clone env_base env_new

зы. Еще одним решением для ускорения установки зависимостей была, есть и остается опция --download-cache для pip'а. Но хотелось именно решить вопрос с копированием виртуальных окружений.

зыы. Если кого интересует, весь процесс поиска решения доступен в гисте на гитхабе. Конечно, комментарии и возражения как всегда приветствуются!

blog comments powered by Disqus