Azure DevOps API问题时,完成新的拉取请求



我试图创建一个新的ADO拉请求并立即完成它(用于单元测试目的),但似乎有一个问题,如果我试图在创建后完成它,它根本没有完成它。

另一方面,如果我在PR创建和完成之间添加一些超时(下面代码中的注释行),它确实可以工作。

知道为什么会发生这种情况以及如何解决它吗?

这是我一直在测试的一个示例代码。

// CREATE PR
const prRequestUrl = `https://system:${personalAccessToken}@dev.azure.com/${organization}/${project}/_apis/git/repositories/${repo}/pullRequests?api-version=7.0`;
const prRequestBody = {
sourceRefName: 'refs/heads/source',
targetRefName: 'refs/heads/target',
title: 'PR title',
description: 'PR description',
};
const prData = (await axios.post(prRequestUrl, prRequestBody)).data;
// This fixes the issue
// await new Promise((resolve) => setTimeout(resolve, 1000));
// COMPLETE PR
const approvePrRequestUrl = `https://system:${personalAccessToken}@dev.azure.com/${organization}/${project}/_apis/git/repositories/${repo}/pullRequests/${prData.pullRequestId}/?api-version=7.0`;
const approvePrRequestBody = {
lastMergeSourceCommit: prData.lastMergeSourceCommit,
completionOptions: {
deleteSourceBranch: false,
},
status: 'completed',
};
await axios.patch(
approvePrRequestUrl,
approvePrRequestBody
);

Azure DevOps使用数据库作为后台存储。可能是创建PR请求已将工作排队,但PR尚未完全存在。

如果你的测试只需要一个完成的PR,创建一个完成状态的PR。

const prRequestBody = {
sourceRefName: 'refs/heads/source',
targetRefName: 'refs/heads/target',
title: 'PR title',
description: 'PR description',
completionOptions: {
deleteSourceBranch: false,
},
status: 'completed',
};

还考虑对初始请求提供的PR Id进行查询。

如果您使用两个请求来创建已完成的PR,则在检查PR是否可检索时旋转可能比在两个请求之间设置任意超时要好。

如果您使用一个请求来创建完整的PR,那么检查PR是否可检索将为您的单元测试增加健壮性。(你会想要区别Azure DevOps的问题和你正在测试的代码的问题)

当您创建PR时,您正在等待的是创建临时合并提交。这就是AzDO如何确定您是否有冲突,如果有,您将无法完成PR。临时合并所需的时间可能会有所不同,但正如您所看到的,它通常快,但肯定比进行多个API调用所需的时间要长。

这个问题的一些可能的解决方案是:

  1. 您可以创建PR,而不是尝试自己完成PR,然后一旦您拥有PR ID,您可以立即更新PR以启用自动完成。假设您没有任何阻止PR的策略,它将在准备好后自行完成。这样做的好处是,如果合并提交由于某种原因需要很长时间才能创建,您的PR仍然会在准备好后自动完成。
  2. 你可能根本不需要公关来实现你的目标。您可以修改分支的安全性,以允许特定用户绕过分支策略,然后修改当前用于作为该特定用户运行的自动化。现在,不用使用AzDO API来创建PR,您可以简单地使用git命令来执行与PR相同的合并并推送它。使用旁路是在具有策略的分支上自动化某些合并的好方法。注意,这里假设触发器将在特定分支上出现新提交时运行(这是常态),而不是在完成对该分支的PR时运行。这可以很容易地设置为一个AzDO管道,你可以触发一个单一的按钮按下,或在某种时间表。

最新更新