Please enable Javascript to view the contents

如何使用 devpi 搭建 PyPI Server

 ·  ☕ 3 分钟

使用 pip 命令安装 Python 包时,默认去 https://pypi.python.org/simple/ 源查找相应的包,下载并安装。但是在内网环境,或者需要发布一些私有包提供给指定用户时,就需要搭建自己的 PyPI Server。本篇主要记录使用 devpi 工具搭建 PyPI Server 源的过程,以及记录一些常用命令。

1. PyPI Server 比较

PyPI Server PyPI 代理镜像 本地缓存 单元测试 系统测试 搜索
devpi 支持 支持 ★★★★ ★★★★★ 支持 Web + XML RPC
DjangoPyPI 支持 不支持 支持 Web + XML RPC
chishop 不支持 不支持 不支持
pypiserver 支持 不支持 ★★★★★ 不支持
Cheese Shop 不支持 不支持 ★★ 支持 Web + XML RPC
localshop 支持 支持 ★★★★ 只支持 XML RPC
mypypi 不支持 不支持 ★★ 不支持
proxypypi 支持 支持 不支持
Flask-Pypi-Proxy 支持 支持 不支持

2. devpi 特有的功能

2.1 索引继承

pypiserver 等只支持两个索引: 私有的索引和公有的索引。 在私有索引上找不到 Python 包时, 就会去公有索引上找。 devpi 对这一功能做了扩展, devpi 可以支持多个索引。同时,新索引可以继承之前的索引,这在维护多版本系统上十分有用。

2.2 支持集群部署

支持一台或多台服务器部署,来加速访问。还支持通过 json 接口,实时监控集群的状态。

2.3 支持导入导出功能

支持导出服务器状态,并在必要时重新导回服务器,恢复服务器状态。

2.4 Jenkins 集成

支持给索引设置 Jenkins 触发器,可以使用 tox 自动测试上传的包。

3. 搭建 devpi server

devpi 包含三个组件:

  • devpi-server,是 devpi server 核心组件,提供镜像与缓存功能
  • devpi-web,提供 Web 界面与查询功能
  • devpi-client,命令行工具, 提供包上传等与服务器交互的功能

3.1 安装 devpi

1
pip install devpi

3.2 启动 devpi server 服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[[email protected] ~]devpi quickstart
-->  /home/chenshaowendevpi-server --version 
-->  /home/chenshaowendevpi-server --start --init 
...
-->  /home/chenshaowendevpi index -c dev 
http://localhost:3141/chenshaowen/dev:
  type=stage
  bases=
  volatile=True
  acl_upload=chenshaowen
  acl_toxresult_upload=:ANONYMOUS:
  mirror_whitelist=
  pypi_whitelist=

-->  /home/chenshaowendevpi use dev 
current devpi index: http://localhost:3141/chenshaowen/dev (logged in as chenshaowen)
/home/chenshaowen/.pip/pip.conf: no config file exists
~/.pydistutils.cfg     : no config file exists
~/.buildout/default.cfg: no config file exists
always-set-cfg: no
COMPLETED!  you can now work with your 'dev' index
  devpi install PKG   # install a pkg from pypi
  devpi upload        # upload a setup.py based project
  devpi test PKG      # download and test a tox-based project 
  devpi PUSH ...      # to copy releases between indexes
  devpi index ...     # to manipulate/create indexes
  devpi use ...       # to change current index
  devpi user ...      # to manipulate/create users
  devpi CMD -h        # help for a specific command
  devpi -h            # general help
docs at http://doc.devpi.net

通过 http://localhost:3141 访问页面:

可以看到新建了两个索引,一个是 root 的,一个是当前操作用户的。通过命令,可以查看索引信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
devpi  getjson /root
{
    "result": {
        "indexes": {
            "pypi": {
                "mirror_url": "https://pypi.python.org/simple/", 
                "mirror_web_url_fmt": "https://pypi.python.org/pypi/{name}", 
                "title": "PyPI", 
                "type": "mirror", 
                "volatile": false
            }
        }, 
        "username": "root"
    }, 
    "type": "userconfig"
}

由于 root 的索引配置了 mirror_url ,相当于在本地建立了一个附加的 Pypi 源, https://pypi.python.org/simple/

另外一个索引 chenshaowen/dev,则仅能通过上传来新增包。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
devpi  getjson /chenshaowen
{
    "result": {
        "indexes": {
            "dev": {
                "acl_toxresult_upload": [
                    ":ANONYMOUS:"
                ], 
                "acl_upload": [
                    "chenshaowen"
                ], 
                "bases": [], 
                "mirror_whitelist": [], 
                "pypi_whitelist": [], 
                "type": "stage", 
                "volatile": true
            }
        }, 
        "username": "chenshaowen"
    }, 
    "type": "userconfig"
}

常用 devpi-server 服务端操作命令:

1
2
3
4
5
devpi-server --init
devpi-server --start
devpi-server --stop
devpi-server --status
devpi-server --log

3.3 基本 devpi client 操作

devpi 是通过 client 与 devpi server 进行交互配置的。下面是一些基本的交互操作命令:

  • devpi login root –password,登陆,首次启动密码为空
  • devpi user -m root password=123,修改密码
  • devpi logoff,退出登陆
  • devpi user -c myuser password=mypassword [email protected],创建新用户
  • devpi login myuser –password=mypassword
  • devpi index -c dev bases=root/pypi 创建索引
  • devpi use chenshaowen/dev,使用索引
  • devpi upload ,上传包,需要在 setup.py 所在目录下执行
  • devpi upload –with-docs,上传包,支持 sphinx 创建的文档,需要 docs 目录和 setup.py 在同个目录下
  • devpi index myuser/dev mirror_url = “https://pypi.doubanio.com/simple/" , 当仓库中不存在包时,从豆瓣下载包缓存到本地(默认是从官方源 https://pypi.python.org/simple/ 下载)
  • devpi push,将包从一个索引推送到另外一个索引

通过 devpi 命令可以新建索引,对索引中的包和权限进行管理,具体操作步骤可以参考官方文档

4. 客户端配置

在服务器上运行 devpi server 之后,还需要通过 Nginx 反向代理对外提供服务。具体配置可以参考官方文档。这里以 Nginx 已经配置了 devpi.example.com 域名为例:

本地新建 ~/.pip/pip.conf 文件,内容如下:

1
2
3
4
5
[global]
timeout = 60
index-url = http://devpi.example.com/root/pypi/+simple/
[install]
trusted-host = devpi.example.com

这样就将 pip 默认的安装源指向了 devpi server。

5. 参考


微信公众号
作者
微信公众号