如何通过TeamCity REST API向运行中的构建添加构建制品?
解决方案
要给已经脱离代理但仍在运行的TeamCity构建上传大日志作为制品,你可以直接用TeamCity REST API的构建制品上传端点,具体操作如下:
核心步骤
定位目标构建
直接使用你后续用来结束构建的那个构建ID即可,不需要额外查询。如果没有现成ID,也可以用构建号、分支名组合成Locator字符串(比如number:20240501-001,branch:main)来定位。构造上传请求
向TeamCity服务器发送POST请求到以下端点:http://<teamcity-server地址>/app/rest/builds/<构建标识>/artifacts/content其中
<构建标识>可以是id:12345(直接指定ID),或者上述的Locator字符串。请求认证
必须带上TeamCity的认证信息:- 通用方式:HTTP Basic认证,将
用户名:密码做Base64编码后放在Authorization头中,格式为Authorization: Basic <Base64编码字符串> - 新版TeamCity(2020.1+):使用令牌认证,格式为
Authorization: Bearer <你的令牌>
- 通用方式:HTTP Basic认证,将
上传文件(以curl脚本为例)
用multipart/form-data格式上传,同时指定文件在TeamCity制品中的存储路径。比如把本地/opt/test-logs/unit-test.log上传到TeamCity制品的test-reports/unit-test.log路径,命令如下:curl -u "admin:your-password" -X POST \ -F "file=@/opt/test-logs/unit-test.log;filename=test-reports/unit-test.log" \ "http://teamcity.example.com/app/rest/builds/id:12345/artifacts/content"
关键注意事项
- 构建状态要求:构建必须处于运行中状态(即使已脱离代理),务必在调用结束构建的API之前完成上传操作。
- 大文件优化:如果日志文件过大,可先将其打包成压缩文件上传,TeamCity会自动解压,减少传输量:
同时需要检查TeamCity服务器的# 打包后上传,自动解压到test-reports目录 curl -u "admin:your-password" -X POST \ -F "file=@/opt/test-logs/test-logs.zip;filename=test-reports/" \ "http://teamcity.example.com/app/rest/builds/id:12345/artifacts/content"teamcity.max.artifact.size配置,调整允许的最大制品大小。 - 多文件上传:若需上传多个文件,只需添加多个
-F参数,每个参数对应一个文件和目标存储路径。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

