TeamCity On-Premises 2024.03 Help

服务消息

服务消息是特别构造的文本片段,用于从构建脚本向 TeamCity 服务器传递构建的命令 / 信息。

要被 TeamCity 处理,它们需要被写入到构建的标准输出流中,即从构建步骤中打印或回显

示例:

echo ##teamcity[<messageName> 'value']
echo "##teamcity[<messageName> 'value']"
Write-Host "##teamcity[<messageName> 'value']"

单个服务消息内不能包含换行符,不能跨越多行。

服务消息格式

服务消息支持两种格式:

  • 单属性消息:

    ##teamcity[<messageName> 'value']
  • 多属性信息:

    ##teamcity[<messageName> name1='value1' name2='value2']

    多属性消息可以更正式地描述为:

    ##teamcity[messageNameWSPpropertyNameOWSP=OWSP'value'WSPpropertyName_IDOWSP=OWSP'value'...OWSP]

where:

  • messageName 是消息的名称,例如 flowStartedsetParameter

  • propertyName 是消息属性的名称。 必须是有效的 Java ID。

  • 是属性的值。 必须是一个 escaped value

  • WSP 是必需的空格:空格或制表符( \t)。

  • OWSP 是一个可选的空格。

  • ... 是任何数量的 WSPpropertyNameOWSP=OWSP'value' 块。

转义值

对于转义值,TeamCity 使用竖线 | 作为转义字符。 为了让 TeamCity 服务器正确解释某些特殊字符,它们必须以竖线开始。 例如,以下信息:

##teamcity[testStarted name='foo|'s test']

将在 TeamCity 中显示为 foo 的测试。 请参考下面的转义值表格。

字符

作为 Escape

'(撇号)

|'

\n (换行符)

|n

\r (回车)

|r

\uNNNN(unicode 符号,代码为 0xNNNN)

|0xNNNN

| (竖线)

||

[(开括号)

|[

]"(闭合括号)

|]

向构建日志报告消息

您可以按照以下方式向构建日志报告消息:

##teamcity[message text='<message text>' errorDetails='<error details>' status='<status value>']

where:

  • 状态 可以取以下值: 正常 (默认), 警告失败错误

  • 只有当 状态错误 时,才会使用 errorDetails ,在其他情况下,它会被忽略。
    如果此消息的状态为 错误 ,并且在构建配置的 构建失败条件 页面上勾选了 "如果构建运行程序记录了错误消息,则失败构建 "框,则此消息会导致构建失败。 例如:

    ##teamcity[message text='Exception text' errorDetails='stack trace' status='ERROR']

服务消息的块

块"被用于在构建日志中对多个信息进行分组。

区块开启:

blockOpened 系统消息具有 名称 属性,您也可以添加它的描述:

##teamcity[blockOpened name='<blockName>' description='<this is the description of blockName>']

块关闭:

##teamcity[blockClosed name='<blockName>']

报告编译信息

##teamcity[compilationStarted compiler='<compiler_name>'] ... ##teamcity[message text='compiler output'] ##teamcity[message text='compiler output'] ##teamcity[message text='compiler error' status='ERROR'] ... ##teamcity[compilationFinished compiler='<compiler name>']

where:

  • compiler_name 是执行编译的编译器的任意名称,例如, javacgroovyc。 目前,它被用作构建日志中的块名称。

  • 任何在 编译已开始compilationFinished 之间报告的具有状态 错误 的消息将被视为编译错误。

消息 FlowId

任何消息都支持可选属性 flowId。 在以下示例中, <messageName> 是特定服务消息的名称。

flowId 是构建中消息流的唯一标识符。 流程跟踪是必要的,例如,用于区分并行运行的不同进程。 标识符是一个字符串,必须在单个构建的范围内保持唯一。

##teamcity[<messageName> flowId='flowId' ...]

在大多数情况下, flowId 是启动消息流程所需的唯一属性。

