【问题标题】:TFS 2017 Build Notifications do not include "Associated Changesets" areaTFS 2017 构建通知不包括“关联变更集”区域
【发布时间】:2017-08-16 17:38:45
【问题描述】:

我们最近从 TFS 2010 升级到了 TFS 2017。我们为某些项目设置了构建通知,这些通知会发送电子邮件通知构建是否成功,并提供构建的详细信息。以前,这封电子邮件包含所有失败的单元测试的列表以及相关变更集的列表。但是,在升级到 TFS 2017 后,这些都不会包含在构建通知电子邮件中。据我所知,我们没有对 TFS 2010 的警报模板进行任何修改以将缺失的信息输入到电子邮件中。有没有办法在 TFS 2017 构建通知电子邮件中获取失败的单元测试和相关变更集的列表?

【问题讨论】:

标签: tfs


【解决方案1】:

这是新 vNext 版本的用户声音。变更集数据和关联的工作项似乎没有暴露给默认 BuildCompletedEvent.xsl

使用 TFS 2015 Build (Build vNext) 电子邮件警报不显示相关签入

https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/9754887-using-tfs-2015-build-build-vnext-email-alerts-do

现在您可能需要自定义您的电子邮件提醒 Drive:\%programfiles%\Microsoft Team Foundation Server 1X.0\Application Tier\TFSJobAgent\Transforms\1033 。更多详情请参考Customize the format for TFS email alerts

【讨论】:

【解决方案2】:

我有一个部分解决方案。看起来工作项不可用,但变更集是可用的,只是名称不同。

首先我打开%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 服务:

TFSServiceControl quiesce|unquiesce

我没有提取单元测试失败的源 XML,但如果其他人提取了源 XML,并且它显示了哪些测试失败的详细信息,请分享您更新的 XSL。

【讨论】:

  • 非常感谢您!我们能够在我们的构建通知电子邮件中获得相关的提交(ne:changeset)列表。不幸的是,我们仍然无法获得失败的测试 - 它们似乎没有包含在正在生成的 XML 中。
  • 不幸的是,这是唯一可以添加到模板中的内容。我们还想要工作项,但不支持
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2012-03-14
  • 1970-01-01
  • 2018-08-01
  • 2018-02-23
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多