服务消息
服务消息是特别构造的文本片段,用于从构建脚本向 TeamCity 服务器传递构建的命令 / 信息。
要被 TeamCity 处理,它们需要被写入到构建的标准输出流中,即从构建步骤中打印或回显。
示例:
单个服务消息内不能包含换行符,不能跨越多行。
服务消息格式
服务消息支持两种格式:
单属性消息:
##teamcity[<messageName> 'value']多属性信息:
##teamcity[<messageName> name1='value1' name2='value2']多属性消息可以更正式地描述为:
##teamcity[messageNameWSPpropertyNameOWSP=OWSP'value'WSPpropertyName_IDOWSP=OWSP'value'...OWSP]
where:
messageName
是消息的名称,例如flowStarted
或setParameter
。propertyName
是消息属性的名称。 必须是有效的 Java ID。值
是属性的值。 必须是一个 escaped value。WSP
是必需的空格:空格或制表符(\t
)。OWSP
是一个可选的空格。...
是任何数量的WSPpropertyNameOWSP=OWSP'value'
块。
转义值
对于转义值,TeamCity 使用竖线 |
作为转义字符。 为了让 TeamCity 服务器正确解释某些特殊字符,它们必须以竖线开始。 例如,以下信息:
将在 TeamCity 中显示为 foo 的测试
。 请参考下面的转义值表格。
字符 | 作为 Escape |
---|---|
'(撇号) | |' |
\n (换行符) | |n |
\r (回车) | |r |
\uNNNN(unicode 符号,代码为 0xNNNN) | |0xNNNN |
| (竖线) | || |
[(开括号) | |[ |
]"(闭合括号) | |] |
向构建日志报告消息
您可以按照以下方式向构建日志报告消息:
where:
状态
可以取以下值:正常
(默认),警告
,失败
,错误
。只有当
状态
为错误
时,才会使用errorDetails
,在其他情况下,它会被忽略。
如果此消息的状态为错误
,并且在构建配置的 构建失败条件 页面上勾选了 "如果构建运行程序记录了错误消息,则失败构建 "框,则此消息会导致构建失败。 例如:##teamcity[message text='Exception text' errorDetails='stack trace' status='ERROR']
服务消息的块
块"被用于在构建日志中对多个信息进行分组。
区块开启:
blockOpened
系统消息具有 名称
属性,您也可以添加它的描述:
块关闭:
报告编译信息
where:
compiler_name
是执行编译的编译器的任意名称,例如,javac
或groovyc
。 目前,它被用作构建日志中的块名称。任何在
编译已开始
和compilationFinished
之间报告的具有状态错误
的消息将被视为编译错误。
消息 FlowId
任何消息都支持可选属性 flowId
。 在以下示例中, <messageName>
是特定服务消息的名称。
flowId
是构建中消息流的唯一标识符。 流程跟踪是必要的,例如,用于区分并行运行的不同进程。 标识符是一个字符串,必须在单个构建的范围内保持唯一。
在大多数情况下, flowId
是启动消息流程所需的唯一属性。
当您绝对需要在现有流程中以子流程的形式而不是在根流程中启动流程时,请添加 flowStarted
参数,并将父流程 ID 指定为 父项
参数。 未指定父级的流程会在当前步骤的根流程内开始。
要结束子流程,请使用 flowFinished
参数。 结束一个父流程会自动关闭所有的子流程,但我们建议明确声明流程的顺序:
这个自定义子流程顺序影响了构建日志中报告的顺序,并允许以子树的形式报告结果。
报告测试
要使用 TeamCity 的即时测试报告,测试框架需要为此功能提供专门的支持(或者,可以使用 XML 报告处理)。 如果 TeamCity 原生不支持您的测试框架,您可以修改构建脚本,使用服务消息向 TeamCity 服务器报告测试运行。 这使得可以实时显示测试结果,在 测试 标签下的 构建结果 页面中提供测试信息。
消息创建时间戳
测试报告消息支持可选属性 时间戳
。 在以下示例中, <messageName>
是特定服务消息的名称。
时间戳格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
或 yyyy-MM-dd'T'HH:mm:ss.SSS
,依照 Java SimpleDateFormat 语法 规则。
示例:
对于 .NET DateTimeOffset,一段代码可能像这样
将导致
受支持的测试 ServiceMessages
测试套件消息: 测试套件用于对测试进行分组。 TeamCity 在 Tests 标签页以及 Build Results 页面和其他地方展示按套件分组的测试。
所有单独的测试消息都应在 testSuiteStarted
和 testSuiteFinished
(按此顺序)之间显示,并具有相同的 名称
属性。
嵌套测试报告
启动另一个测试会结束在同一 flow 中已开始的测试。 要在其他测试中继续报告测试,您将需要在嵌套的测试服务消息中指定另一个 flowId
。
测试开始/停止消息:
指示 testName
已运行。 如果 testFailed
消息不存在,那么此测试被视为成功。
持续时间
(可选的数值整型属性)设置以毫秒为单位的测试持续时间,以在 TeamCity UI 中报告。 如果省略,测试持续时间将根据消息的时间戳来计算。 如果时间戳丢失 — 从服务器上接收消息的实际时间开始。captureStandardOutput
(可选布尔属性)——如果是true
,那么在testStarted
和testFinished
消息之间收到的所有标准输出和标准错误消息将被视为测试输出。 默认值为false
:假设使用testStdOut
和testStdErr
服务消息来报告测试输出。
强烈建议您确保 测试套件
+ 测试名称
在构建中是唯一的。 为了使 TeamCity 的高级测试相关功能正常工作,测试名称在每次构建时都不能有所偏离(单个测试必须在每次构建中报告相同的名称)。 在报告的测试名称中包含绝对路径是 强烈反对 的。
已忽略的测试:
指示 testName
存在,但未被测试框架运行(被忽略)。 作为一个例外, testIgnored
消息可以在没有匹配的 testStarted
和 testFinished
消息的情况下被报告。
测试输出:
testStdOut
和 testStdErr
服务消息报告测试的标准和错误输出,以在 TeamCity UI 中显示。 每个测试只能有一个 testStdOut
和一个 testStdErr
消息。 一个替代但不太可靠的方法是使用 captureStandardOutput
消息的 testStarted
属性。
测试结果:
指示 testname
测试失败。 对于给定的测试名称,只能出现一个 testFailed
消息。
消息
包含了错误的文字描述。详细信息
包含了关于测试失败的详细信息,通常是一条消息和一个异常堆栈跟踪。实际
和预期
属性只能与type='comparisonFailure'
一起使用,来报告比较失败。 这些值将在在集成开发环境中打开测试时使用。
这是一个关于通过服务消息进行测试报告的较长示例:
启用测试重试
您可以为构建配置启用 test retry 的支持。 启用此选项后,测试的成功运行将阻止其之前的失败,这意味着如果测试在同一构建中失败然后成功,TeamCity 将会对该测试进行静音处理。
此类测试将不会影响构建状态。
解读测试名称
全名测试可以采用以下形式: <套件名称>:<包 / 命名空间名称>.<类名称>.<测试方法>(<测试参数>)
,其中, <class name>
和 <test method>
的名称中不能包含点。 只有 <test method>
是完整测试名称的必要部分。
完整的测试名称用于比较连续构建之间的测试或匹配不同构建配置的测试。
全名测试的示例:
Tests 标签位于Build Results页面上,允许按照套件、包/命名空间、类和测试进行分组。 通常,属性值是由您的测试框架报告的,而 TeamCity 能够正确解释测试名称。
如果测试无法按照上述形式解析,TeamCity 仍会尝试从完整的测试名称中提取 <suite name>
,以便在 Tests 标签上进行筛选,并将套件后面的所有内容视为无法解析的测试名称。
报告额外的测试数据
可以使用 testMetadata
服务消息将额外信息附加到测试上。 更多详情可在 独立页面 上查看。
报告 .NET 代码覆盖率结果
您可以通过服务消息来配置 .NET 覆盖率处理。 要了解更多信息,请参考 手动配置报告覆盖率 页面。
报告检查
您可以使用下面描述的服务消息,从自定义工具向 TeamCity 报告检查结果。
除其他用途外,检查次数可用作构建度量,以便于构建失败时使用。
检查类型
代码中的每一个特定警告或错误(检查实例)都有一个检查类型 —— 这是已进行检查的唯一描述,可以通过报告。
在这里,所有的属性都是必需的,且可以是数字或者文本值:
iD
— (必填)限制在 255 个字符以内名称
— (必填)限制在 255 个字符以内类别
—(必填)字符限制为255个。 属性类别
的示例包括“样式违规”和“调用合约”。描述
— (必填)限制为 4000 个字符。 描述也可以是 HTML 格式。 例如,
检查实例
报告特定的缺陷、警告、错误信息。 包括位置、描述以及各种可选和自定义属性。
所有属性都可以具有数字值或文本值:
typeId
— (必填),引用上述inspectionType.id
,限制为 255 个字符。消息
—(可选)当前实例描述,限制为4000个字符。文件
— (必填)文件路径限制为4000个字符。 路径可以是绝对的,也可以相对于 checkout directory。一样
—(可选)文件的行,整数。附加属性
可以是任何属性,严重性
常在此使用,其值可以是以下之一(注意大写):信息
、错误
、警告
、弱警告
。
示例:
在构建过程中发布工件
您可以在构建仍在运行时,立即在构建出的构件后发布构建构件。
要做到这一点,您需要输出以下行:
<path>
必须遵循与 构建工件规范 相同的规则,这是 构建配置设置 的一部分。 符合 <path>
的文件将被上传,作为正在运行的构建的工件可见。
所有文件准备就绪且没有任何文件被锁定以阻止读取后,应打印此消息。
构件会在后台上传,这可能需要一些时间。 确保在构建结束之前不删除匹配的文件(例如,您可以将它们存放在下次构建开始时清理的目录中,放在 临时目录中,或是使用 Swabra 在构建后清理它们)。
在构建配置设置中指定的 Artifacts 将会按常规发布。
在步骤之间传递 NuGet 包
如果您需要发布 NuGet 包,然后在一个构建过程中使用它们的内容,您希望能够确保它们及时发布和索引,而不是在构建结束时。
为此,您可以使用 NuGet Publish 运行器,或者在任何步骤中发送 ##teamcity[publishNuGetPackage]
服务消息。 这确保了 NuGet 包在当前步骤结束时发布到所有配置的 NuGet 源,并在接下来的构建步骤中可用。
报告构建进度
您可以使用特殊的进度消息来标记构建脚本中的长时间运行部分。 这些消息将显示在相应构建的项目仪表板以及 Build Results 页上。
要记录单条进度信息,请使用:
此进度消息将一直显示,直到出现另一条进度消息或者下一个目标开始(在 Ant 构建的情况下)。
如果您只希望为构建的一部分显示进度消息,请使用:
报告构建问题
要直接从构建脚本中失败构建,必须报告构建问题。 构建问题会影响构建状态文本。 它们会显示在 Build Results 页面上。 要在构建中添加一个构建问题,请使用:
where:
描述
(必填):用来描述构建问题的人类可读的纯文本。 默认情况下,描述
会出现在构建状态文本和构建问题列表中。 文本仅限于4000个符号,如果超出限制,将会被截断。身份
(可选):一个独特的问题 ID。 不同的问题必须有不同的标识,相同的问题 — 同样的标识,如果相同的问题,例如,相同的编译错误发生,则在整个构建过程中这个标识不应该改变。 它必须是一个有效的 Java ID,最多包含 60 个字符。 如果省略,身份
将根据描述
文本进行计算。
报告构建状态
使用 buildStatus
来设置 构建状态文本。
与设计用于反映构建状态中当前正在进行的操作的 进度消息 不同, buildStatus
消息设定了构建完成后持久存在的最终构建状态。
您可以添加单独的步骤,并使用不同的步骤执行条件来区分"绿色"构建和失败的构建,并为它们每一个设置不同的自定义状态。
默认状态文本可以通过 {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
消息:
在 <new build number> 值中,您可以使用 {build.number}
替代,使用 TeamCity 自动生成的当前构建编号。 例如:
添加或更改构建参数
通过在构建脚本中使用专用服务消息,您可以直接从构建步骤中动态更新构建参数(参数需要在构建配置的 Parameters 部分中定义)。 更改的构建参数将在修改后的构建步骤中可用。 他们也将作为构建参数可用,并且可以通过 %\dep.*% 参数引用
在依赖构建中使用,例如:
在指定构建参数的名称时,请注意前缀:
system
用于系统属性。env
用于环境变量。配置参数无前缀。
阅读更多关于构建参数及其前缀的信息。
报告构建统计
在 TeamCity 中,您可以配置构建脚本以报告统计数据,然后根据这些数据显示图表。 请参考 定制统计图表 页面,了解如何在网页用户界面上展示图表。 此部分介绍如何通过服务消息报告构建脚本的统计数据。 您可以通过两种方式发布构建静态值:
在构建脚本中直接使用服务消息
通过 teamcity-info.xml 文件提供数据
要使用服务消息报告构建统计信息:为您要报告的每个统计值指定以下格式的buildStatisticValue
服务消息:
where
密钥
必须不等于任何一个 预定义键。值
必须是最多13位的正整数或负整数;同时也支持最多含6位小数的浮点数。
禁用服务消息处理
如果您出于某种原因需要禁用在输出中搜索服务消息,您可以通过消息禁用服务消息搜索:
出现在这两者之间的任何消息都不会被解析为服务消息,而且实际上会被忽略。 对于服务器端处理的服务消息,启用/禁用服务消息也支持 flowId
属性,并将仅忽略具有相同 flowId
的消息。
导入 XML 报告
除了 UI 构建功能外,还可以借助 importData
服务消息在构建脚本内部配置 XML 报告。 此外,该消息支持导入先前收集的代码覆盖率和代码审查/重复报告。
服务消息的格式是:
在哪里 typeID
可以是以下之一(也请参见 XML 报告处理):
typeID | 描述 |
---|---|
测试框架 | |
| JUnit Ant 任务 XML 报告 |
| Maven Surefire XML 报告 |
| NUnit-Console XML 报告 |
| MSTest XML 报告 |
| VSTest XML 报告 |
| Google Test XML 报告 |
代码检查 | |
| IntelliJ IDEA 检查结果 |
| Checkstyle 检查 XML 报告 |
| FindBugs 检查 XML 报告 |
| JSLint XML 报告 |
| ReSharper |
| FxCop 检查 XML 报告 |
| PMD 检查 XML 报告 |
代码重复 | |
| PMD 复制/粘贴检测器 (CPD)XML 报告 |
| ReSharper |
代码覆盖率 | |
| 由 dotcover、partcover、ncover 或 ncover3 生成的 XML 报告 |
备注:
仅支持在
路径
属性中的特定文件。还需要指定
findBugsHome
属性,指向已安装的 FindBugs 工具的主目录。还需要
工具='<工具名称>'
服务消息属性,其中<tool name>
是dotcover
,partcover
,ncover
或ncover3
。
除非特别注明,否则报告类型支持在 路径
属性中使用类似 Ant 的通配符。
verbose='true'
属性将在构建日志中启用详细记录。parseOutOfDate='true'
属性将处理所有与路径匹配的文件。 默认情况下,仅处理在构建期间更新的(由最后修改时间戳确定)的文件。 如果发现任何不匹配的报告,构建日志中将出现 "报告由于过期而被跳过" 的消息。whenNoDataPublished=<action>
(其中<action>
为以下之一:信息
(默认),无任何内容
,警告
,错误
)如未找到与指定路径匹配的报告,将更改输出级别。(已弃用,请改用 构建失败条件)
findBugs
,pmd
或checkstyle
importData 消息还会接受可选的errorLimit
和warningLimit
属性,用于指定错误和警告限制,超过此限制将导致构建失败。
要启动对多个目录的监控,或解析多种类型的报告,请依次发送相应的服务消息。
将文件写入构建日志
发送以下服务消息以开始跟踪文件的内容,并将其新行写入构建日志。
类型
— 始终等于 '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 频道中发布更新。
TeamCity 通过 Slack 连接 来发送 Slack 消息。 如果您还没有创建 Slack 连接,请转到 Administration | Project Settings | Connections 并创建一个。
打开 Slack 连接的设置,并将 Notifications limit 设置为任何正数。 此值指定了构建配置每次运行可以发送的消息的最大数量。
出于安全原因,只允许在消息中添加指向同一 TeamCity 服务器的链接。 带有指向外部网络资源的 URL 的消息会自动被阻止,并在 "teamcity-notifications.log" 文件中写入相应的消息(Administration | Diagnostics | 服务器日志)。
如果您需要包含指向外部资源的链接,请在 允许的主机名 字段中输入它们的主机名。 使用逗号(,)作为分隔符输入多个值,使用星号(*)作为任意字符串的通配符(例如,*.test.co.uk)。
一旦配置了 Slack 连接,您可以按照以下格式在构建脚本中添加服务消息:
##teamcity[notification notifier='slack' message='Line 1 |rLine2 |rLine3' sendTo='build_farm_alerts' connectionId='PROJECT_EXT_2']notifier(通知程序)
— 始终等于 "slack"。消息
— 显示的信息。 支持 Markdown 语法(除了用于换行的 "\n",请使用 "|n" 或 "|r" 作为替代)。sendTo
— 指定谁应接收此消息。 接受单个 Slack 频道名称、频道 ID(以 "C" 开头,例如 "C052UHDRZU7")或用户 ID(以 "U" 开头,例如 "U02K2UVKJP7")作为值。 如果您需要向多个收件人发送相同的信息,请创建带有不同sendTo
值的多个服务消息。connectionID
— 这是一个可选参数,允许您选择 TeamCity 应该用来发送此消息的特定 Slack 连接。 接受连接 ID 作为值。 如果没有指定此参数,TeamCity 将检索当前项目中可用的所有 Slack 连接,并选择 通知限制 不为零的那一个。
运行构建以确保所有 Slack 消息都已发送。
发送自定义电子邮件消息
您可以使用 TeamCity 服务消息从构建脚本内部发送电子邮件。
导航至 Administration | Email Notifier 并设置通用的 Notifier 设置:发件人的电子邮件,SMTP 登录和密码,连接安全协议等等。 参见此链接以获取示例:设置 Google 邮箱作为通知服务器。
将 Notifications limit 设置为任何正数。 此值指定了构建配置每次运行可以发送的消息的最大数量。
将收件人列表输入到 允许的地址 中。 向此列表外的收件人发送的消息将被自动阻止。 使用逗号(,)作为分隔符来输入多个地址,以及使用星号(*)作为通配符来替代任何字符串(例如,*@gmail.com)。
出于安全原因,只允许在消息中添加指向同一 TeamCity 服务器的链接。 带有指向外部网络资源的 URL 的消息会自动被阻止,并在 "teamcity-notifications.log" 文件中写入相应的消息(Administration | Diagnostics | 服务器日志)。
如果您需要包含指向外部资源的链接,请在 允许的主机名 字段中输入它们的主机名。 使用逗号(,)作为分隔符输入多个值,使用星号(*)作为任意字符串的通配符(例如,*.test.co.uk)。
一旦设置了电子邮件通知程序,您可以按照以下格式向构建脚本中添加服务消息:
##teamcity[notification notifier='email' message='Message body' subject='Email subject' address='user1@gmail.com,user2@yourcompany.com']notifier(通知程序)
— 总是等于 "email"。消息
— 这是以纯文本格式显示的消息主体。subject
— 这是电子邮件的主题。地址
— 来自电子邮件通知程序的 允许的地址 列表中的一个或多个地址。
运行构建以确保所有电子邮件都被送达。
通过服务消息取消构建
如果您需要从脚本中取消构建,例如,由于环境原因无法正常进行构建,或者应从子进程中取消构建,您可以使用以下的服务消息:
如有必要,您可以在取消后重新将构建添加到队列中。 默认情况下,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 1,PHPUnit Listener 2—— 这些监听器可以通过 PHPUnit 的
suite.xml
插入,为测试生成 TeamCity 服务消息。Python 单元测试报告发送至 TeamCity—— 这是一个自动将单元测试报告发送至 TeamCity 服务器的包,通过服务消息 (当在 TeamCity 下运行并且提供的测试代码已适应使用它)。
Mocha — 通过服务消息进行即时汇报,供 Mocha JavaScript 测试框架使用。 查看相关的 帖子,其中有操作指导。
Karma—— 是 JavaScript 测试工具中的一个支持,用于利用 TeamCity 服务消息向 TeamCity 报告测试进度。