当您绝对需要在现有流程中以子流程的形式而不是在根流程中启动流程时,请添加 flowStarted 参数,并将父流程 ID 指定为 父项 参数。 未指定父级的流程会在当前步骤的根流程内开始。
要结束子流程,请使用 flowFinished 参数。 结束一个父流程会自动关闭所有的子流程,但我们建议明确声明流程的顺序:

##teamcity[flowStarted flowId='MainFlow' ...] ##teamcity[flowStarted flowId='SubFlow1' parent='MainFlow' ...] ##teamcity[flowFinished flowId='SubFlow1' ...] ##teamcity[flowStarted flowId='SubFlow2' parent='MainFlow' ...] ##teamcity[flowFinished flowId='SubFlow2' ...] ##teamcity[flowFinished flowId='MainFlow' ...]

这个自定义子流程顺序影响了构建日志中报告的顺序,并允许以子树的形式报告结果。

报告测试

要使用 TeamCity 的即时测试报告,测试框架需要为此功能提供专门的支持(或者,可以使用 XML 报告处理)。 如果 TeamCity 原生不支持您的测试框架,您可以修改构建脚本,使用服务消息向 TeamCity 服务器报告测试运行。 这使得可以实时显示测试结果,在 测试 标签下的 构建结果 页面中提供测试信息。

消息创建时间戳

测试报告消息支持可选属性 时间戳。 在以下示例中, <messageName> 是特定服务消息的名称。

##teamcity[<messageName> timestamp='timestamp' ...]

时间戳格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZyyyy-MM-dd'T'HH:mm:ss.SSS ,依照 Java SimpleDateFormat 语法 规则。

示例:

##teamcity[<messageName> timestamp='2008-09-03T14:02:34.487+0400' ...] ##teamcity[<messageName> timestamp='2008-09-03T14:02:34.487' ...]

对于 .NET DateTimeOffset,一段代码可能像这样

var date = DateTimeOffset.Now; var timestamp = $"{date:yyyy-MM-dd'T'HH:mm:ss.fff}{date.Offset.Ticks:+;-;}{date.Offset:hhmm}";

将导致

##teamcity[<messageName> timestamp='2008-09-03T14:02:34.487+0400' ...]

受支持的测试 ServiceMessages

测试套件消息: 测试套件用于对测试进行分组。 TeamCity 在 Tests 标签页以及 Build Results 页面和其他地方展示按套件分组的测试。

##teamcity[testSuiteStarted name='suiteName'] <individual test messages go here> ##teamcity[testSuiteFinished name='suiteName']

所有单独的测试消息都应在 testSuiteStartedtestSuiteFinished (按此顺序)之间显示,并具有相同的 名称 属性。

嵌套测试报告

启动另一个测试会结束在同一 flow 中已开始的测试。 要在其他测试中继续报告测试,您将需要在嵌套的测试服务消息中指定另一个 flowId

测试开始/停止消息:

##teamcity[testStarted name='testName' captureStandardOutput='<true/false>'] <here go all the test service messages with the same name> ##teamcity[testFinished name='testName' duration='<test_duration_in_milliseconds>']

指示 testName 已运行。 如果 testFailed 消息不存在,那么此测试被视为成功。

  • 持续时间 (可选的数值整型属性)设置以毫秒为单位的测试持续时间,以在 TeamCity UI 中报告。 如果省略,测试持续时间将根据消息的时间戳来计算。 如果时间戳丢失 — 从服务器上接收消息的实际时间开始。

  • captureStandardOutput (可选布尔属性)——如果是 true ,那么在 testStartedtestFinished 消息之间收到的所有标准输出和标准错误消息将被视为测试输出。 默认值为 false :假设使用 testStdOuttestStdErr 服务消息来报告测试输出。

强烈建议您确保 测试套件 + 测试名称 在构建中是唯一的。 为了使 TeamCity 的高级测试相关功能正常工作,测试名称在每次构建时都不能有所偏离(单个测试必须在每次构建中报告相同的名称)。 在报告的测试名称中包含绝对路径是 强烈反对 的。

已忽略的测试:

##teamcity[testIgnored name='testName' message='ignore comment']

