Exemplo n.º 1
0
        public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            log.Info($"{nameof(GithubMergedBranchSweepTrigger)} : C# HTTP trigger function processed a request.");

            var token = req.Headers.Where(x => x.Key == tokenHeader)
                        .SelectMany(x => x.Value)
                        .FirstOrDefault();

            if (string.IsNullOrEmpty(token))
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"Missing AccessToken from Header : {tokenHeader}"));
            }

            var json = await req.Content.ReadAsStringAsync();

            var request = JsonConvert.DeserializeObject <GithubMergedBranchSweepRequest>(json);

            // Validation
            if (request.DaysPast < 0)
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"{nameof(request.DaysPast)} element must be larger equal than 1."));
            }
            if (request.PrPageCount < 0)
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"{nameof(request.PrPageCount)} element must be larger equal than 1."));
            }
            if (request.PrPageSize < 0)
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"{nameof(request.PrPageSize)} element must be larger equal than 1."));
            }

            try
            {
                // Execute
                var sweeper = new GithubMergedBranchSweeper(request.Owner, token, request.Repository)
                {
                    DaysPast        = request.DaysPast,
                    DryRun          = request.DryRun,
                    ExcludeBranches = request.ExcludeBranches,
                    PrPageCount     = request.PrPageCount,
                    PrPageSize      = request.PrPageSize,
                };
                Action <SweeptargetBranchResult[]> action = branches => log.Info($@"DryRun - {nameof(GithubMergedBranchSweepTimer)}: remove candidates are following.
{branches.Select(x => x.BranchName).ToJoinedString(Environment.NewLine)}");
                var results = await sweeper.SweepAsync(log, action);

                // Response
                var response = new SweepResponse()
                {
                    DryRun = request.DryRun, Value = results
                };
                var responseJson = JsonConvert.SerializeObject(response);
                return(req.CreateResponse(HttpStatusCode.OK, responseJson));
            }
            catch (Exception ex)
            {
                log.Error($"{ex.Message} {ex.GetType().FullName} {ex.StackTrace}");
                return(req.CreateResponse(HttpStatusCode.InternalServerError, $"Error when running sweep. {ex.GetType()} {ex.Message}"));
            }
        }
Exemplo n.º 2
0
        public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            log.Info($"{nameof(GithubBranchDetailTigger)} : C# HTTP trigger function processed a request.");

            var token = req.Headers.Where(x => x.Key == tokenHeader)
                        .SelectMany(x => x.Value)
                        .FirstOrDefault();

            if (string.IsNullOrEmpty(token))
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"Missing AccessToken from Header : {tokenHeader}"));
            }

            var json = await req.Content.ReadAsStringAsync();

            var request = JsonConvert.DeserializeObject <GithubBranchDetailRequest>(json);

            // Validation
            if (string.IsNullOrEmpty(token))
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"{nameof(token)} query element must be included."));
            }
            if (string.IsNullOrEmpty(request.Owner))
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"{nameof(request.Owner)} posted json element must be included."));
            }
            if (string.IsNullOrEmpty(request.Repository))
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, $"{nameof(request.Repository)} posted json element must be included."));
            }

            try
            {
                // Execute
                var sweeper = new GithubMergedBranchSweeper(request.Owner, token, request.Repository)
                {
                    ExcludeBranches = request.ExcludeBranches,
                };
                var branches = await sweeper.GetBranchesAsync();

                var results = await sweeper.GetBranchDetailsAsync(branches);

                // Response
                var response = new BranchResponse()
                {
                    Count = results.Length, Owner = request.Owner, Repository = request.Repository, Value = results
                };
                var responseJson = JsonConvert.SerializeObject(response);
                return(req.CreateResponse(HttpStatusCode.OK, responseJson));
            }
            catch (Exception ex)
            {
                log.Error($"{ex.Message} {ex.GetType().FullName} {ex.StackTrace}");
                return(req.CreateResponse(HttpStatusCode.InternalServerError, $"Error when running sweep. {ex.GetType()} {ex.Message}"));
            }
        }
        public static async Task Run([TimerTrigger("0 0 0 * * *")] TimerInfo myTimer, TraceWriter log)
        {
            log.Info($"{nameof(GithubMergedBranchSweepTimer)} : C# Timer trigger function executed at: {DateTime.Now}");

            // get value from Environment variable
            var owner              = GetOrDefault(envOwner, "");
            var token              = GetOrDefault(envToken, "");
            var dryRun             = GetOrDefault(envDryRun, true);
            var daysPast           = GetOrDefault(envDaysPast, 1);
            var targetRepositories = GetOrDefault(envTargetRepositories, (string[])null);
            var excludeBranches    = GetOrDefault(envExcludeBranches, GithubMergedBranchSweeper.DefaultExcludeBranchRule);
            // max pageSize : 100
            // prPageSize * prPageCount = 2000 is pretty enough for 95 percentile
            var prPageSize  = GetOrDefault(envPRPageSize, 100);
            int?prPageCount = GetOrDefault(envPRPageCount, 20);;

            // Show log
            log.Info($@"{envOwner} : {owner}
{envToken} : {(!string.IsNullOrEmpty(token) ? "******" : "")}
{envDryRun} : {dryRun}
{envDaysPast} : {daysPast}
{envPRPageSize} : {prPageSize}
{envPRPageCount} : {prPageCount}
{envTargetRepositories} : {targetRepositories.ToJoinedString(",")}
{envExcludeBranches} : {excludeBranches.ToJoinedString(",")}");

            // Run
            try
            {
                foreach (var repository in targetRepositories)
                {
                    var sweeper = new GithubMergedBranchSweeper(owner, token, repository)
                    {
                        DaysPast        = daysPast,
                        DryRun          = dryRun,
                        ExcludeBranches = excludeBranches,
                        PrPageCount     = prPageCount,
                        PrPageSize      = prPageSize,
                    };
                    Action <SweeptargetBranchResult[]> action = branches => log.Info($@"DryRun - {nameof(GithubMergedBranchSweepTimer)}: remove candidates are following.
{branches.Select(x => x.BranchName).ToJoinedString(Environment.NewLine)}");
                    var results = await sweeper.SweepAsync(log, action);
                }
            }
            catch (Exception ex)
            {
                log.Error($"{ex.Message} {ex.GetType().FullName} {ex.StackTrace}");
                throw;
            }
        }