【问题标题】:Get VCS Changes from TeamCity using NAnt使用 NAnt 从 TeamCity 获取 VCS 更改
【发布时间】:2013-10-18 18:22:24
【问题描述】:

一旦在分支上提交了 svn,我就会使用 TeamCity 触发器来构建所有内容。成功后,它会发送一封电子邮件通知,其中包含导致触发此构建的 VCS 更改。从 TeamCity 的角度来看,这很好用。

现在团队中有多名成员无权访问 TC,也无法设置通知。有了这个,我决定使用 NAnt 的 <mail> 发送此通知以及使用 "${environment::get-variable('BUILD_NUMBER')}" 的内部版本号。这在 teamcity 中运行良好。但是,我还需要在该电子邮件通知的消息中发送触发该构建的更改。

目前 TeamCity 将 VSC 更改格式化为电子邮件,如下所示:

     Changes included (1 change).
     Change 10433 by John Doe (4 files): Issue#245 - Issue description

我希望使用 NAnt 从 TeamCity 生成相同的更改。 TeamCity 使用 build_changes bean 在 common.flt 文件中定义此格式。

**Changes included (${changesLink})
  Change ${mod.displayVersion} ${pers} by ${mod.userName} (${modLink}):
          <i>${description?trim}</i>**

如何在我的 NAnt 消息中使用它?由于 TeamCity 已经知道什么 svn 更改触发了构建,因此最好获取此更改并将其添加到我的电子邮件的 NANT 消息中。有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: teamcity javabeans nant email-notifications


    【解决方案1】:

    我从未使用过 NAnt,但可以提供另外两种解决方案...

    1) 创建一个电子邮件邮寄列表并将所有需要它的人添加到列表中。

    然后创建一个 teamcity 用户,将其电子邮件发送到邮件列表,并为该用户设置所需的通知。

    对此的限制是您必须为每个邮件列表创建一个用户,这可能会占用许可证。

    2) 您可以使用 TeamCity REST API 从正在运行的构建中获取该信息。使用 %teamcity.build.id% 将返回构建 ID 并执行以下查找:

    /httpAuth/app/rest/changes?build=id:%teamcity.build.id%
    

    这将返回构建的所有更改:

    <changes count="3">
       <change href="/httpAuth/app/rest/changes/id:217404" id="217404" version="b6b97a0d7789d97df6df908ab582ebb723235f43" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217404&personal=false"/>
       <change href="/httpAuth/app/rest/changes/id:217403" id="217403" version="064ecef5552ec2fb7875d7c26fe54cdf94b67bec" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217403&personal=false"/>
       <change href="/httpAuth/app/rest/changes/id:217402" id="217402" version="9bc3a34c952059bbfc7bebeb79ba5a3c894ef555" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217402&personal=false"/>
    </changes>
    

    然后循环遍历每个&lt;change&gt; 元素的href url 结果。哪个返回类似:

    <change date="20130918T133404-0600" username="welsh" href="/httpAuth/app/rest/changes/id:217397" id="217397" version="51e925e354a83deccde881b30a76974b2ff745f4" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217397&personal=false">
      <comment>
        My comments are here
      </comment>
      <files>
        <file before-revision="90acd4da1972814094c22e3020c5073521a7b640@141323126c0" after-revision="51e925e354a83deccde881b30a76974b2ff745f4@1413290abe0" file="grails-app/views/layouts/global.gsp" relative-file="grails-app/views/layouts/global.gsp"/>
      </files>
      <user href="/httpAuth/app/rest/users/id:1" id="1" name="Welsh" username="welsh"/>
    </change>
    

    并使用它来构建您的电子邮件,发送给您的电子邮件发送给任何人

    【讨论】:

    • 谢谢。我以前从未使用过 TeamCity 的 RestAPI。根据您的解决方案,我能够获得 teamcity.build.id 并且由于这是 xml 格式,我决定在 nant 中执行 以获取计数和 svn 修订版。如果计数大于 0,那么我会生成一个 svn 日志,其中包含现在可以在电子邮件消息中发送的更改。现在完美运行。再次感谢。
    • 嘿,Welsh。我知道你说过你从未使用过 NAnt,但这可能是 TeamCity 的事情。在 Build Step TC 配置设置中,如果我在粘贴 Build 时使用 /httpAuth/app/rest/changes?build=id:%teamcity.build.id%文件内容,它返回build.id 很好,但如果我在构建Nant 文件中使用它TeamCity 不会返回build.id。我更喜欢通过指定路径来调用 Nant 文件,而不是将其粘贴到 TeamCity 中。你知道这是为什么吗?
    • TeamCity 将 %teamcity.build.id% 替换为实际的 build.id(如果它具有可见性)。因此,如果您的 NAnt 构建文件中只有该文本,TC 不知道替换它,因为 NAnt 进程被分叉了。但是,如果您使用的是 TC Integrated NAnt 运行器,您应该可以使用选项Command line parameters: 并传入-D:arg.buildId=%teamcity.build.id%。然后在您的 NAnt 脚本中使用 ${arg.buildId}.
    • 啊。明白了,有道理。我将使用 build.id 的参数。应该管用。非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2012-12-28
    • 1970-01-01
    • 2014-06-23
    • 2016-01-19
    相关资源
    最近更新 更多