2013-03-21 3 views
31

Когда новый разработчик присоединяется к команде, или Jenkins запускает полную сборку, мне нужно создать новый virtualenv. Я часто нахожу, что настройка virtualenv с помощью Pip и большое количество (более 10) требований занимает очень много времени, чтобы установить все из PyPI. Часто она не совсем с:PyPI медленный. Как запустить собственный сервер?

Downloading/unpacking Django==1.4.5 (from -r requirements.pip (line 1)) 
Exception: 
Traceback (most recent call last): 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/basecommand.py", line 107, in main 
    status = self.run(options, args) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/commands/install.py", line 256, in run 
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1018, in prepare_files 
    self.unpack_url(url, location, self.is_download) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1142, in unpack_url 
    retval = unpack_http_url(link, location, self.download_cache, self.download_dir) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 463, in unpack_http_url 
    download_hash = _download_url(resp, link, temp_location) 
    File "/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 380, in _download_url 
    chunk = resp.read(4096) 
    File "/usr/lib64/python2.6/socket.py", line 353, in read 
    data = self._sock.recv(left) 
    File "/usr/lib64/python2.6/httplib.py", line 538, in read 
    s = self.fp.read(amt) 
    File "/usr/lib64/python2.6/socket.py", line 353, in read 
    data = self._sock.recv(left) 
timeout: timed out 

Я знаю --use-mirrors флага Пипа, а иногда и люди в моей команде работали вокруг с помощью --index-url http://f.pypi.python.org/simple (или другого зеркала), пока они не зеркало, которое реагирует на своевременном мода. Мы в Великобритании, но в Германии есть зеркало PyPI, и у нас нет проблем с загрузкой данных с других сайтов.

Итак, я ищу способы отразить PyPI внутри нашей команды.

варианты я посмотрел на это:

  1. Запуск свой собственный экземпляр PyPi. Там же официальная реализация PyPI: CheeseShop а также несколько реализаций третьих сторон, таких как: djangopypi и pypiserver (см примечание)

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

  2. Запуск зеркала PyPI с pep381client или pypi-mirror.

    Похоже, что это может сработать, но для этого требуется, чтобы мое зеркало загрузило все, начиная с PyPI. Я установил тестовый экземпляр pep381client, но скорость загрузки варьируется от 5 Кбит/с до 200 Кбит/с (бит, а не байтов). Если там где-то копия полного архива PyPI, мне понадобится несколько недель, чтобы иметь полезное зеркало.

  3. Использование прокси-сервера PyPI, такого как yopypi.

    Это не имеет значения сейчас, когда http://pypi.python.org состоит из several geographically distinct servers.

  4. Копирование виртуального пространства между разработчиками или размещение folder of the current project's dependencies.

    Это не масштабируется: у нас есть несколько различных проектов Python, зависимости которых изменяются (медленно) со временем. Как только изменения любого проекта будут изменены, эта центральная папка должна быть обновлена, чтобы добавить новые зависимости. Копирование виртуального файла хуже, чем копирование пакетов, хотя, поскольку любые пакеты Python с модулями C необходимо скомпилировать для целевой системы. Наша команда имеет пользователей Linux и OS X.

    (Это по-прежнему выглядит как самый лучший вариант плохого сгустка.)

  5. Использование интеллектуального кэширования PyPI прокси: collective.eggproxy

    Это кажется, что это будет очень хорошим решением, но the last version on PyPI is dated 2009 и обсуждает mod_python.

Что делают другие крупные команды Python? Какое лучшее решение для быстрой установки одного и того же набора пакетов python?

Сноска:

+1

Лично, когда я был в ситуации, когда мне нужно было написать (повторное) создание виртуального, я только что построил файлы .egg для пакетов, которые я хотел, и проверил их в репо вместе со сценарием для создания virtualenv. Однако я не утверждаю, что являюсь частью большой команды python. – FatalError

ответ

26

У вас есть файловая система общего назначения?

Потому что я использовал бы настройку кеша пипа. Это довольно просто. Например, создайте папку с именем pip-cache в/mnt.

mkdir /mnt/pip-cache 

Тогда каждый разработчик будет положить следующую строку в их пип конфигурации (Unix = $ HOME/.pip/pip.conf, победа =% HOME% \ пип \ pip.ini)

[global] 
download-cache = /mnt/pip-cache 

