【问题标题】:Start TeamCity Build via REST Call通过 REST 调用启动 TeamCity Build
【发布时间】:2012-03-15 06:14:07
【问题描述】:

一点背景。

在我的环境中,我们有大量的小型 .NET 解决方案,每个解决方案都在它们自己的 Subversion 存储库中(500 多个)。我们不是 TFS 商店,目前正在评估将我们本土的 CI 流程转移到 TeamCity。

我不想让这 500 多个存储库每隔 5-10 分钟左右轮询一次我们的 Subversion 服务器,而是希望通过 post-commit-hook REST http 调用(就像我们当前的解决方案一样)启动项目构建。然后我希望 TeamCity 从 SVN 更新并开始构建过程。这可能吗?

我看到 TeamCity 有一个 REST API,只是文档很少。我不确定这个示例如何与我配置的任何内容相关联。什么是bt7?它与我配置的项目有什么关系?

http://buildserver:8111/httpAuth/action.html?add2Queue=bt7 

【问题讨论】:

标签: teamcity


【解决方案1】:

bt7 是构建类型标识符。每个构建配置都有一个。您可以使用以下 api 获取完整列表

http://buildserver:8111/httpAuth/app/rest/buildTypes

如果您单击团队城市页面上的任何构建配置,您还可以在 url 中查看构建类型。你会看到一个url参数比如buildTypeId=bt7

【讨论】:

    【解决方案2】:

    bt7 是您的buildTypeId,它是每个构建配置(作业)的唯一 ID。每个项目可以有许多构建配置。

    如果您点击一个项目,然后点击一个特定的构建配置,您的 URL 将类似于...

    http://teacmtiyserver/viewType.html?buildTypeId=bt208

    如果您想排队运行构建配置,只需通过查看 URL 找出它的buildTypeId,然后您可以尝试通过点击您使用的 URL 来运行它。

    【讨论】:

    • 现在我已经获得了构建类型 ID,我需要进行调用。传递凭据似乎无法正常工作。 'username:password@buildserver:8111/httpAuth/…' 并没有开始。
    • 我不确定您需要如何设置 HttpAuth 才能与这样的 URL 正常工作。尝试使用 HTTPS 可能吗?如果这不起作用,也许可以开始另一个问题,或者做一些谷歌搜索......
    • 感谢您的帮助。我已经让它工作了。我以为我对这个事实发表了另一条评论,但我一定没有正确提交。我还验证了在启动新构建时,它会轮询 SVN 以获取最新更改。一切都很好。
    【解决方案3】:

    如果您和我在同一条船上,这可能会帮助您编写对 Team-City 的 REST 调用,尤其是在触发构建和监控它方面。

    • 这是我过去用来触发的示例 JS 客户端 构建。您需要 TeamCity 帐户中的 Bearer Token
    • 这是一个非常标准的令牌,您可以像使用 Git 一样生成它。
    • 这个doc 应该可以帮助您使用不同的帖子正文选项(尽管将 xml 转换为 json)

    const TC_CLIENT = {
      async postBuild() {
        const request = {
          buildType: {
            id: "YOUR_BUILD_TYPE_ID"
          },
          properties: {
            property: [{
                name: "balh",
                value: "blah blah"
              },
              {
                name: "balh",
                value: "blah blah"
              }
            ]
          }
        };
    
        const response = await fetch("http://yourtcserver/app/rest/buildQueue", {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            Accept: "application/json",
            Authorization: "Bearer YOUR_TC_TOKEN"
          },
          body: JSON.stringify(request)
        });
        return await response.json();
      },
    
      async getBuildStatus(buildId) {
        const response = await fetch(
          "http://yourtcserver/app/rest/buildQueue/" + buildId, {
            method: "GET",
            headers: {
              "Content-Type": "application/json",
              Accept: "application/json",
              Authorization: "Bearer YOUR_TC_TOKEN"
            }
          }
        );
        return await response.json();
      }
    };
    
    let sampleBuild = TC_CLIENT.postBuild();
    console.log("Status", TC_CLIENT.getBuildStatus(sampleBuild.id))

    【讨论】:

      最近更新 更多