指示 testName 存在,但未被测试框架运行(被忽略)。 作为一个例外, testIgnored 消息可以在没有匹配的 testStartedtestFinished 消息的情况下被报告。

测试输出:

##teamcity[testStarted name='className.testName'] ##teamcity[testStdOut name='className.testName' out='text'] ##teamcity[testStdErr name='className.testName' out='error text'] ##teamcity[testFinished name='className.testName' duration='50']

testStdOuttestStdErr 服务消息报告测试的标准和错误输出,以在 TeamCity UI 中显示。 每个测试只能有一个 testStdOut 和一个 testStdErr 消息。 一个替代但不太可靠的方法是使用 captureStandardOutput 消息的 testStarted 属性。

测试结果:

##teamcity[testStarted name='MyTest.test1'] ##teamcity[testFailed name='MyTest.test1' message='failure message' details='message and stack trace'] ##teamcity[testFinished name='MyTest.test1'] ##teamcity[testStarted name='MyTest.test2'] ##teamcity[testFailed type='comparisonFailure' name='MyTest.test2' message='failure message' details='message and stack trace' expected='expected value' actual='actual value'] ##teamcity[testFinished name='MyTest.test2']

指示 testname 测试失败。 对于给定的测试名称,只能出现一个 testFailed 消息。

  • 消息 包含了错误的文字描述。

  • 详细信息 包含了关于测试失败的详细信息,通常是一条消息和一个异常堆栈跟踪。

  • 实际预期 属性只能与 type='comparisonFailure' 一起使用,来报告比较失败。 这些值将在在集成开发环境中打开测试时使用。

这是一个关于通过服务消息进行测试报告的较长示例:

##teamcity[testSuiteStarted name='suiteName'] ##teamcity[testSuiteStarted name='nestedSuiteName'] ##teamcity[testStarted name='package_or_namespace.ClassName.TestName'] ##teamcity[testFailed name='package_or_namespace.ClassName.TestName' message='The number must be 20000' details='junit.framework.AssertionFailedError: expected:<20000> but was:<10000>|n|r at junit.framework.Assert.fail(Assert.java:47)|n|r at junit.framework.Assert.failNotEquals(Assert.java:280)|n|r...'] ##teamcity[testFinished name='package_or_namespace.ClassName.TestName'] ##teamcity[testSuiteFinished name='nestedSuiteName'] ##teamcity[testSuiteFinished name='suiteName']

启用测试重试

您可以为构建配置启用 test retry 的支持。 启用此选项后,测试的成功运行将阻止其之前的失败,这意味着如果测试在同一构建中失败然后成功,TeamCity 将会对该测试进行静音处理。
此类测试将不会影响构建状态。

##teamcity[testRetrySupport enabled=’true’]

解读测试名称

全名测试可以采用以下形式: <套件名称>:<包 / 命名空间名称>.<类名称>.<测试方法>(<测试参数>) ,其中, <class name><test method> 的名称中不能包含点。 只有 <test method> 是完整测试名称的必要部分。

完整的测试名称用于比较连续构建之间的测试或匹配不同构建配置的测试。

全名测试的示例:

Integration Tests: Backend: org.jetbrains.teamcity.LoginPageController.testBadPassword("incorrect password", false) // in the example above, // suite name = "Integration Tests: Backend" // package = org.jetbrains.teamcity // class name = LoginPageController // test method = testBadPassword // test parameters = ("incorrect password", false)

Tests 标签位于Build Results页面上,允许按照套件、包/命名空间、类和测试进行分组。 通常,属性值是由您的测试框架报告的,而 TeamCity 能够正确解释测试名称。

如果测试无法按照上述形式解析,TeamCity 仍会尝试从完整的测试名称中提取 <suite name> ,以便在 Tests 标签上进行筛选,并将套件后面的所有内容视为无法解析的测试名称。

报告额外的测试数据

可以使用 testMetadata 服务消息将额外信息附加到测试上。 更多详情可在 独立页面 上查看。

报告 .NET 代码覆盖率结果

