我目前有一个Jenkins管道,该管道使用tox构建和测试我的python软件包。如果所有单元测试都通过,它将被上传到我本地的devpi索引。
使用devpi test <mypackage>
,我可以将测试结果附加到索引上的发布文件中。但这将再次下载已构建的程序包,重复tox.ini
文件中定义的所有已通过测试套件,然后才以toxresult.json
的形式上传结果。
是否有任何方法可以直接将toxresult.json
与发布文件一起上传?根据quickstart和documentation of test command,似乎没有命令行选项,在upload命令中也没有。
当然,我可以更改Jenkins管道以在上载之前跳过测试,然后使用devpi构建,上载和测试软件包。如果devpi test
命令失败,我可以从索引中删除该程序包。但是我宁愿不要首先上传测试失败的软件包。
如果您允许匿名用户上传测试结果(这是默认设置IIRC,则相对容易。向上载的dist的URL发出POST
请求,并将tox
结果作为JSON负载传递。示例:
$ curl -i \
-H "content-type: application/json" \
-X POST \
--data-binary "@/tmp/toxreport.json" \
http://my-server/myuser/myindex/+f/19b/d3544d03b1716/mypkg-1.0.tar.gz
成功后,您应获得类似于]的结果>
HTTP/1.1 100 Continue HTTP/1.1 200 OK Content-Length: 143 Content-Type: application/json Date: Wed, 08 Jan 2020 15:48:32 GMT Server: waitress X-Devpi-Api-Version: 2 X-Devpi-Master-Uuid: d800735d04a14c2d9bde920149cb8dbc X-Devpi-Serial: 42 X-Devpi-Server-Version: 5.3.1 X-Devpi-Uuid: d800735d04a14c2d9bde920149cb8dbc { "result": "myuser/myindex/+f/19b/d3544d03b1716/mypkg-1.0.tar.gz.toxresult-20200108154832-0", "type": "toxresultpath" }
您可以在项目页面上文件表的
File
列中找到目标URL。或查询JSON API并过滤结果,例如
$ devpi getjson /myuser/myindex/mypkg | jq -r '[ .result[] | .["+links"][] | .href ]'
已认证的上传
devpi
使用基本身份验证,因此只需在Authorization: Basic
标头中传递base64编码的凭据。例如,再次使用curl
:
$ curl -i \ --user myuser:mypass \ -H "content-type: application/json" \ -X POST \ --data-binary "@/tmp/toxreport.json" \ http://my-server/myuser/myindex/+f/19b/d3544d03b1716/mypkg-1.0.tar.gz
如果您需要测试上传身份验证的详细信息,请查看我的其他答案here。