将构建与 Agent 分离
如果构建的最后一步触发了某些外部服务,并且构建不再需要 构建代理,则相应的运行程序可以将构建从代理中分离出来。 这使得此代理可以供其他构建使用。 构建接下来会在 TeamCity 服务器上运行,外部服务将其进度直接报告给服务器。 这样的构建步骤被称为 无代理步骤。
为了释放其当前的构建代理,运行器需要发送 ##teamcity[buildDetachedFromAgent]
服务消息。 在接收到此消息后,代理将跳过构建的所有后续步骤,除非他们启用了 "始终执行,即使发出了构建停止命令" 执行策略。 如果必要,您可以为强制执行的最后步骤启用它 —— 只有在完成这些步骤后,代理才会被释放。
tip
除了使用服务消息外,您也可以编写自己的服务器端插件,该插件将会对外部服务进行轮询以获取构建状态。 使用
jetbrains.buildServer.serverSide.agentless.DetachedBuildStatusProvider
扩展点来实现此目的。 阅读更多关于在 TeamCity 插件帮助 中开发自定义插件的内容。
如果无代理构建的限制没有超过,服务器就会释放代理,它立即就能被其他构建使用。 否则,代理将一直附加在构建上,直到一些正在运行的无代理构建完成。
tip
我们强烈建议仅在最后的构建步骤中释放代理。 确保在 TeamCity 外执行的任务不需要构建代理。
此服务消息支持 trackingInfo
属性(Unicode,最多1000个符号)以提供可能有助于在 TeamCity 服务器上跟踪构建的信息(例如,部署 ID)。
在无代理步骤期间,外部工具应报告所有构建状态信息,并通过 REST API 直接向 TeamCity 服务器发送任何其他类型的请求。
要执行一个请求,需要提供:
用户名:
%system.teamcity.auth.userId%
密码:
%\系统团队城市认证密码%
构建 ID:
%teamcity.build.id%
TeamCity 服务器网址:
% \teamcity.serverUrl%
代理应该在发布之前,提前向外部软件发送这些参数。
要记录消息,请使用以下呼叫:
POST /app/rest/builds/id:<build_id>/log
(curl -v --basic --user <username>:<password> --request POST <teamcity.url>/app/rest/builds/id:<build_id>/log --data <message> --header "Content-Type: text/plain")
在这里,您可以将任何 服务消息 作为 <message>
发送。
发送警告的请求示例:
POST /app/rest/builds/id:TestBuild/log
(curl -v --basic --user TeamCityBuildId=87065:lqmT22NStn4ulqmT22NStn4ulqmT22NStn4u --request POST http://localhost:8111/app/rest/builds/id:TestBuild/log --data "##teamcity[message text='Deployment failed' errorDetails='stack trace' status='ERROR']" --header "Content-Type: text/plain")
tip
为了在构建日志中结构化服务消息,请使用 flow tracking。
确保外部执行的构建向 TeamCity 服务器发送完成请求非常重要。 如果服务器暂时无法使用,无法接收此请求,那么外部工具应重试,直到此操作成功为止。 如果不发送完成请求,构建将在 TeamCity 服务器上无限期运行,直到达到其指定的超时时间(如果有的话)。
要完成构建,请使用以下调用:
PUT /app/rest/builds/id:<build_id>/finish
(curl -v --basic --user <username>:<password> --request PUT <teamcity.url>/app/rest/builds/id:<build_id>/finish)
或者,您可以通过发送非空字符串的确切完成日期以 yyyyMMdd'T'HHmmssZ
格式来完成它:
PUT /app/rest/builds/id:<build_id>/finishDate
(curl -v --basic --user <username>:<password> --request PUT <teamcity.url>/app/rest/builds/id:<build_id>/finishDate --data "20201231T235959+0000" --header "Content-Type: text/plain")
tip
如果您需要将构建结束为 "Failed" ,请记录
buildProblem
消息,如在此处描述。
可以同时运行而不需要代理的构建数量受您激活的 agent licenses 的数量限制。 例如,如果您有 10 个代理许可证,您可以并行运行最多 10 个常规构建在代理上,外加最多可达 10 个无代理构建。 一旦您达到无代理构建的限制,TeamCity 在当前的无代理构建结束之前,不会在接下来的构建中分离步骤。
感谢您的反馈!