让TeamCity始终发布构件

5
我很惊讶没有找到有关此问题的任何文档,但无论如何...
有时我的TeamCity构建会挂起,我最终需要停止它。构建过程会在磁盘上生成多个日志文件,然后TeamCity将其发布为构建工件。然而,如果我停止构建,则TeamCity拒绝发布这些日志:
Build was interrupted. Artifacts will not be published for this build

文件仍然存在于磁盘上,只是TeamCity不再发布它们。这特别让人恼火,因为我真的非常需要查看这些日志,以便我可以找出构建一开始为什么挂起。
有没有办法强制TeamCity始终发布构建产物,即使我必须中止构建?
(我看到了几个问题,询问如何停止TeamCity在构建失败时发布产物,所以我有点困惑为什么我的设置还没有做到这一点,但无论如何...)
PS.我意识到我可以手动登录构建服务器来查看日志,但TeamCity的整个目的就是自动化这样的事情...
3个回答

4
我认为启用挂起构建检测总体上是个好主意(你可以设置一个构建超过 n 分钟后失败的条件),但如果你对最终停止/挂起的构建已经创建的 工件 感兴趣,下面的内容可能会有所帮助:
你可以输出 TeamCity 服务消息 以立即发布工件。这些工件将在构建停止时仍然可用。例如:
##teamcity[publishArtifacts '/tmp/logfile => logs']

这将确保文件/tmp/logfile被发布到工件目录logs中。
另一个好处是,这些工件会立即出现在构建的工件选项卡中,这有助于决定是否应该取消构建。

这是个值得的想法。但是,我需要的那些构件是日志文件,它们会持续写入直到构建结束。我并不完全确定关于Linux文件访问语义的情况,但提前发布日志不意味着我只获得了不完整的副本吗? - MathematicalOrchid
文档中指出:“在所有文件准备就绪且没有文件被锁定以供读取后,应打印消息”。我认为当构建未挂起或停止时,您应该能够最终(重新)发布完整的日志文件,并使用不同的工件名称(请参阅有关工件路径的文档)。但是,通常您将无法获取日志内容“直到挂起活动”,因为您需要先输出服务消息才能发布日志文件。 - The Nail

2
TeamCity无法在停止构建时发布内容,这与构建失败不同。停止的构建更像是被杀死的进程,而失败的构建则是非零退出代码。
相反,我建议配置TeamCity,以便您不必停止构建。有两个选项可供启用:挂起构建检测和“运行时间超过”构建失败条件。这两个选项都应该帮助TeamCity自动终止构建,而不是您必须停止它。
这样,您将获得一个失败的构建,而不是一个停止的构建,并且您的工件应该会被发布。

2
实际上,有一种方法。您可以借助最后一个构建步骤发布构件,例如使用此元运行程序:https://github.com/JetBrains/meta-runner-power-pack/tree/master/artifacts-publisher。 对于此构建步骤,您可以将执行策略设置为“始终,即使发出了构建停止命令”。 - Pavel Sher
挂起构建检测听起来可能是我想要的。那么问题就是:“当最近50次运行都花费了半个小时时,我该如何阻止TeamCity估计我的构建需要17秒?” - MathematicalOrchid

0

这可能是构建的最后一个“命令行”步骤
使用选项“始终执行步骤,即使发出了停止构建命令”
这将输出发布工件指令吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接