您可以通过服务消息来配置 .NET 覆盖率处理。 要了解更多信息,请参考 手动配置报告覆盖率 页面。

报告检查

您可以使用下面描述的服务消息,从自定义工具向 TeamCity 报告检查结果。

除其他用途外,检查次数可用作构建度量,以便于构建失败时使用。

检查类型

代码中的每一个特定警告或错误(检查实例)都有一个检查类型 —— 这是已进行检查的唯一描述,可以通过报告。

##teamcity[inspectionType id='<id>' name='<name>' description='<description>' category='<category>']

在这里,所有的属性都是必需的,且可以是数字或者文本值:

  • iD — (必填)限制在 255 个字符以内

  • 名称 — (必填)限制在 255 个字符以内

  • 类别—(必填)字符限制为255个。 属性 类别 的示例包括“样式违规”和“调用合约”。

  • 描述 — (必填)限制为 4000 个字符。 描述也可以是 HTML 格式。 例如,

<html> <body> Reports unnecessary local variables, which add nothing to the comprehensibility of a method. Variables caught include local variables which are immediately returned, local variables that are immediately assigned to another variable and then not used, and local variables which always have the same value as another local variable or parameter. <!-- tooltip end --> <p> Use the first checkbox below to have this inspection ignore variables which are immediately returned or thrown. Some coding styles suggest using such variables for clarity and ease of debugging. </p> <p> Use the second checkbox below to have this inspection ignore variables which are annotated. </p> </body> </html>

检查实例

报告特定的缺陷、警告、错误信息。 包括位置、描述以及各种可选和自定义属性。

##teamcity[inspection typeId='<inspection type identity>' message='<instance description>' file='<file path>' line='<line>' additional attribute='<additional attribute>']

所有属性都可以具有数字值或文本值:

  • typeId — (必填),引用上述 inspectionType.id ,限制为 255 个字符。

  • 消息—(可选)当前实例描述,限制为4000个字符。

  • 文件 — (必填)文件路径限制为4000个字符。 路径可以是绝对的,也可以相对于 checkout directory

  • 一样—(可选)文件的行,整数。

  • 附加属性 可以是任何属性, 严重性 常在此使用,其值可以是以下之一(注意大写): 信息错误警告弱警告

示例:

##teamcity[inspectionType id='UnnecessaryLocalVariable' name='Redundant local variable' description='<html><body>Reports unnecessary local variables...</body> </html>' category='Data flow issues'] ##teamcity[inspection typeId='UnnecessaryLocalVariable' message='Local variable <code>i</code> is redundant' file='src/Test.java' line='19' SEVERITY='WARNING']

在构建过程中发布工件

您可以在构建仍在运行时,立即在构建出的构件后发布构建构件。

要做到这一点,您需要输出以下行:

##teamcity[publishArtifacts '<path>']

<path> 必须遵循与 构建工件规范 相同的规则,这是 构建配置设置 的一部分。 符合 <path> 的文件将被上传,作为正在运行的构建的工件可见。

所有文件准备就绪且没有任何文件被锁定以阻止读取后,应打印此消息。

构件会在后台上传,这可能需要一些时间。 确保在构建结束之前不删除匹配的文件(例如,您可以将它们存放在下次构建开始时清理的目录中,放在 临时目录中,或是使用 Swabra 在构建后清理它们)。

在构建配置设置中指定的 Artifacts 将会按常规发布。

在步骤之间传递 NuGet 包

如果您需要发布 NuGet 包,然后在一个构建过程中使用它们的内容,您希望能够确保它们及时发布和索引,而不是在构建结束时。
为此,您可以使用 NuGet Publish 运行器,或者在任何步骤中发送 ##teamcity[publishNuGetPackage] 服务消息。 这确保了 NuGet 包在当前步骤结束时发布到所有配置的 NuGet 源,并在接下来的构建步骤中可用。

报告构建进度

您可以使用特殊的进度消息来标记构建脚本中的长时间运行部分。 这些消息将显示在相应构建的项目仪表板以及 Build Results 页上。

要记录单条进度信息,请使用:

