我们最近从TFS 2010升级到2017年TFS。我们为某些项目设置了通知,无论构建成功还是失败,都会发送电子邮件。此前,此电子邮件包含失败的任何单元测试列表以及相关变更集列表。但是,在升级到TFS 2017之后,这些都不会包含在构建通知电子邮件中。据我所知,我们没有对TFS 2010的警报模板进行任何修改,以便将丢失的信息输入到电子邮件中。有没有办法在TFS 2017构建通知电子邮件中获取失败的单元测试和相关变更集的列表?
答案 0 :(得分:5)
我有部分解决方案。它看起来不像工作项可用,但更改集只有一些不同的名称。
首先,我打开了%programfiles%\Microsoft Team Foundation Server 1X.0\Application Tier\TFSJobAgent\Transforms\1033\BuildCompletedEvent.xsl
并用一些东西替换了它的内容,只是将源xml转储回来。保留此文件的旧内容,因为您以后需要对其进行编辑。
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
检查一些代码并启动一个可以获取它的构建,然后查看构建通知电子邮件,以查看提供该XSL模板的源XML。您将看到AssociatedChangeset已成为AssociatedCommit以及其他一些小变化。我很惊讶微软会改变模型的架构并忽略阅读该模型的模板。
替换BuildCompletedEvent.xsl中的所有原始内容,然后在tb:BuildCompletedEvent
模板中找到:
<xsl:if test="count(tb:Build/tb:Information/tb:BuildInformationNode[@Type = 'AssociatedChangeset']) > 0">
<h2 style="font-size: 12pt; margin-bottom: 0em;">
<span _locID="AssociatedChangesets">Associated Changesets</span>
</h2>
<div style="margin-left:1em">
<table style="font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-size: 10pt;">
<xsl:apply-templates select="tb:Build/tb:Information/tb:BuildInformationNode[@Type = 'AssociatedChangeset']">
<xsl:sort select="tb:Fields/tb:InformationField[@Name = 'ChangesetId']/@Value"/>
</xsl:apply-templates>
</table>
</div>
</xsl:if>
并把它放在它之前:
<xsl:if test="count(tb:Build/tb:Information/tb:BuildInformationNode[@Type = 'AssociatedCommit']) > 0">
<h2 style="font-size: 12pt; margin-bottom: 0em;">
<span _locID="AssociatedCommits">Associated Commits</span>
</h2>
<div style="margin-left:1em">
<table style="font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-size: 10pt;">
<xsl:apply-templates select="tb:Build/tb:Information/tb:BuildInformationNode[@Type = 'AssociatedCommit']">
<xsl:sort select="tb:Fields/tb:InformationField[@Name = 'CommitId']/@Value"/>
</xsl:apply-templates>
</table>
</div>
</xsl:if>
实际的变更集模板,找到这个:
<xsl:template match="tb:BuildInformationNode[@Type = 'AssociatedChangeset']">
<tr>
<td style="padding-right:2em">
<strong>
<xsl:value-of select="tb:Fields/tb:InformationField[@Name = 'CheckedInBy']/@Value"/>.
</strong>
<xsl:call-template name="linefeed2br">
<xsl:with-param name="StringToTransform" select="tb:Fields/tb:InformationField[@Name = 'Comment']/@Value"/>
</xsl:call-template>
-
<a>
<xsl:attribute name="href">
<xsl:value-of select="tb:Fields/tb:InformationField[@Name = 'WebAccessUri']/@Value"/>
</xsl:attribute>
Changeset <xsl:value-of select="tb:Fields/tb:InformationField[@Name = 'ChangesetId']/@Value"/>
</a>
</td>
</tr>
</xsl:template>
并把它放在它之前:
<xsl:template match="tb:BuildInformationNode[@Type = 'AssociatedCommit']">
<tr>
<td style="padding-right:2em">
<strong>
<xsl:value-of select="tb:Fields/tb:InformationField[@Name = 'Author']/@Value"/>.
</strong>
<xsl:call-template name="linefeed2br">
<xsl:with-param name="StringToTransform" select="tb:Fields/tb:InformationField[@Name = 'Comment']/@Value"/>
</xsl:call-template>
-
<a>
<xsl:variable name="href" select="tb:Fields/tb:InformationField[@Name = 'Uri']/@Value"/>
<xsl:variable name="fragment" select="'/_apis/tfvc/changesets/'"/>
<xsl:attribute name="href">
<!--<xsl:value-of select="replace(tb:Fields/tb:InformationField[@Name = 'Uri']/@Value, '/_apis/tfvc/changesets/', '/_versionControl/changeset/')"/>-->
<xsl:value-of select="substring-before($href,$fragment)"/>
<xsl:value-of select="'/_versionControl/changeset/'"/>
<xsl:value-of select="substring-after($href,$fragment)"/>
</xsl:attribute>
Changeset <xsl:value-of select="tb:Fields/tb:InformationField[@Name = 'CommitId']/@Value"/>
</a>
</td>
</tr>
</xsl:template>
请注意,XML中的Uri返回JSON以进行API集成,因此将字符串替换为使其成为Web UI的链接。我在使replace()
函数工作时遇到问题,因此存在子串。
http://tfs:8080/tfs/DefaultCollection/_apis/tfvc/changesets/10516
http://tfs:8080/tfs/DefaultCollection/_versionControl/changeset/10516
我添加到现有模板而不是更改损坏的引用。我提出了一些希望,即如果TFS升级将模型名称更改回原来的名称,那么模板仍会匹配它们并将其拉出来,而无需编辑任何内容。
另请注意,更改后,需要执行某些操作才能让TFS查看新模板。执行此操作时,我正在重新启动TFS服务:https://www.visualstudio.com/en-us/docs/setup-admin/tfs/command-line/tfsservicecontrol-cmd
我没有通过失败的单元测试来提取源XML,但是如果其他人做了并且它显示了哪些测试失败的详细信息,请分享您更新的XSL。
答案 1 :(得分:2)
这是新vNext构建的用户语音。变更集数据和相关工作项似乎没有暴露给默认 BuildCompletedEvent.xsl
使用TFS 2015 Build(Build vNext)电子邮件提醒不会显示相关的签到
目前,您可能需要自定义电子邮件提醒Drive:\%programfiles%\Microsoft Team Foundation Server 1X.0\Application Tier\TFSJobAgent\Transforms\1033
。更多详情请参阅Customize the format for TFS email alerts