devpi:手动上传 toxresult.json

devpi: manually upload toxresult.json

我目前有一个 Jenkins 管道,它使用 tox 构建和测试我的 python 包。如果所有单元测试都通过,它将上传到我本地的 devpi 索引。

使用devpi test <mypackage> 我可以将测试结果附加到索引上的发布文件中。 但这将再次下载已经构建的包,重复 tox.ini 文件中定义的所有已经通过的测试套件,然后才以 toxresult.json.

的形式上传结果

有什么方法可以直接上传 toxresult.json 和发布文件吗? 根据quickstart and the documentation of test command there seems to be no command line option, and neither in the 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"
}

您可以在项目页面上的文件 table 的 File 列中找到目标 URL。或者查询 JSON API 并过滤结果,例如

$ devpi getjson /myuser/myindex/mypkg | jq -r '[ .result[] | .["+links"][] | .href ]'

已验证上传

devpi 使用基本身份验证,因此只需在 Authorization: Basic header 中传递 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