##teamcity[progressMessage '<message>']

此进度消息将一直显示,直到出现另一条进度消息或者下一个目标开始(在 Ant 构建的情况下)。

如果您只希望为构建的一部分显示进度消息,请使用:

##teamcity[progressStart '<message>'] ...some build activity... ##teamcity[progressFinish '<message>']

报告构建问题

要直接从构建脚本中失败构建,必须报告构建问题。 构建问题会影响构建状态文本。 它们会显示在 Build Results 页面上。 要在构建中添加一个构建问题,请使用:

##teamcity[buildProblem description='<description>' identity='<identity>']

where:

  • 描述 (必填):用来描述构建问题的人类可读的纯文本。 默认情况下, 描述 会出现在构建状态文本和构建问题列表中。 文本仅限于4000个符号,如果超出限制,将会被截断。

  • 身份 (可选):一个独特的问题 ID。 不同的问题必须有不同的标识,相同的问题 — 同样的标识,如果相同的问题,例如,相同的编译错误发生,则在整个构建过程中这个标识不应该改变。 它必须是一个有效的 Java ID,最多包含 60 个字符。 如果省略, 身份 将根据 描述 文本进行计算。

报告构建状态

使用 buildStatus 来设置 构建状态文本

自定义构建状态
##teamcity[buildStatus text='NuGet packages were successfully published.']

与设计用于反映构建状态中当前正在进行的操作的 进度消息 不同, buildStatus 消息设定了构建完成后持久存在的最终构建状态。

您可以添加单独的步骤,并使用不同的步骤执行条件来区分"绿色"构建和失败的构建,并为它们每一个设置不同的自定义状态。

steps { // ... script { id = "set-custom-green-text" scriptContent = """echo "##teamcity[buildStatus text='NuGet packages were successfully published.']"""" } script { id = "set-custom-red-text" executionMode = BuildStep.ExecutionMode.RUN_ONLY_ON_FAILURE scriptContent = """echo "##teamcity[buildStatus text='Build failed! NuGet packages were not updated.']"""" } }

默认状态文本可以通过 {build.status.text} 占位符进行引用。

##teamcity[buildStatus text='The default status of this build is: {build.status.text}']

状态参数

状态 参数是 buildStatus 服务消息的可选项,允许您覆盖构建的显示:将失败的构建描述为成功,甚至(并不推荐)将成功的构建描述为失败。

  • 要将构建的状态从失败更改为成功,请添加 status='SUCCESS' 参数。

    ##teamcity[buildStatus status='SUCCESS' text='{build.status.text}, the build is marked as successful']
    手动分配的成功状态
  • 如果您希望一个 "green" 构建显示为失败,您可以发送以下消息:

    ##teamcity[buildStatus status='FAILURE' text='The build status was manually switched to {build.status.text}']

    然而,由于这只改变了构建状态,而没有为任何正在调查这个“失败”的构建的人提供任何可行的见解,我们建议您发送 buildProblem 消息作为替代。 这条信息允许您真正地使构建失败(并提供与此问题相关的具体细节),而不仅仅是更改最终状态。 因此,项目维护者将能够使用 TeamCity 提供的各种工具来解决问题:调查,静音等等。

    ##teamcity[buildProblem description='The artifact size has decreased dramatically' identity='2281488']

报告构建编号

要直接设置自定义构建号,请使用以下格式指定一条 buildNumber 消息:

##teamcity[buildNumber '<new build number>']

在 <new build number> 值中,您可以使用 {build.number} 替代,使用 TeamCity 自动生成的当前构建编号。 例如:

##teamcity[buildNumber '1.2.3_{build.number}-ent']

添加或更改构建参数

通过在构建脚本中使用专用服务消息,您可以直接从构建步骤中动态更新构建参数(参数需要在构建配置的 Parameters 部分中定义)。 更改的构建参数将在修改后的构建步骤中可用。 他们也将作为构建参数可用,并且可以通过 %\dep.*% 参数引用 在依赖构建中使用,例如:

##teamcity[setParameter name='ddd' value='fff']

在指定构建参数的名称时,请注意前缀:

  • system 用于系统属性。

  • env 用于环境变量。

  • 配置参数无前缀。

阅读更多关于构建参数及其前缀的信息。

报告构建统计

在 TeamCity 中,您可以配置构建脚本以报告统计数据,然后根据这些数据显示图表。 请参考 定制统计图表 页面,了解如何在网页用户界面上展示图表。 此部分介绍如何通过服务消息报告构建脚本的统计数据。 您可以通过两种方式发布构建静态值:

  • 在构建脚本中直接使用服务消息

  • 通过 teamcity-info.xml 文件提供数据
    要使用服务消息报告构建统计信息:为您要报告的每个统计值指定以下格式的 buildStatisticValue 服务消息:

##teamcity[buildStatisticValue key='<valueTypeKey>' value='<value>']

where

  • 密钥 必须不等于任何一个 预定义键

  • 必须是最多13位的正整数或负整数;同时也支持最多含6位小数的浮点数。

禁用服务消息处理

如果您出于某种原因需要禁用在输出中搜索服务消息,您可以通过消息禁用服务消息搜索:

##teamcity[enableServiceMessages] ##teamcity[disableServiceMessages]

出现在这两者之间的任何消息都不会被解析为服务消息,而且实际上会被忽略。 对于服务器端处理的服务消息,启用/禁用服务消息也支持 flowId 属性,并将仅忽略具有相同 flowId 的消息。

导入 XML 报告

除了 UI 构建功能外,还可以借助 importData 服务消息在构建脚本内部配置 XML 报告。 此外,该消息支持导入先前收集的代码覆盖率和代码审查/重复报告。

服务消息的格式是:

##teamcity[importData type='typeID' path='<path to the xml file>']

在哪里 typeID 可以是以下之一(也请参见 XML 报告处理):

typeID

描述

测试框架

junit

JUnit Ant 任务 XML 报告

surefire

Maven Surefire XML 报告

nunit

NUnit-Console XML 报告

mstest

MSTest XML 报告

vstest

VSTest XML 报告

gtest

Google Test XML 报告

代码检查

intellij-inspections

IntelliJ IDEA 检查结果

checkstyle

Checkstyle 检查 XML 报告

findBugs 2)

