예제 #1
0
        private async Task HandleReopenedPullRequest(MergeRequest mergeRequest)
        {
            logger.WithMergeRequestData(mergeRequest).Information("Handling PR reopened event for PR - Checking if it has passed all tests");
            var checks = await prStatusChecks.GetStatusChecks(mergeRequest);

            if (checks == null || !checks.Any())
            {
                logger.WithMergeRequestData(mergeRequest).Information("PR Reopen event had no past passing tests");
                return;
            }
            var onlyRequiredChecks = await checksManager.FilterNonRequiredChecks(mergeRequest.Owner, mergeRequest.Repo, checks);

            logger
            .WithMergeRequestData(mergeRequest)
            .WithExtraData(new { oldTests = string.Join(",", checks.Select(x => x.Context)), filteredTests = string.Join(",", onlyRequiredChecks.Select(x => x.Context)) })
            .Information("Adding old tests to reopened PullRequest");

            await mergeRequestRepository.UpdateCheckStatus(mergeRequest.Owner, mergeRequest.Repo, mergeRequest.PrId, onlyRequiredChecks);
        }
예제 #2
0
        private async Task <WebhookResponse> HandleStatus(string sha, StatusEvent payload)
        {
            var mergeRequest = await mergeRequestsRepository.GetBySha(payload.Repository.Owner.Login, payload.Repository.Name, sha);

            if (mergeRequest == null)
            {
                logger.WithExtraData(new { payload.Sha, owner = payload.Repository.Owner.Login, repo = payload.Repository.Name }).Information("Received status from unknown Pull Request, ignoring");
                return(new WebhookResponse(false, "Received status from unknown Pull Request, ignoring"));
            }
            var owner     = mergeRequest.Owner;
            var repo      = mergeRequest.Repo;
            var prId      = mergeRequest.PrId;
            var testName  = payload.Context;
            var testState = payload.State;
            var targetUrl = payload.TargetUrl;

            if (!await checksManager.IsRequiredCheck(owner, repo, testName))
            {
                logger.WithMergeRequestData(mergeRequest).WithExtraData(new { testName, testState, targetUrl }).Information("Received a non-required status from Pull Request, ignoring");
                return(new WebhookResponse(false, "Received a non-required status from Pull Request, ignoring"));
            }

            if (isStaleStatusEvent(mergeRequest, sha))
            {
                logger.WithMergeRequestData(mergeRequest).WithExtraData(new { testName, testState, staleSha = sha }).Information("Received stale status from Pull Request, ignoring");
                return(new WebhookResponse(false, "Received stale status from Pull Request, ignoring"));
            }
            logger.WithMergeRequestData(mergeRequest).WithExtraData(new { testName, testState, staleSha = sha }).Information($"Received status from Pull Request, updating DB");
            var updatedMergeRequest = await mergeRequestsRepository.UpdateCheckStatus(owner, repo, prId, testName, testState, targetUrl);

            if (testState == "success")
            {
                var checks = updatedMergeRequest.Checks?.Select(x => $"{x.Name}_{x.Status}");
                logger.WithMergeRequestData(mergeRequest).WithExtraData(new { testName, testState, staleSha = sha, checks = String.Join(",", checks) }).Information($"Received status from Pull Request, updated DB");
                var merged = await mergeOperations.TryToMerge(updatedMergeRequest);

                return(new WebhookResponse(true, $"Received success status from Pull Request, did branch merge: {merged}"));
            }
            return(new WebhookResponse(true, $"Received {testState} status from Pull Request, handled without trying to merge"));
        }