public async Task OnPullRequestMergedAsync( DevOpsServer server, TriageContextUtil triageContextUtil, GitHubPullRequestKey prKey, string project, CancellationToken cancellationToken = default) { // Pull requests can trigger builds in multiple definitions. Need to calculate the merged PR build // for each of them var allBuilds = await server.ListPullRequestBuildsAsync(prKey, project).ConfigureAwait(false); foreach (var group in allBuilds.GroupBy(x => x.Definition.Id)) { var mergedBuild = group .Where(x => x.Status == BuildStatus.Completed && x.Result != BuildResult.Canceled) .OrderByDescending(x => x.Id) .FirstOrDefault(); if (mergedBuild is object) { var modelBuild = await triageContextUtil.EnsureBuildAsync(mergedBuild.GetBuildResultInfo()).ConfigureAwait(false); modelBuild.IsMergedPullRequest = true; await triageContextUtil.Context.SaveChangesAsync(cancellationToken).ConfigureAwait(false); } } }
public async IAsyncEnumerable <(PullRequest PullReuqest, Build Build)> EnumerateMergedPullRequestBuilds( DevOpsServer server, GitHubBuildInfo gitHubInfo, string project, int[]?definitions) { await foreach (var pullRequest in EnumerateClosedPullRequests(gitHubInfo.Organization, gitHubInfo.Repository).ConfigureAwait(false)) { var prKey = new GitHubPullRequestKey(gitHubInfo.Organization, gitHubInfo.Repository, pullRequest.Number); Build?build = null; try { var builds = (await server.ListPullRequestBuildsAsync(prKey, project, definitions).ConfigureAwait(false)) .OrderByDescending(b => b.BuildNumber) .Where(x => x.Status == BuildStatus.Completed && x.Result != BuildResult.Canceled) .ToList(); if (builds.Count > 0) { build = builds[0]; } } catch (Exception) { // Error enumerating builds, continue to the next one } if (build is object) { yield return(pullRequest, build); } } }