9

我使用 TeamCity (7.0) REST API 来允许开发人员触发自定义构建。我将构建添加到队列中,如下所示:

http://teamcity/httpAuth/action.html?add2Queue=[buildTypeId]&name=[propName]&value=[propValue]

我的问题是如何最好地跟踪刚刚触发的构建进度。REST 调用不会返回有关分配给构建的构建 ID 的任何信息,因此即使我轮询构建列表(正在运行/已完成),我也不知道其中一个是否是我触发的。队列中可能有相同 buildTypeId 的多个构建,因此我需要一种方法来分离出我所追求的那个。

我在某处读到一个建议,您可以为放入队列中的每个构建添加一个具有唯一值的构建属性,然后轮询构建列表并查找具有该确切属性值的构建列表。然而,我还没有找到一种列出构建属性的方法,所以我仍然卡住了。此 REST 调用不提供有关属性的信息:

http://teamcity/httpAuth/app/rest/builds/?locator=buildType:[buildTypeId]

关于如何解决这个问题的任何建议?理想情况下,我想知道构建是否在队列中,是否正在运行,以及何时完成我想获得状态。然而,最重要的是要知道它是否已完成以及状态如何。

4

3 回答 3

11

经过一些进一步的调查,我想出了一个似乎工作正常的解决方案:

我发现即使您没有使用“/builds/?locator=buildType:x”调用获得有关自定义构建属性的任何信息,您也可以提取该列表中每个构建的构建 ID,然后执行另一个 REST 调用以获取有关一个特定构建的更多详细信息。其余调用如下所示:

http://teamcity/httpAuth/app/rest/builds/id:{0}

此调用的响应将为您提供一个“构建对象”,其中包含构建属性列表等。

我跟踪构建进度的解决方案是这样的:

将构建添加到 TeamCity 队列时,我首先将一个名为“BuildIdentifier”的属性添加到 URL。该值只是一个 GUID。我将此标识符传递回客户端应用程序,然后客户端开始轮询服务器,询问具有此特定标识符的构建状态。然后服务器通过一些步骤来识别构建的当前阶段:

1:检查构建是否正在运行。我通过调用“/builds?locator=running:true”获取正在运行的构建列表,遍历构建并使用构建 ID 查询 REST API 以获取详细信息。然后,我会查看每个正在运行的构建的详细信息,以寻找与我从客户端收到的具有匹配“BuildIdentifier”属性的构建。如果在其中一个正在运行的构建中存在匹配项,我会向正在跟踪进度的客户端发送一条响应,其中包含构建正在以 x%(构建对象的 PercentageComplete 属性)运行的消息。如果未找到匹配项,我将继续执行第 2 步。

2:检查是否完成:首先使用“/builds/?locator=buildType:x”调用获取最新的构建列表。然后执行与步骤 1 相同的操作,并从列表中提取 X 个最新版本(我选择了 5)。为了限制 REST 调用的数量,我假设构建将在最新的 5 个构建中完成。然后,我在 BuildIdentifier 上查找匹配项,如果找到匹配项,则返回构建状态(失败、成功等)。

3:如果第 1 步或第 2 步中的 BuildIdentifier 不匹配,我可以假设构建在队列中,因此我将其作为当前状态返回。

在客户端,只要状态表明构建在队列中或正在运行,我就会每 x 秒轮询一次服务器的状态。

如果还有其他人遇到同样的问题,希望这个解决方案会有所帮助!如果您使用 TeamCity REST API,我认为跟踪触发构建的进度是一项非常常见的任务。

于 2012-08-17T06:32:34.080 回答
4

Queued Builds rest api 是完成此任务的最佳方式,但仅在 8.1 版后才可用。

  • 要开始构建,请发送一个 POST 请求来~/httpAuth/app/rest/buildQueue喜欢这个

    {
        buildType: { id: "bt667" },
        branchName: "master",
        properties: {
            property: [
                { "name": "Property", "value": "test" }
            ]
        }
    }
    
  • 响应包含一个可用于检查构建状态的 href。

    {
        ...
        "href": "/httpAuth/app/rest/buildQueue/taskId:49337",
        ...
    }
    
  • 要检查排队的构建状态,请向步骤 1 的响应中指定的 href 发送 GET 请求。

这是对以前 API 的巨大改进。

于 2014-08-06T22:51:19.613 回答
1

从 TeamCity 8.1 开始,REST API 获得了触发构建和跟踪排队构建结果的专用方法,因为构建队列请求返回指向排队构建的链接,该链接稍后可用于跟踪构建的当前状态。请参阅TeamCity 文档中的详细信息。

于 2014-07-31T11:44:09.217 回答