public static GitPullRequestStatus CreatePullRequestStatus(ClientSampleContext context, Guid repositoryId, int pullRequestId, int?iterationId = null)
        {
            VssConnection connection = context.Connection;
            GitHttpClient gitClient  = connection.GetClient <GitHttpClient>();

            using (new ClientSampleHttpLoggerOutputSuppression())
            {
                GitPullRequestStatus status        = GenerateSampleStatus(iterationId);
                GitPullRequestStatus createdStatus = gitClient.CreatePullRequestStatusAsync(status, repositoryId, pullRequestId).Result;

                return(createdStatus);
            }
        }
        public GitPullRequestStatus CreatePullRequestStatusWithCustomProperties()
        {
            VssConnection connection = this.Context.Connection;
            GitHttpClient gitClient  = connection.GetClient <GitHttpClient>();

            TeamProjectReference project     = ClientSampleHelpers.FindAnyProject(this.Context);
            GitRepository        repo        = GitSampleHelpers.FindAnyRepository(this.Context, project.Id);
            GitPullRequest       pullRequest = GitSampleHelpers.CreatePullRequest(this.Context, repo);

            Console.WriteLine("project {0}, repo {1}, pullRequestId {2}", project.Name, repo.Name, pullRequest.PullRequestId);

            GitPullRequestStatus status = GitSampleHelpers.GenerateSampleStatus(includeProperties: true);

            GitPullRequestStatus createdStatus = gitClient.CreatePullRequestStatusAsync(status, repo.Id, pullRequest.PullRequestId).Result;

            Console.WriteLine($"{createdStatus.Description}({createdStatus.Context.Genre}/{createdStatus.Context.Name}) with id {createdStatus.Id} created");

            GitSampleHelpers.AbandonPullRequest(this.Context, repo, pullRequest.PullRequestId);

            return(createdStatus);
        }
Example #3
0
        public async Task Check(string projectId, string repoId, int pullRequestId, Dictionary <string, string> args = null)
        {
            try
            {
                const string evaluationConfigurationType = "Build";
                string artifactId(string projectId, int pullRequestId) => $"vstfs:///CodeReview/CodeReviewId/{projectId}/{pullRequestId}";

                string buildUrl   = $"{_config.URL}/{_config.Collection}/{projectId}/_build";
                string statusName = (args != null) && args.TryGetValue("name", out string name) ? name : "CheckCodeCoverage";

                _logger.LogInformation($"[{nameof(Check)}] BEGIN {{pullRequestId:{pullRequestId}}}");

                GitHttpClient    gitClient    = _connection.GetClient <GitHttpClient>();
                PolicyHttpClient policyClient = _connection.GetClient <PolicyHttpClient>();

                // получить политики для ПР
                var evaluations = await policyClient.GetPolicyEvaluationsAsync(projectId, artifactId(projectId, pullRequestId));

                _logger.LogInformation($"[{nameof(Check)}] GetPolicyEvaluationsAsync(project:{projectId}, artifactId:{artifactId(projectId, pullRequestId)}) success: {{evaluations count:{evaluations.Count}}}");

                var policy = evaluations.FirstOrDefault(x => x.Configuration.Settings.TryGetValue("statusName", out JToken name) &&
                                                        name.ToString().Equals(statusName, StringComparison.OrdinalIgnoreCase));

                // Если у полученного PullRequest не найдена политика для правила с заданным именем, то не создаем статуса.
                if (policy == null)
                {
                    _logger.LogInformation($"[{nameof(Check)}] SKIPPED. Pullrequest({pullRequestId}) has no this policy");
                    return;
                }

                var evaluation = evaluations.FirstOrDefault(x => x.Configuration.Type.DisplayName.Equals(evaluationConfigurationType, StringComparison.OrdinalIgnoreCase));
                _logger.LogInformation($"[{nameof(Check)}] build evaluation: {JsonConvert.SerializeObject(evaluation)}");

                var    resState = GitStatusState.NotApplicable;
                string description;
                string targetUrl;

                switch (evaluation?.Status)
                {
                case PolicyEvaluationStatus.Running:
                case PolicyEvaluationStatus.Queued:
                case PolicyEvaluationStatus.Rejected:
                {
                    var buildId = evaluation.Context?.Value <int>("buildId");
                    resState    = GitStatusState.NotSet;
                    description = "Ожидаение успешной сборки";
                    targetUrl   = buildId != null ? $"{buildUrl}/results?buildId={buildId}&view=results" : null;
                    break;
                }

                case PolicyEvaluationStatus.Approved:
                {
                    var buildId = evaluation.Context.Value <int>("buildId");
                    var cover   = await GetCodeCoverageForBuild(projectId, buildId);

                    int quality = 0;
                    if (args != null && args.TryGetValue("quality", out string qualityStr) && (cover != null))
                    {
                        if (!int.TryParse(qualityStr, out quality))
                        {
                            _logger.LogWarning(message: $"[{nameof(Check)}] param \"Quality\"({qualityStr}) is not parse to int");
                        }
                        resState = (quality <= cover)
                                    ? GitStatusState.Succeeded
                                    : GitStatusState.Error;
                    }
                    else
                    {
                        resState = GitStatusState.Succeeded;
                    }

                    description = cover != null ? $"CodeCoverage = {cover:F2}%" : "CodeCoverage = (не определен)";
                    targetUrl   = $"{buildUrl}/results?buildId={buildId}&view=results";
                    break;
                }

                case PolicyEvaluationStatus.NotApplicable:
                default:
                    resState    = GitStatusState.Succeeded;
                    description = "CodeCoverage = (Build not used)";
                    targetUrl   = null;
                    break;
                }
                // New status
                var status = new GitPullRequestStatus()
                {
                    State       = resState,
                    Description = description,
                    TargetUrl   = targetUrl,
                    Context     = new GitStatusContext()
                    {
                        Name  = statusName,
                        Genre = "PullRequestCheckService"
                    }
                };
                _logger.LogInformation($"[{nameof(Check)}] created new status: " +
                                       $"{{pullRequestId:{pullRequestId}," +
                                       $"status:{{" +
                                       $"state:{status.State}," +
                                       $"description:{status.Description},context:{{name:{status.Context.Name},genre:{status.Context.Genre}}}" +
                                       $"}}" +
                                       $"}}");

                // set PR status
                var prStatus = await gitClient.CreatePullRequestStatusAsync(status, repoId, pullRequestId);

                _logger.LogInformation($"[{nameof(Check)}] CreatePullRequestStatusAsync(status:{status}, repositoryId:{repoId}, pullRequestId:{pullRequestId}) success: {JsonConvert.SerializeObject(prStatus)}");
            }
            catch (Exception e)
            {
                _logger.LogError($"Check FAILED: {e.ToString()}");
            }
            finally
            {
                _logger.LogInformation($"[{nameof(Check)}] COMPLETED");
            }
        }