Он по-прежнему проверяет PyPi, ищет последнюю версию. Затем проверяет, находится ли эта версия в кеше. Если это так, он будет устанавливать его оттуда. Если он не загружает его. Хранит его в кеше и устанавливает его. Таким образом, каждый пакет будет загружен только один раз за новую версию.

+1

Это выглядит как фантастический вариант. Ваш пример pip.conf неверен, хотя - не должно быть отступа или Pip умирает с 'ConfigParser.ParsingError: Файл содержит ошибки анализа. Я бы отредактировал его сам, но SO не позволит мне делать небольшие изменения. –

+0

Исправлено! Спасибо, Уилфред. – aychedee

+0

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

-1

Настройка локальный сервер затем изменить хост файл на локальном компьютере, чтобы перезаписать фактический URL, чтобы вместо того, чтобы указать на поэтому локальный сервер пропускает стандартный DNS. Затем, если вы закончили, удалите строку в файле хоста.

Или, я полагаю, вы можете найти URL-адрес в pip и изменить его.

9

Хотя это не решит вашу проблему PyPI, предоставление встроенных виртуальных серверов разработчикам (или развертываниям) может быть выполнено с помощью Terrarium.

Используйте terrarium, чтобы скомпилировать, сжать и сохранить virtualenvs. Вы можете хранить их локально или даже store them on S3. Из документации на GitHub:

$ pip install terrarium 
$ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt 

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

При последующих установках для тех же требований, которые задают один и тот же каталог-хранилище, террариум будет копировать и извлекать сжатый архив из/mnt/storage.

Для отображения точно, как террариум будет назвать архив, вы можете выполнить следующую команду:

$ terrarium key requirements.txt more_requirements.txt 
x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1 
+0

Спасибо, я не знал о Terrarium. Он справляется с делом между пользователями OS X и Linux? У нас есть чистые модули python и C, поэтому я сомневаюсь, что скомпилированные пакеты будут кросс-платформенными. –

+0

Мне очень жаль, что я не знал. :(У меня нет Mac (хотя мне бы хотелось, чтобы у него был один). Если я получу шанс, я посмотрю, что я могу понять. Я только начал использовать этот пакет с PyCon 2013 (слышал об этом и встретил там dev). –

+3

. Автор террариума. Скомпилированные пакеты не будут кросс-платформенными, террариум не решает эту проблему. Если ваши требования не часто меняются, это просто означает, что первый пользователь каждого типа платформы, который запускает команду, будет строителем. Все последующие командные бегуны (до изменения других требований) вытащит предварительно встроенную версию. Звучит так, как террариум будет простым в использовании интерфейсом команд за то, что вы уже будете делать вручную. Если вы столкнетесь с любыми проблемами, которые мешают вам использовать его таким образом, дайте мне знать. –

3

посмотрите на Дэвида Wolever-х pip2pi. Вы можете просто настроить задание cron, чтобы сохранить зеркало в пакетах вашей компании или команды, которые вам нужны, а затем указать свои точки на свое внутреннее зеркало.

7

Я недавно установил devpi в конфигурацию Vagrant моей команды разработчиков, так что ее кеш-память живет в файловой системе хоста. Это позволяет каждой виртуальной машине иметь собственный демон devpi-сервера, который он использует в качестве индекса-url для virtualenv/pip. Когда виртуальные машины уничтожаются и повторно просматриваются, пакеты не нужно загружать снова и снова. Каждый разработчик загружает их один раз для создания своего локального кеша до тех пор, пока они живут в файловой системе хоста.

У нас также есть внутренний индекс PyPi для наших частных пакетов, который в настоящее время является только каталогом, обслуживаемым Apache. В конечном счете, я собираюсь преобразовать это в прокси-сервер devpi, так что наш сервер сборки также будет поддерживать кеш-память для наших зависимостей Python в дополнение к размещению наших частных библиотек. Это создаст дополнительный буфер между нашей средой разработки, производственными развертываниями и публичным PyPi.

Это, кажется, самое надежное решение, которое я нашел для этих требований на сегодняшний день.

+2

Я искал личные/private pypi servers и должны подтвердить, что devpi кажется лучшим из них. Автор devpi создал также pytest и tox, поэтому ожидаем найти очень хорошую поддержку для разработки и тестирования. –