Пример #1
0
        private static Services GetServices(ExecutionContext context)
        {
            if (_services != null)
            {
                return(_services);
            }

            var configuration = new ConfigurationBuilder()
                                .SetBasePath(context.FunctionAppDirectory)
                                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                                .AddEnvironmentVariables()
                                .Build();

            var options = Options.Create(configuration.GetSection("Github").Get <GithubSettings>());

            var githubConnectionCache = new GithubConnectionCache(new GithubAppTokenService(options));

            var pullRequestHandler = new PullRequestHandler(
                new PullRequestInfoProvider(),
                new RepositorySettingsProvider(),
                new WorkInProgressPullRequestPolicy(),
                new CommitStatusWriter(options));

            var payloadValidator = new GithubPayloadValidator(options);

            return(_services =
                       new Services(configuration, options, githubConnectionCache, pullRequestHandler, payloadValidator));
        }
Пример #2
0
        public async Task ProcessWebhookAsync(string eventName, string json, ILogger logger, CancellationToken cancellationToken)
        {
            await Policy
            .Handle <AbuseException>()
            .RetryAsync(3, async(ex, retryCount) =>
            {
                logger.LogWarning("Abuse exception detected, attempting retry.");
                var abuseEx = (AbuseException)ex;

                logger.LogInformation("Waiting for {seconds} before retrying.", abuseEx.RetryAfterSeconds);
                await Task.Delay(TimeSpan.FromSeconds((double)abuseEx.RetryAfterSeconds));
            })
            .ExecuteAsync(async() =>
            {
                if (eventName == "check_run")
                {
                    var handler = new CheckRunHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "issue_comment")
                {
                    var handler = new IssueCommentHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "pull_request")
                {
                    var handler = new PullRequestHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
            });
        }
Пример #3
0
 public Services(IConfigurationRoot configuration, IOptions <GithubSettings> options, GithubConnectionCache githubConnectionCache, PullRequestHandler pullRequestHandler, GithubPayloadValidator payloadValidator)
 {
     Configuration         = configuration;
     Options               = options;
     GithubConnectionCache = githubConnectionCache;
     PullRequestHandler    = pullRequestHandler;
     PayloadValidator      = payloadValidator;
 }
        public PullRequestHandlerTests()
        {
            InitFake(out _prInfoProvider);
            InitFake(out _repositorySettingsProvider);
            InitFake(out _pullRequestPolicy);
            InitFake(out _statusWriter);

            _handler = new PullRequestHandler(_prInfoProvider, _repositorySettingsProvider, _pullRequestPolicy, _statusWriter);
        }
        public async Task ProcessWebhookAsync(string eventName, string json, ILogger logger, CancellationToken cancellationToken)
        {
            await Policy
            .Handle <AbuseException>()
            .Or <RateLimitExceededException>()
            .RetryAsync(3, async(ex, retryCount) =>
            {
                TimeSpan retryDelay = TimeSpan.FromSeconds(10);     // Default.

                switch (ex)
                {
                case AbuseException abuseException:
                    retryDelay = TimeSpan.FromSeconds((double)abuseException.RetryAfterSeconds);
                    logger.LogWarning("Abuse exception detected. Retry after seconds is: {retrySeconds}",
                                      abuseException.RetryAfterSeconds
                                      );
                    break;

                case RateLimitExceededException rateLimitExceededException:
                    retryDelay = rateLimitExceededException.GetRetryAfterTimeSpan();
                    logger.LogWarning(
                        "Rate limit exception detected. Limit is: {limit}, reset is: {reset}, retry seconds is: {retrySeconds}",
                        rateLimitExceededException.Limit,
                        rateLimitExceededException.Reset,
                        retryDelay.TotalSeconds
                        );
                    break;
                }

                logger.LogInformation("Waiting for {seconds} before retrying.", retryDelay.TotalSeconds);
                await Task.Delay(retryDelay);
            })
            .ExecuteAsync(async() =>
            {
                if (eventName == "check_run")
                {
                    var handler = new CheckRunHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger, limiter);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "issue_comment")
                {
                    var handler = new IssueCommentHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger, limiter);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "pull_request")
                {
                    var handler = new PullRequestHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger, limiter, pullRequestTracker);
                    await handler.HandleAsync(json, cancellationToken);
                }
            });
        }
Пример #6
0
        public async Task ProcessWebhookAsync(HttpRequest request, ILogger logger, CancellationToken cancellationToken)
        {
            var json = await ReadAndVerifyBodyAsync(request, cancellationToken);

            if (request.Headers.TryGetValue(GitHubEventHeader, out StringValues eventName))
            {
                if (eventName == "check_run")
                {
                    var handler = new CheckRunHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "check_suite")
                {
                    var handler = new CheckSuiteHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "issue_comment")
                {
                    var handler = new IssueCommentHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else if (eventName == "pull_request")
                {
                    var handler = new PullRequestHandler(globalConfigurationProvider, gitHubClientProvider, repositoryConfigurationProvider, logger);
                    await handler.HandleAsync(json, cancellationToken);
                }
                else
                {
                    throw new CheckEnforcerUnsupportedEventException(eventName);
                }
            }
            else
            {
                throw new CheckEnforcerException($"Could not find header '{GitHubEventHeader}'.");
            }
        }