Example #4
0
        public async Task Check(string projectId, string repoId, int pullRequestId, Dictionary <string, string> args = null)
        {
            try
            {
                _logger.LogInformation($"[{nameof(Check)}] START {{pullRequestId:{pullRequestId}}}");
                GitHttpClient gitClient = _connection.GetClient <GitHttpClient>();
                var           resState  = GitStatusState.NotApplicable;
                string        description;

                var pr = await gitClient.GetPullRequestByIdAsync(projectId, pullRequestId);

                if (pr == null)
                {
                    _logger.LogWarning($"[{nameof(Check)}] GetPullRequestByIdAsync: PullRequest not found");
                    return;
                }

                var author = pr.CreatedBy.UniqueName;
                _logger.LogInformation($"[{nameof(Check)}] GetPullRequestByIdAsync(project:{projectId}, pullRequestId:{pullRequestId}) success: {{author:{author}}}");

                var reviewer = pr.Reviewers.FirstOrDefault(v => v.UniqueName == author);

                switch (reviewer?.Vote)
                {
                case 10:     // Approved
                case 5:      // Approved with suggestions
                {
                    resState    = GitStatusState.Succeeded;
                    description = "Готово для ревью";
                    break;
                }

                case 0:      // No vote
                {
                    resState    = GitStatusState.NotSet;
                    description = "Ожидает подтверждения автора";
                    break;
                }

                default:
                {
                    resState    = GitStatusState.NotSet;
                    description = "Готовность к ревью не подтверждена";
                    break;
                }
                }

                // New status
                var status = new GitPullRequestStatus()
                {
                    State       = resState,
                    Description = description,
                    Context     = new GitStatusContext()
                    {
                        Name  = "CheckAuthorReview",
                        Genre = "PullRequestCheckService"
                    }
                };
                _logger.LogInformation($"[{nameof(Check)}] created new status: " +
                                       $"{{pullRequestId:{pullRequestId}," +
                                       $"author:{author}," +
                                       $"status:{{" +
                                       $"state:{status.State}," +
                                       $"description:{status.Description},context:{{name:{status.Context.Name},genre:{status.Context.Genre}}}" +
                                       $"}}" +
                                       $"}}");
                // set PR status
                var prStatus = await gitClient.CreatePullRequestStatusAsync(status, repoId, pullRequestId);

                _logger.LogInformation($"[{nameof(Check)}] CreatePullRequestStatusAsync(status:{status}, repositoryId:{repoId}, pullRequestId:{pullRequestId}) success: {JsonConvert.SerializeObject(prStatus)}");
            }
            catch (Exception e)
            {
                _logger.LogError($"Check FAILED: {e.ToString()}");
            }
            finally
            {
                _logger.LogInformation($"[{nameof(Check)}] COMPLETED");
            }
        }