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); }
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"); } }
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"); } }