Wil*_*hes 38 python caching pip mirroring pypi
当一个新的开发人员加入团队,或者Jenkins运行完整的构建时,我需要创建一个新的virtualenv.我经常发现使用Pip和大量(超过10个)需求设置virtualenv需要很长时间才能从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
Run Code Online (Sandbox Code Playgroud)
我知道Pip的--use-mirrors旗帜,有时我团队中的人通过使用--index-url http://f.pypi.python.org/simple(或另一面镜子)来解决问题,直到他们有一个及时响应的镜子.我们在英国,但在德国有一个PyPI镜像,我们在从其他网站下载数据时没有问题.
所以,我正在寻找为我们的团队内部镜像PyPI的方法.
我看过的选项是:
运行我自己的PyPI实例.有官方的PyPI实现:CheeseShop以及几个第三方实现,例如:djangopypi和pypiserver(见脚注)
这种方法的问题在于我对文件上传的完整PyPI功能不感兴趣,我只想镜像它提供的内容.
使用pep381client或pypi-mirror运行PyPI 镜像.
看起来它可以工作,但它需要我的镜像首先从PyPI下载所有内容.我已经设置了pep381client的测试实例,但我的下载速度在5 Kb/s和200 Kb/s之间变化(位,而不是字节).除非在某个地方有完整的PyPI存档的副本,否则我需要数周时间才能拥有一个有用的镜像.
使用PyPI循环代理,例如yopypi.
现在这与http://pypi.python.org本身由几个地理位置不同的服务器组成无关.
在开发人员之间复制virtualenv,或托管当前项目依赖项的文件夹.
这不会扩展:我们有几个不同的Python项目,其依赖性随着时间的推移而变化(缓慢).只要任何项目的依赖项发生更改,就必须更新此中央文件夹以添加新的依赖项.复制virtualenv比复制软件包更糟糕,因为需要为目标系统编译任何带有C模块的Python软件包.我们的团队拥有Linux和OS X用户.
(这看起来仍然是坏群的最佳选择.)
使用智能PyPI缓存代理:collective.eggproxy
这似乎是一个非常好的解决方案,但PyPI上的最后一个版本是2009年,并讨论了mod_python.
其他大型Python团队做了什么?快速安装同一套python软件包的最佳解决方案是什么?
脚注:
ayc*_*dee 28
你有共享文件系统吗?
因为我会使用pip的缓存设置.这很简单.例如,在/ mnt中创建一个名为pip-cache的文件夹.
mkdir /mnt/pip-cache
Run Code Online (Sandbox Code Playgroud)
然后每个开发人员将以下行放入他们的pip配置中(unix = $ HOME/.pip/pip.conf,win =%HOME%\ pip\pip.ini)
[global]
download-cache = /mnt/pip-cache
Run Code Online (Sandbox Code Playgroud)
它仍然检查PyPi,寻找最新版本.然后检查该版本是否在缓存中.如果是这样,它从那里安装它.如果没有,则下载它.将其存储在缓存中并进行安装.因此,每个新版本只会下载一次.
虽然它无法解决您的PyPI问题,但可以使用Terrarium将构建的virtualenvs交给开发人员(或部署).
使用玻璃容器打包,压缩和保存virtualenvs.您可以在本地存储它们甚至将它们存储在S3上.从GitHub上的文档:
$ pip install terrarium
$ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt
Run Code Online (Sandbox Code Playgroud)
在构建新环境后,terrarium将归档并压缩环境,然后将其复制到storage-dir指定的位置.
在指定相同storage-dir的相同需求集的后续安装中,terrarium将从/ mnt/storage复制并解压缩压缩存档.
要准确显示玻璃容器如何命名存档,可以运行以下命令:
$ terrarium key requirements.txt more_requirements.txt
x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1
Run Code Online (Sandbox Code Playgroud)
我最近在我的开发团队的Vagrant配置中安装了devpi,使其包缓存存在于主机的文件系统中.这允许每个VM拥有自己的devpi-server守护程序,它用作virtualenv/pip的index-url.当VM被销毁并重新配置时,不必一次又一次地下载软件包.只要它们存在于主机的文件系统上,每个开发人员都会下载一次以构建本地缓存.
我们的私有软件包还有一个内部PyPi索引,它目前只是Apache提供的目录.最终,我将把它转换为devpi代理服务器,因此除了托管我们的私有库之外,我们的构建服务器还将为我们的Python依赖项维护包缓存.这将在我们的开发环境,生产部署和公共PyPi之间创建一个额外的缓冲区.
这似乎是迄今为止我发现这些要求的最强大的解决方案.
| 归档时间: |
|
| 查看次数: |
13454 次 |
| 最近记录: |