TFS 2017构建通知不包括“关联的变更集”区域

时间:2017-03-23 22:47:33

标签: tfs tfs2017

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

2 个答案:

答案 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)电子邮件提醒不会显示相关的签到

     

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