惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
D
Docker
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Recent Announcements
Recent Announcements
GbyAI
GbyAI
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
L
LangChain Blog
A
About on SuperTechFans
M
MIT News - Artificial intelligence
B
Blog

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
如何使用 devpi 搭建 PyPI Server
微信公众号 · 2018-03-04 · via 陈少文的网站

Please enable Javascript to view the contents

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

1. PyPI Server 比较

PyPI ServerPyPI 代理镜像本地缓存单元测试系统测试搜索
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

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
[chenshaowen@localhost ~]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=myemail@example.com,创建新用户
  • 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. 参考


微信公众号