FindBugs 检查 XML 报告

jslint

JSLint XML 报告

ReSharperInspectCode 1)

ReSharper inspectCode.exe XML 报告

FxCop 1

FxCop 检查 XML 报告

pmd

PMD 检查 XML 报告

代码重复

pmdCpd

PMD 复制/粘贴检测器 (CPD)XML 报告

DotNetDupFinder 1)

ReSharper dupfinder.exe XML 报告

代码覆盖率

dotNetCoverage 1) 3)

由 dotcover、partcover、ncover 或 ncover3 生成的 XML 报告

备注:

  1. 仅支持在 路径 属性中的特定文件。

  2. 还需要指定 findBugsHome 属性,指向已安装的 FindBugs 工具的主目录。

  3. 还需要 工具='<工具名称>' 服务消息属性,其中 <tool name>dotcoverpartcoverncoverncover3

除非特别注明,否则报告类型支持在 路径 属性中使用类似 Ant 的通配符。

  • verbose='true' 属性将在构建日志中启用详细记录。

  • parseOutOfDate='true' 属性将处理所有与路径匹配的文件。 默认情况下,仅处理在构建期间更新的(由最后修改时间戳确定)的文件。 如果发现任何不匹配的报告,构建日志中将出现 "报告由于过期而被跳过" 的消息。

  • whenNoDataPublished=<action> (其中 <action> 为以下之一: 信息 (默认), 无任何内容警告错误 )如未找到与指定路径匹配的报告,将更改输出级别。

  • 已弃用,请改用 构建失败条件
    findBugspmdcheckstyle importData 消息还会接受可选的 errorLimitwarningLimit 属性,用于指定错误和警告限制,超过此限制将导致构建失败。

要启动对多个目录的监控,或解析多种类型的报告,请依次发送相应的服务消息。

