示例#1
0
        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);
                }
            }
        }
示例#2
0
        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);
                }
            }
        }