TeamCity:如何让浏览器在线查看指定build.number的日志工件而非下载?
解决TeamCity基于build.number的工件链接强制下载问题
问题背景
你遇到的核心问题是:通过TeamCity REST API(基于build.number)访问文本日志工件时,响应头Content-Disposition未包含inline指令,导致浏览器直接下载而非在线查看;而通过build.id的repository/download链接则正常返回inline头。
可行解决方案
方案1:构建时为日志工件指定元数据(推荐)
在构建脚本中,使用TeamCity的服务消息上传日志工件时,直接指定Content-Disposition为inline。这是官方支持的方式,不会影响服务器配置,且TeamCity升级后依然有效。
示例(Shell脚本):
echo "##teamcity[publishArtifacts 'Libtest.Makefile.bld_log.txt;Content-Type=text/plain;Content-Disposition=inline']"
示例(Windows批处理):
echo ##teamcity[publishArtifacts 'Libtest.Makefile.bld_log.txt;Content-Type=text/plain;Content-Disposition=inline']
配置后,该工件无论通过哪种链接访问,都会返回inline响应头,实现在线查看。
方案2:通过反向代理修改响应头(适合无法修改构建脚本的场景)
如果TeamCity部署在反向代理(如Nginx)之后,可在代理层拦截对应请求,修改响应头。
以Nginx为例,添加如下配置:
location ~* ^/app/rest/builds/buildType:.*,number:.*\/artifacts/content\/.*\.bld_log\.txt$ { proxy_pass http://teamcity.internal:8111; proxy_set_header Host $host; # 隐藏原有的Content-Disposition头 proxy_hide_header Content-Disposition; # 从请求路径提取文件名,添加正确的inline头 if ($request_uri ~* \/([^\/]+)\.bld_log\.txt$) { set $filename $1.bld_log.txt; } add_header Content-Disposition "inline; filename=\"$filename\""; }
配置生效后,所有匹配路径的请求都会被修改响应头,实现在线查看。
方案3:修改TeamCity服务器配置(不推荐)
直接修改TeamCity的Web应用配置(如web.xml)添加过滤器,强制为文本日志修改响应头。但此方法会在TeamCity升级时丢失配置,且可能影响其他功能,仅作为最后备选。
内容的提问来源于stack exchange,提问作者Peter Moore
相关产品推荐
相关产品推荐