将文件写入构建日志

发送以下服务消息以开始跟踪文件的内容,并将其新行写入构建日志。

##teamcity[importData type='streamToBuildLog' filePath='path-to-file' wrapFileContentInBlock='false' charset='UTF-8']
将文件流输出到日志
  • 类型 — 始终等于 'streamToBuildLog'。

  • filePath — 指向特定文件的路径。 这个路径可以是绝对的( filePath='%teamcity.build.checkoutDir%/temp.txt' )或相对的( filePath='./myFolder/temp.txt')。 相对路径是根据运行构建的代理的当前工作目录(由 teamcity.agent.work.dir 参数 返回的目录)来解析的。 如果指定的文件不存在或无法打开,TeamCity 将周期性地尝试访问此文件(只要发送此服务消息的 runner 仍在运行)。

  • wrapFileContentInBlock (可选)—— 指定此消息的输出是否应放置在可折叠的 "Streaming file..." 块中。 默认值为 "true"。

    包裹在块中
  • 字符集 (可选)- 是 Java 支持的编码的规范名称或别名。 如果参数不存在或无法解析编码,将使用 UTF-8。

只要父运行器处于活动状态,TeamCity就会监视给定的文件。 当运行器停止时,文件将一直流到结束并关闭。

发送自定义 Slack 消息

您可以使用 TeamCity 服务消息来发送 Slack 直接消息并在 Slack 频道中发布更新。

在 Slack 中自定义 TeamCity 消息

TeamCity 通过 Slack 连接 来发送 Slack 消息。 如果您还没有创建 Slack 连接,请转到 Administration | Project Settings | Connections 并创建一个。

  1. 打开 Slack 连接的设置,并将 Notifications limit 设置为任何正数。 此值指定了构建配置每次运行可以发送的消息的最大数量。

  2. 出于安全原因,只允许在消息中添加指向同一 TeamCity 服务器的链接。 带有指向外部网络资源的 URL 的消息会自动被阻止,并在 "teamcity-notifications.log" 文件中写入相应的消息(Administration | Diagnostics | 服务器日志)。

    被阻止的服务消息

    如果您需要包含指向外部资源的链接,请在 允许的主机名 字段中输入它们的主机名。 使用逗号(,)作为分隔符输入多个值,使用星号(*)作为任意字符串的通配符(例如,*.test.co.uk)。

  3. 一旦配置了 Slack 连接,您可以按照以下格式在构建脚本中添加服务消息:

    ##teamcity[notification notifier='slack' message='Line 1 |rLine2 |rLine3' sendTo='build_farm_alerts' connectionId='PROJECT_EXT_2']
    • notifier(通知程序) — 始终等于 "slack"。

    • 消息 — 显示的信息。 支持 Markdown 语法(除了用于换行的 "\n",请使用 "|n" 或 "|r" 作为替代)。

      Markdown格式的服务消息

    • sendTo — 指定谁应接收此消息。 接受单个 Slack 频道名称、频道 ID(以 "C" 开头,例如 "C052UHDRZU7")或用户 ID(以 "U" 开头,例如 "U02K2UVKJP7")作为值。 如果您需要向多个收件人发送相同的信息,请创建带有不同 sendTo 值的多个服务消息。

    • connectionID — 这是一个可选参数,允许您选择 TeamCity 应该用来发送此消息的特定 Slack 连接。 接受连接 ID 作为值。 如果没有指定此参数,TeamCity 将检索当前项目中可用的所有 Slack 连接,并选择 通知限制 不为零的那一个。

  1. 运行构建以确保所有 Slack 消息都已发送。

发送自定义电子邮件消息

您可以使用 TeamCity 服务消息从构建脚本内部发送电子邮件。

