C# 如何以编程方式将审阅者分配给AzureDevOps PullRequest?
我知道如何使用gitHttpClient在VSTS中创建pull请求,就像在C# 如何以编程方式将审阅者分配给AzureDevOps PullRequest?,c#,azure-devops,pull-request,C#,Azure Devops,Pull Request,我知道如何使用gitHttpClient在VSTS中创建pull请求,就像在gitHttpClient.CreatePullRequestAsync(gitPullRequest,repositoryId).Result中一样,但我不确定如何添加审阅者。有什么建议吗 以下是创建拉取请求的示例代码: public static async void CreatePullRequest( GitHttpClient gitHttpClient, Git
gitHttpClient.CreatePullRequestAsync(gitPullRequest,repositoryId).Result中一样,但我不确定如何添加审阅者。有什么建议吗
以下是创建拉取请求的示例代码:
public static async void CreatePullRequest(
GitHttpClient gitHttpClient,
GitPullRequest gitPullRequest,
string repositoryId
)
{
GitPullRequest pullRequest = gitHttpClient.CreatePullRequestAsync(gitPullRequest, repositoryId, cancellationToken: CancellationToken.None).Result;
}
注意:要使以下代码正常工作,首先需要在NuGet console安装包Microsoft.TeamFoundationServer.ExtendedClient中执行以下命令,以安装所需的库
在此解决方案中,首先创建拉取请求,然后添加审阅者。下面的代码显示了创建pull请求然后添加审阅者所需的所有步骤。可以轻松修改代码以添加多个审阅者
using System;
using System.Threading;
using Microsoft.TeamFoundation.SourceControl.WebApi;
using System.Threading.Tasks;
using Microsoft.VisualStudio.Services.Identity;
using Microsoft.VisualStudio.Services.Identity.Client;
using Microsoft.VisualStudio.Services.Common;
namespace AddingReviewersToVstsPullRequestProgramatically
{
public class PullRequestReviewerAdder
{
/// <summary>
/// Creates a pull request, and then adds a reviewer to it.
/// </summary>
/// <param name="gitHttpClient"> GitHttpClient that is created for accessing vsts</param>
/// <param name="gitPullRequest"> the pull request to be created</param>
/// <param name="repositoryId"> the unique identifier of the repository</param>
/// <param name="reviewerAlias"> reviewer's alias in vsts</param>
/// <param name="vstsAccountUrl">vsts account's url</param>
/// <param name="personalToken"> personal access token to access the vsts account. </param>
public static async void CreatePullRequestAndAddReviewer(
GitHttpClient gitHttpClient,
GitPullRequest gitPullRequest,
string repositoryId,
string reviewerAlias,
Uri vstsAccountUrl,
string personalToken)
{
// 1- Create the pull request.
GitPullRequest pullRequest = gitHttpClient.CreatePullRequestAsync(gitPullRequest, repositoryId, cancellationToken: CancellationToken.None).Result;
// 2- Create an Identity Client to get the reviewer's vsts id
IdentityHttpClient identityHttpClient = CreateIdentityClient(vstsAccountUrl, personalToken);
// 3- Find the reviewer's vsts identity.
Identity identity = SearchForReviewerVstsIdentity(identityHttpClient, reviewerAlias).Result;
// 4- Create a IdentityRefWithVote for the reviewer
IdentityRefWithVote identityRefWithVote = new IdentityRefWithVote
{
Id = identity.Id.ToString(),
IsRequired = true // false otherwise.
};
// 5- Finally add the reviewer to the pull request.
await AddReviewerToPullRequest(gitHttpClient, pullRequest, identityRefWithVote);
}
/// <summary>
/// Creates an identity client. This is needed for fetching a reviewer's vsts identity.
/// </summary>
/// <param name="vstsAccountUrl">vsts account's url</param>
/// <param name="personalToken"> personal access token to access the vsts account. </param>
/// <returns>an IdentityHttpClient to use for retrieving identities from vsts. </returns>
public static IdentityHttpClient CreateIdentityClient(Uri vstsAccountUrl, string personalToken)
{
var vstsCredential = new VssBasicCredential(string.Empty, personalToken);
IdentityHttpClient identityHttpClient = new IdentityHttpClient(vstsAccountUrl, vstsCredential);
return identityHttpClient;
}
/// <summary>
/// Given an alias on vsts, searches for its vsts identity.
/// </summary>
/// <param name="identityHttpClient"> is the vsts identity client.</param>
/// <param name="alias">is the alias for which the identity is being searched for.</param>
public static async Task<Identity> SearchForReviewerVstsIdentity(IdentityHttpClient identityHttpClient, string alias)
{
try
{
// Notice : you can also search based on factors other than alias.
IdentitiesCollection identitiesPerAlias = await identityHttpClient
.ReadIdentitiesAsync(IdentitySearchFilter.Alias, alias).ConfigureAwait(false);
if (identitiesPerAlias.Count == 1) // Found one identity-- the ideal case
{
return identitiesPerAlias[0];
}
Console.WriteLine($"Encountered a problem finding vsts identity foralias {alias}.");
}
catch (Exception ex)
{
Console.WriteLine($"Exception when looking for vsts identity for alias {alias}. {ex}");
}
// Notice : watch out for null case...
return null;
}
/// <summary>
/// Adds a reviewer to a an already created pull request.
/// </summary>
/// <param name="gitHttpClient">GitHttpClient that is created for accessing vsts</param>
/// <param name="pullRequest"> pull request that is already created.</param>
/// <param name="identity">identity of the reviewer that we want to add to the pull request.</param>
public static async Task AddReviewerToPullRequest(GitHttpClient gitHttpClient, GitPullRequest pullRequest, IdentityRefWithVote identity)
{
identity = await gitHttpClient.CreatePullRequestReviewerAsync(
identity,
pullRequest.Repository.Id,
pullRequest.PullRequestId,
identity.Id).ConfigureAwait(false);
}
}
使用系统;
使用系统线程;
使用Microsoft.TeamFoundation.SourceControl.WebApi;
使用System.Threading.Tasks;
使用Microsoft.VisualStudio.Services.Identity;
使用Microsoft.VisualStudio.Services.Identity.Client;
使用Microsoft.VisualStudio.Services.Common;
命名空间以编程方式添加ReviewersToVstsPullRequest
{
公共类加法器
{
///
///创建拉取请求,然后向其添加审阅者。
///
///为访问VST而创建的GitHttpClient
///要创建的拉取请求
///存储库的唯一标识符
///vsts中的审阅者别名
///vsts帐户的url
///访问vsts帐户的个人访问令牌。
公共静态异步void CreatePullRequestAndAddresseViewer(
GitHttpClient GitHttpClient,
GitPullRequest GitPullRequest,
字符串repositoryId,
字符串别名,
Uri vstsAccountUrl,
字符串(个人令牌)
{
//1-创建拉取请求。
GitPullRequest pullRequest=gitHttpClient.CreatePullRequestAsync(GitPullRequest,repositoryId,cancellationToken:cancellationToken.None);
//2-创建标识客户端以获取审阅者的vsts id
IdentityHttpClient IdentityHttpClient=CreateIdentityClient(vstsAccountUrl,personalToken);
//3-查找审阅者的vsts身份。
Identity Identity=SearchForReviewerVstsIdentity(identityHttpClient,reviewerAlias)。结果;
//4-为审阅者创建IdentityRefWithVote
IdentityRefWithVote IdentityRefWithVote=新IdentityRefWithVote
{
Id=identity.Id.ToString(),
IsRequired=true//否则为false。
};
//5-最后将审阅者添加到pull请求中。
等待AddReviewerToPullRequest(gitHttpClient、pullRequest、identityRefWithVote);
}
///
///创建标识客户端。这是获取审阅者的vsts标识所必需的。
///
///vsts帐户的url
///访问vsts帐户的个人访问令牌。
///用于从VST检索标识的IdentityHttpClient。
公共静态标识HttpClient CreateIdentityClient(Uri vstsAccountUrl,字符串personalToken)
{
var vstsCredential=新的VssBasicCredential(string.Empty,personalToken);
IdentityHttpClient IdentityHttpClient=新IdentityHttpClient(vstsAccountUrl,vstsCredential);
返回标识HttpClient;
}
///
///给定vsts上的别名,搜索其vsts标识。
///
///是vsts标识客户端。
///为其搜索标识的别名。
公共静态异步任务SearchForReviewerVstsIdentity(IdentityHttpClient IdentityHttpClient,字符串别名)
{
尝试
{
//注意:您也可以基于alias以外的因素进行搜索。
identiescollection identiesperalias=等待identityHttpClient
.ReadIdentitesAsync(IdentitySearchFilter.Alias,Alias).ConfigureAwait(false);
if(identiesperalias.Count==1)//找到一个标识——理想情况
{
返回标识[0];
}
WriteLine($“在查找LIAS{alias}的vsts标识时遇到问题。”);
}
捕获(例外情况除外)
{
WriteLine($“查找别名{alias}.{ex}的vsts标识时发生异常”);
}
//注意:注意空的情况。。。
返回null;
}
///
///向已创建的请求添加审阅者。
///
///为访问VST而创建的GitHttpClient
///已创建的拉取请求。
///要添加到请求中的审阅者的身份。
公共静态异步任务AddReviewerToPullRequest(GitHttpClient GitHttpClient,GitPullRequest pullRequest,IdentityRefWithVote identity)
{
标识=等待gitHttpClient.CreatePullRequestReviewerAsync(
身份,
pullRequest.Repository.Id,
pullRequest.PullRequestId,
identity.Id).配置等待(false);
}
}
感谢您发布这个自我回答的问题!但是这个概念经常被一些堆栈溢出用户误解。这段代码非常有用。我仍然试图理解reviewerAlias的样子。您能给我举个例子吗?