【问题标题】:Microsoft.TeamFoundation.Build.WebApi Get Build Status Launched by PR policyMicrosoft.TeamFoundation.Build.WebApi 获取 PR 策略启动的构建状态
【发布时间】:2019-09-14 00:37:45
【问题描述】:

在我们的管道中,我们以编程方式创建拉取请求 (PR)。被合并的分支有一个启动构建的策略。此构建需要可变的时间。我需要查询构建状态直到它完成(或长时间超时),以便我可以完成 PR,并清理临时分支。

我正在尝试弄清楚如何获取由 PR 启动的构建,以便我可以使用 Microsoft.TeamFoundation.Build.WebApi 检查状态,但是 BuildHttpClientBase.GetBuildAsync 的所有重载都需要一个构建 ID,它我没有。我想避免使用 Azure Build REST API。有谁知道我如何在没有构建 ID 的情况下使用 BuildHttpClientBase 让 PR 启动构建?

不幸的是,文档没有提供很多关于功能的细节。

【问题讨论】:

  • 如果您使用的是Microsoft.TeamFoundation.Build.WebApi,那么您就是在使用 REST API。这些库只是使 REST API 交互更容易的 SDK。
  • 是的,这就是为什么我很惊讶 SDK 似乎无法在没有构建 ID 的情况下查询构建的原因,因为您似乎可以从 API 中查询。
  • 哦,我看到你对我想避免使用其余 api 的声明感到困惑。我的意思是我不想自己构建 Rest API 调用,而是更愿意使用 SDK。

标签: azure build azure-devops pull-request


【解决方案1】:

回答您提出的问题:

似乎不太容易找到为拉取请求提供单一确定性构建 ID 的调用。

如前所述,您可以使用BuldHttpClient.GetBuildsAsync() 根据分支、存储库、请求用户和原因过滤构建。

根据您需要通过的分支,在请求中添加 BuildReason.PullRequest 值可能是多余的。

var pr = new GitPullRequest(); // the PR you've received after creation
var requestedFor = pr.CreatedBy.DisplayName;
var repo = pr.Repository.Id.ToString();
var branch = $"refs/pull/{pr.PullRequestId}/merge";
var reason = BuildReason.PullRequest;

var buildClient = c.GetClient<BuildHttpClient>();
var blds = await buildClient.GetBuildsAsync("myProject", 
                                            branchName: branch,
                                            repositoryId: repo,
                                            requestedFor: requestedFor,
                                            reasonFilter: reason,
                                            repositoryType: "TfsGit");

在您提到的问题中,您提到想要为拉取请求构建(单数),这意味着您只有一个构建定义充当策略门。此方法可以根据目标分支上的策略配置返回多个 Builds。但是,如果这是您的设置,那么您的问题将是询问您等待完成 PR 的所有相关构建,这似乎是合乎逻辑的。

我正在查看 Policy Evaluations 以查看是否有更直接的方法来获取正在通过策略运行的构建的 ID,但我无法按照以下方式正确格式化请求:

使用唯一标识拉取请求的工件 ID 检索评估。要为拉取请求生成工件 ID,请使用此模板:

vstfs:///CodeReview/CodeReviewId/{projectId}/{pullRequestId}

即使使用 GetById 方法在 PR 上的 artifactId 字段中返回的值也会导致 Doesn't exist or Don't have access 响应,因此如果其他人知道如何使用此方法并且如果它给出了正在评估的准确构建 ID对于策略配置,我很高兴听到它。


获得您真正想要的东西的替代方法

听起来分支策略的唯一用途是在完成合并之前运行“门构建”。

为什么不用create the PR 自动完成。

名称 - autoCompleteSetBy

类型 - IdentityRef

描述 - 如果设置,则为此拉取请求启用自动完成,这是启用它的身份。

var me = new IdentityRef(); // you obviously need to populate this with real values
var prClient = connection.GetClient<GitHttpClient>();
await prClient.CreatePullRequestAsync(new GitPullRequest()
                                      {
                                          CreatedBy = me,
                                          AutoCompleteSetBy = me,
                                          Commits = new GitCommitRef[0],
                                          SourceRefName = "feature/myFeature",
                                          TargetRefName = "master",
                                          Title = "Some good title for my PR"
                                      },
                                      "myBestRepository",
                                      true);

【讨论】:

  • 首先,感谢您花时间回答。因此,虽然这是一个好主意,而且它实际上是我要解决这个问题的方式(选择编写一个单独的程序来处理清理并且根本不用担心监控构建)它并没有解决最初的问题所以我认为我不应该将其标记为答案。但是我确实认为我找到了我最初想要的东西。 BuildHttpClientBase.GetBuildsAsync(注意复数构建)。这实际上具有我期望从 GetBuild 获得的可为空的查询参数,但错过了。
  • 如果您想要这个答案的要点,您想用 GetBuildsAsync 添加另一个答案吗?我觉得你值得他们。使用这种方法,我将能够获得基于分支、提交的用户以及可能的 min 和 maxTime 的构建列表。这应该允许我找到没有 ID 的构建。虽然我期待应该有一种方法可以找到 PR 对象上的任何构建,这会给出明确的结果,但我很惊讶我找不到任何东西。
  • 我将用我如何在没有构建 ID 的情况下查找构建的方式来编辑我的答案,这几乎就是你提到的方式。根据在 PR 上找不到构建,我认为这是因为构建实际上不是 PR 的一部分,而是合并到的分支策略的一部分。
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 2020-04-27
  • 2018-07-11
  • 1970-01-01
  • 2016-12-14
  • 2012-11-03
  • 2020-05-07
  • 2018-08-02
相关资源
最近更新 更多