使用TeamCity REST API跟踪构建进度

Knu*_*ius 9 rest teamcity continuous-integration

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

HTTP://teamcity/httpAuth/action.html add2Queue = [buildTypeId]名称= [PROPNAME]值= [propValue]

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

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

HTTP://的TeamCity/httpAuth /应用程序/静止/建立/定位器= buildType:[buildTypeId]

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

Knu*_*ius 11

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

我发现即使您没有使用"/ builds /?locator = buildType:x"调用获得有关自定义构建属性的任何信息,您也可以为该列表中的每个构建提取构建ID,然后执行另一个REST调用,以获取有关特定构建的更多详细信息.其余的电话看起来像这样:

http://teamcity/httpAuth/app/rest/builds/id:{0}
Run Code Online (Sandbox Code Playgroud)

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

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

将构建添加到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上寻找匹配,如果我得到一个,我返回构建的状态(FAILED,SUCCESS等).

3:如果步骤1或2中的BuildIdentifier没有匹配,我可以假设构建在队列中,所以我将其作为当前状态返回.

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

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


Dre*_*ner 5

Queued Builds Rest api 是实现此目的的最佳方法,但从 8.1 版本开始才可用。

  • 要开始构建,请发送 POST 请求,~/httpAuth/app/rest/buildQueue如下所示

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

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

与之前的 API 相比,这是一个巨大的改进。