由服务信息发送的电子邮件
  1. 导航至 Administration | Email Notifier 并设置通用的 Notifier 设置:发件人的电子邮件,SMTP 登录和密码,连接安全协议等等。 参见此链接以获取示例:设置 Google 邮箱作为通知服务器

  2. Notifications limit 设置为任何正数。 此值指定了构建配置每次运行可以发送的消息的最大数量。

  3. 将收件人列表输入到 允许的地址 中。 向此列表外的收件人发送的消息将被自动阻止。 使用逗号(,)作为分隔符来输入多个地址,以及使用星号(*)作为通配符来替代任何字符串(例如,*@gmail.com)。

  4. 出于安全原因,只允许在消息中添加指向同一 TeamCity 服务器的链接。 带有指向外部网络资源的 URL 的消息会自动被阻止,并在 "teamcity-notifications.log" 文件中写入相应的消息(Administration | Diagnostics | 服务器日志)。

    被阻止的服务消息

    如果您需要包含指向外部资源的链接,请在 允许的主机名 字段中输入它们的主机名。 使用逗号(,)作为分隔符输入多个值,使用星号(*)作为任意字符串的通配符(例如,*.test.co.uk)。

  5. 一旦设置了电子邮件通知程序,您可以按照以下格式向构建脚本中添加服务消息:

    ##teamcity[notification notifier='email' message='Message body' subject='Email subject' address='user1@gmail.com,user2@yourcompany.com']
    • notifier(通知程序) — 总是等于 "email"。

    • 消息 — 这是以纯文本格式显示的消息主体。

    • subject — 这是电子邮件的主题。

    • 地址 — 来自电子邮件通知程序的 允许的地址 列表中的一个或多个地址。

  6. 运行构建以确保所有电子邮件都被送达。

通过服务消息取消构建

如果您需要从脚本中取消构建,例如,由于环境原因无法正常进行构建,或者应从子进程中取消构建,您可以使用以下的服务消息:

echo "##teamcity[buildStop comment='canceling comment' readdToQueue='true']"

如有必要,您可以在取消后重新将构建添加到队列中。 默认情况下,TeamCity 将尝试 3 次将构建重新加入队列。

添加和删除构建标签

服务消息允许您添加和删除 build tags

  • ##teamcity[addBuildTag 'your-custom-tag'] — 在当前构建中添加新的标签。

  • ##teamcity[removeBuildTag 'tag-to-remove'] — 从当前构建中删除一个标签。

两种消息都让您可以传递 配置参数 的值,而非纯文本字符串。 例如, ##teamcity[addBuildTag '%teamcity.agent.jvm.os.name%'] 消息标签会与安装在代理机器上的操作系统的名称一起构建。

使用操作系统名称标记构建

一条服务消息可以添加或删除一个标签。 要添加或删除多个标签,发送多个服务消息。

通过 TeamCity 服务消息报告库结果

几个来自 JetBrains 和外部资源的特定平台库能够通过 TeamCity 服务消息报告结果。

  • Service messages .NET 库 — 用于从 .NET 应用程序生成 (和解析)TeamCity 服务消息的 .NET 库。 请查看一篇 相关博客文章

  • Jasmine 2.0 TeamCity reporter—— 支持从 Jasmine 2.0 报告器发出 TeamCity 服务信息

  • Perl TAP Formatter—— 这是一个用于将 TAP 消息转换为 TeamCity 服务消息的 Perl 格式化程序

  • PHPUnit 5.0 — 支持 TeamCity 服务消息进行测试。 对于早期的 PHPUnit 版本,可以使用以下外部库: PHPUnit Listener 1PHPUnit Listener 2—— 这些监听器可以通过 PHPUnit 的 suite.xml 插入,为测试生成 TeamCity 服务消息。

  • Python 单元测试报告发送至 TeamCity—— 这是一个自动将单元测试报告发送至 TeamCity 服务器的包,通过服务消息 (当在 TeamCity 下运行并且提供的测试代码已适应使用它)。

  • Mocha — 通过服务消息进行即时汇报,供 Mocha JavaScript 测试框架使用。 查看相关的 帖子,其中有操作指导。

  • Karma—— 是 JavaScript 测试工具中的一个支持,用于利用 TeamCity 服务消息向 TeamCity 报告测试进度。

最后修改日期: 16日 7月 2024年