注:该文的原文是 Quickstart: uploading, testing, pushing releases,来自于 devpi 的官方文档。html
该快速入门文档将引导你为你的 Python 包设置完成一个独立的 pypi 发布上传,测试和 staging 系统。python
我想在个人笔记本上运行完整的 devpi 系统:linux
pip install -U devpi
这将安装 devpi-client
和 devpi-server
这两个 pypi 包。json
devpi quickstart
命令在你本地机器上执行一些基础的初始化步骤:服务器
http://localhost:3141
访问devpi
来链接最新启动的 devpi 服务让咱们运行 quickstart 命令来触发一系列的其余 devpi 命令:网络
$ devpi quickstart --> $ devpi-server --start 2014-09-04 15:12:19,311 INFO NOCTX DB: Creating schema 2014-09-04 15:12:19,353 INFO [Wtx-1] setting password for user u'root' 2014-09-04 15:12:19,353 INFO [Wtx-1] created user u'root' with email None 2014-09-04 15:12:19,353 INFO [Wtx-1] created root user 2014-09-04 15:12:19,353 INFO [Wtx-1] created root/pypi index 2014-09-04 15:12:19,367 INFO [Wtx-1] fswriter0: committed: keys: u'.config',u'root/.config' starting background devpi-server at http://localhost:3141 /tmp/home/.devpi/server/.xproc/devpi-server$ /home/hpk/venv/0/bin/devpi-server process u'devpi-server' started pid=841 devpi-server process startup detected logfile is at /tmp/home/.devpi/server/.xproc/devpi-server/xprocess.log --> $ devpi use http://localhost:3141 using server: http://localhost:3141/ (not logged in) no current index: type 'devpi use -l' to discover indices ~/.pydistutils.cfg : no config file exists ~/.pip/pip.conf : no config file exists ~/.buildout/default.cfg: no config file exists always-set-cfg: no --> $ devpi user -c testuser password= user created: testuser --> $ devpi login testuser --password= logged in 'testuser', credentials valid for 10.00 hours --> $ devpi index -c dev http://localhost:3141/testuser/dev: type=stage bases=root/pypi volatile=True uploadtrigger_jenkins=None acl_upload=testuser pypi_whitelist= --> $ devpi use dev current devpi index: http://localhost:3141/testuser/dev (logged in as testuser) ~/.pydistutils.cfg : no config file exists ~/.pip/pip.conf : 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
显示版本:python2.7
$ devpi --version 2.0.2
咱们如今可使用 devpi
命令行客户端来触发一个从已经运行的服务器上使用索引的 pypi 包的 pip install
。ide
$ devpi install pytest --> $ /tmp/docenv/bin/pip install -U -i http://localhost:3141/testuser/dev/+simple/ pytest [PIP_USE_WHEEL=1,PIP_PRE=1] Downloading/unpacking pytest http://localhost:3141/testuser/dev/+simple/pytest/ uses an insecure transport scheme (http). Consider using https if localhost:3141 has it available Running setup.py (path:/tmp/docenv/build/pytest/setup.py) egg_info for package pytest http://localhost:3141/testuser/dev/+simple/py/ uses an insecure transport scheme (http). Consider using https if localhost:3141 has it available Requirement already up-to-date: py>=1.4.22 in /tmp/docenv/lib/python2.7/site-packages (from pytest) Installing collected packages: pytest Running setup.py install for pytest Installing py.test-2.7 script to /tmp/docenv/bin Installing py.test script to /tmp/docenv/bin Successfully installed pytest Cleaning up...
devpi install
命令配置一个 pip 调用,使用在 testuser/dev
索引上的与 pypi 兼容的 +simple/
页来寻找和下载包。pip
执行的是在 PATH
搜索和在 docenv/bin/pip
寻找。工具
让咱们检查 pytest
是否被正确安装:post
$ py.test --version This is pytest version 2.6.1, imported from /tmp/docenv/local/lib/python2.7/site-packages/pytest.pyc
你能够第二次调用 devpi install
命令,即便在没有网络的状况下,它也能正常工做。
咱们将使用 devpi
命令行工具来执行上传(你也可使用 plain setup.py)。
让咱们检查咱们已经登陆进了正确的索引:
$ devpi use current devpi index: http://localhost:3141/testuser/dev (logged in as testuser) ~/.pydistutils.cfg : no config file exists ~/.pip/pip.conf : no config file exists ~/.buildout/default.cfg: no config file exists always-set-cfg: no
如今进入你其中一个项目的 setup.py
文件的目录(咱们假设名字为 example
) 来构建和上传你的包到 testuser/dev
索引。
example $ devpi upload using workdir /tmp/devpi0 --> $ /usr/bin/hg st -nmac . hg-exported project to /tmp/devpi0/upload/example -> new CWD --> $ /tmp/docenv/bin/python setup.py sdist --formats gztar built: /home/hpk/p/devpi/doc/example/dist/example-1.0.tar.gz [SDIST.TGZ] 0kb register example-1.0 to http://localhost:3141/testuser/dev/ file_upload of example-1.0.tar.gz to http://localhost:3141/testuser/dev/
这里有三个触发动做:
setup.py
中定义的,把 example
版本注册进咱们当前的索引gztar
格式的文件到当前索引(使用一个在钩子下面的 setup.py
调用)咱们如今能够安装刚上传好的包:
$ devpi install example --> $ /tmp/docenv/bin/pip install -U -i http://localhost:3141/testuser/dev/+simple/ example [PIP_USE_WHEEL=1,PIP_PRE=1] Downloading/unpacking example http://localhost:3141/testuser/dev/+simple/example/ uses an insecure transport scheme (http). Consider using https if localhost:3141 has it available Downloading example-1.0.tar.gz Running setup.py (path:/tmp/docenv/build/example/setup.py) egg_info for package example Installing collected packages: example Running setup.py install for example Successfully installed example Cleaning up...
这个你刚刚从 testuser/dev
索引安装的上传包是咱们开始上传好的包。
注意:devpi upload 容许同时上传你的发行文件的多个不一样格式,好比:
sdist.zip
或是bdist_egg
,默认是sdist.tgz
。
若是你有一个包使用 tox 作测试,你或许要调用:
$ devpi test example # package needs to contain tox.ini received http://localhost:3141/testuser/dev/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz#md5=5bc44b5ac34ff65b6b16b332f9ccc22c unpacking /tmp/devpi-test0/downloads/example-1.0.tar.gz to /tmp/devpi-test0 /tmp/devpi-test0/example-1.0$ tox --installpkg /tmp/devpi-test0/downloads/example-1.0.tar.gz -i ALL=http://localhost:3141/testuser/dev/+simple/ --result-json /tmp/devpi-test0/toxreport.json -c /tmp/devpi-test0/example-1.0/tox.ini python create: /tmp/devpi-test0/example-1.0/.tox/python python installdeps: pytest python inst: /tmp/devpi-test0/downloads/example-1.0.tar.gz python runtests: PYTHONHASHSEED='2866296898' python runtests: commands[0] | py.test ___________________________________ summary ____________________________________ python: commands succeeded congratulations :) wrote json report at: /tmp/devpi-test0/toxreport.json posting tox result data to http://localhost:3141/testuser/dev/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz successfully posted tox result data
以上操做发生了这些事:
example
的最新可用版本tox.ini
而且调用 tox,把它指向咱们的 example-1.0.tar.gz
。强迫全部的安装都经过咱们当前的 testuser/dev/+simple/
索引和命令它建立一个 json
格式的报告toxreport.json
到 devpi 服务器去,它将被精确的链接到咱们的发行文件咱们能够校验测试状态是否被记录:
$ devpi list example http://localhost:3141/testuser/dev/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz cobra linux2 python 2.7.6 tests passed
一旦你以为发行文件没有问题,你能够把它推送到一个 devpi-managed 索引和一个外部的 pypi 索引服务器。
让咱们建立另一个 staging
索引:
$ devpi index -c staging volatile=False http://localhost:3141/testuser/staging: type=stage bases=root/pypi volatile=False uploadtrigger_jenkins=None acl_upload=testuser pypi_whitelist=
咱们建立了一个非易失性的索引,这意味着不能覆盖和删除发行文件,看 Non Volatile Indexes 来获取更多信息。
咱们如今能够把 example-1.0.tar.gz
从上面的全部推送到 staging
索引:
$ devpi push example-1.0 testuser/staging 200 register example 1.0 -> testuser/staging 200 store_releasefile testuser/staging/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz 200 store_toxresult testuser/staging/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz.toxresult0
这将决定全部在 testuser/dev
索引上的文件属于指定的 example-1.0
发行版而且把它们拷贝进 testuser/staging
索引。
让咱们检查咱们当前的索引:
$ devpi use current devpi index: http://localhost:3141/testuser/dev (logged in as testuser) ~/.pydistutils.cfg : no config file exists ~/.pip/pip.conf : no config file exists ~/.buildout/default.cfg: no config file exists always-set-cfg: no
让咱们使用 testuser/staging
索引:
$ devpi use testuser/staging current devpi index: http://localhost:3141/testuser/staging (logged in as testuser) ~/.pydistutils.cfg : no config file exists ~/.pip/pip.conf : no config file exists ~/.buildout/default.cfg: no config file exists always-set-cfg: no
而且再次检查测试结果:
$ devpi list example http://localhost:3141/testuser/staging/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz cobra linux2 python 2.7.6 tests passed
从最后一步推送后,测试状态依然是可用的。
咱们如今能够决定推送这个发行版到外部的 pypi 索引,咱们已经在 .pypirc
文件中配置了:
$ devpi push example-1.0 pypi:testrun no pypirc file found at: /tmp/home/.pypirc
这将推送 example-1.0
发行版的全部的文件到一个外部的 testrun
索引服务器。使用资格证书和 发如今 pypi
章节 .pypirc
文件中的 URL。
如今,咱们已经有 example-1.0
发行版和发行版文件在 testuser/dev
和 testuser/staging
索引,若是咱们想在咱们的开发索引上一直使用 staging 包,咱们能够从新配置 testuser/dev
的继承基线。
$ devpi index testuser/dev bases=testuser/staging /testuser/dev changing bases: ['testuser/staging'] http://localhost:3141/testuser/dev: type=stage bases=testuser/staging volatile=True uploadtrigger_jenkins=None acl_upload=testuser pypi_whitelist=
如今咱们切回 testuser/dev
:
$ devpi use testuser/dev current devpi index: http://localhost:3141/testuser/dev (logged in as testuser) ~/.pydistutils.cfg : no config file exists ~/.pip/pip.conf : no config file exists ~/.buildout/default.cfg: no config file exists always-set-cfg: no
而后寻找咱们的 example 发行文件:
$ devpi list example http://localhost:3141/testuser/dev/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz cobra linux2 python 2.7.6 tests passed http://localhost:3141/testuser/staging/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz cobra linux2 python 2.7.6 tests passed
咱们看到 example-1.0.tar.gz
被包含在两个索引中,让咱们移除 testuser/dev
的 example
发行版:
$ devpi remove -y example About to remove the following releases and distributions version: 1.0 - http://localhost:3141/testuser/dev/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz - http://localhost:3141/testuser/dev/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz.toxresult0 Are you sure (yes/no)? yes (autoset from -y option) deleting release 1.0 of example
若是你没有指定 -y
选项,你将被询问确认删除的交互式操做。
example-1.0
发行版本仍然能够经过 testuser/dev
访问,由于他从 testuser/staging
基线继承了全部的发行版。
$ devpi list example http://localhost:3141/testuser/staging/+f/5bc/44b5ac34ff65b/example-1.0.tar.gz cobra linux2 python 2.7.6 tests passed
$ devpi-server --stop killed server pid=841
若是你想配置安装一个永久的 devpi-server
。你也能够经过 Quickstart: permanent install on server/laptop 获取一些帮助。