예제 #1
0
        public static async Task Trigger(
            [QueueTrigger("compressimagesmessage")] CompressImagesMessage compressImagesMessage,
            [Queue("longrunningcompressmessage")] ICollector <CompressImagesMessage> longRunningCompressMessages,
            [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation($"Starting compress");

            var storageAccount = CloudStorageAccount.Parse(KnownEnvironmentVariables.AzureWebJobsStorage);
            var settingsTable  = storageAccount.CreateCloudTableClient().GetTableReference("settings");

            var installationTokenProvider = new InstallationTokenProvider();
            var repoChecks = new RepoChecks();
            var task       = RunAsync(installationTokenProvider, compressImagesMessage, openPrMessages, settingsTable, repoChecks, logger, context);

            if (await Task.WhenAny(task, Task.Delay(570000)) == task)
            {
                await task;
            }
            else
            {
                logger.LogInformation($"Time out exceeded!");
                longRunningCompressMessages.Add(compressImagesMessage);
            }
        }
        public static async Task RunAsync(
            IInstallationTokenProvider installationTokenProvider,
            CompressImagesMessage compressImagesMessage,
            ICollector <OpenPrMessage> openPrMessages,
            IRepoChecks repoChecks,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation("CompressImagesFunction: starting run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
            var installationTokenParameters = new InstallationTokenParameters
            {
                AccessTokensUrl = string.Format(KnownGitHubs.AccessTokensUrlFormat, compressImagesMessage.InstallationId),
                AppId           = KnownGitHubs.AppId,
            };

            var installationToken = await installationTokenProvider.GenerateAsync(
                installationTokenParameters,
                File.OpenText(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.AppPrivateKey}")));

            // check if repo is archived before starting work
            var isArchived = await repoChecks.IsArchived(new GitHubClientParameters
            {
                Password  = installationToken.Token,
                RepoName  = compressImagesMessage.RepoName,
                RepoOwner = compressImagesMessage.Owner
            });

            if (isArchived)
            {
                logger.LogInformation("CompressImagesFunction: skipping archived repo {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                return;
            }

            var compressImagesParameters = new CompressimagesParameters
            {
                CloneUrl              = compressImagesMessage.CloneUrl,
                LocalPath             = LocalPath.CloneDir(Environment.GetEnvironmentVariable("TMP") ?? "/private/tmp/", compressImagesMessage.RepoName),
                Password              = installationToken.Token,
                RepoName              = compressImagesMessage.RepoName,
                RepoOwner             = compressImagesMessage.Owner,
                PgpPrivateKeyStream   = File.OpenRead(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.PGPPrivateKeyFilename}")),
                PgPPassword           = File.ReadAllText(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.PGPPasswordFilename}")),
                CompressImagesMessage = compressImagesMessage,
            };

            var didCompress = await CompressImages.RunAsync(compressImagesParameters, logger);

            if (didCompress)
            {
                logger.LogInformation("CompressImagesFunction: Successfully compressed images for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                openPrMessages.Add(new OpenPrMessage
                {
                    InstallationId = compressImagesMessage.InstallationId,
                    RepoName       = compressImagesMessage.RepoName,
                    CloneUrl       = compressImagesMessage.CloneUrl,
                });
            }

            logger.LogInformation("CompressImagesFunction: finished run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
        }
예제 #3
0
        private Task ExecuteRunAsync(CompressImagesMessage compressImagesMessage, long prId, out ILogger logger)
        {
            logger = Substitute.For <ILogger>();

            var context = Substitute.For <ExecutionContext>();

            context.FunctionDirectory = "data/functiondir";

            var installationTokenProvider = Substitute.For <IInstallationTokenProvider>();

            installationTokenProvider
            .GenerateAsync(Arg.Any <InstallationTokenParameters>(), Arg.Any <StreamReader>())
            .Returns(Task.FromResult(new InstallationToken
            {
                Token     = "token",
                ExpiresAt = "12345"
            }));

            var openPrMessages = Substitute.For <ICollector <OpenPrMessage> >();

            var repoChecks = Substitute.For <IRepoChecks>();

            repoChecks.IsArchived(Arg.Any <GitHubClientParameters>())
            .Returns(x => Task.FromResult(true));

            return(CompressImagesFunction.CompressImagesFunction.RunAsync(
                       installationTokenProvider,
                       compressImagesMessage,
                       openPrMessages,
                       repoChecks,
                       logger,
                       context));
        }
예제 #4
0
        private Task ExecuteRunAsync(CompressImagesMessage compressImagesMessage, long prId, out ILogger logger)
        {
            logger = Substitute.For <ILogger>();

            var context = Substitute.For <ExecutionContext>();

            context.FunctionDirectory = "data/functiondir";

            var installationTokenProvider = Substitute.For <IInstallationTokenProvider>();

            installationTokenProvider
            .GenerateAsync(Arg.Any <InstallationTokenParameters>(), Arg.Any <string>())
            .Returns(Task.FromResult(new InstallationToken
            {
                Token     = "token",
                ExpiresAt = "12345"
            }));

            var openPrMessages = Substitute.For <ICollector <OpenPrMessage> >();
            var settingsTable  = Substitute.For <CloudTable>(new Uri("https://myaccount.table.core.windows.net/Tables/settings"));

            var repoChecks = Substitute.For <IRepoChecks>();

            repoChecks.IsArchived(Arg.Any <GitHubClientParameters>())
            .Returns(x => Task.FromResult(true));

            return(CompressImagesFunction.CompressImagesFunction.RunAsync(
                       installationTokenProvider,
                       compressImagesMessage,
                       openPrMessages,
                       settingsTable,
                       repoChecks,
                       logger,
                       context));
        }
예제 #5
0
        public static Task Trigger(
            [QueueTrigger("compressimagesmessage")] CompressImagesMessage compressImagesMessage,
            [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
            ILogger logger,
            ExecutionContext context)
        {
            var installationTokenProvider = new InstallationTokenProvider();

            return(RunAsync(installationTokenProvider, compressImagesMessage, openPrMessages, logger, context));
        }
예제 #6
0
 public static async Task LongTrigger(
     [QueueTrigger("longrunningcompressmessage")] CompressImagesMessage compressImagesMessage,
     [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
     ILogger logger,
     ExecutionContext context)
 {
     logger.LogInformation($"Starting long compress");
     var   installationTokenProvider = new InstallationTokenProvider();
     var   repoChecks = new RepoChecks();
     var   task       = RunAsync(installationTokenProvider, compressImagesMessage, openPrMessages, repoChecks, logger, context);
     await task;
 }
예제 #7
0
        private Task ExecuteRunAsync(int installationId, string owner, string repoName, long prId, out ILogger logger)
        {
            var cloneUrl = $"https://github.com/{owner}/{repoName}";

            var compressImagesMessage = new CompressImagesMessage
            {
                CloneUrl       = cloneUrl,
                Owner          = owner,
                InstallationId = installationId,
                RepoName       = repoName
            };

            return(ExecuteRunAsync(compressImagesMessage, prId, out logger));
        }
예제 #8
0
        public static async Task LongTrigger(
            [QueueTrigger("longrunningcompressmessage")] CompressImagesMessage compressImagesMessage,
            [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation($"Starting long compress");

            var storageAccount = CloudStorageAccount.Parse(KnownEnvironmentVariables.AzureWebJobsStorage);
            var settingsTable  = storageAccount.CreateCloudTableClient().GetTableReference("settings");

            var   installationTokenProvider = new InstallationTokenProvider();
            var   repoChecks = new RepoChecks();
            var   task       = RunAsync(installationTokenProvider, compressImagesMessage, openPrMessages, settingsTable, repoChecks, logger, context);
            await task;
        }
예제 #9
0
        public static async Task Run(
            [QueueTrigger("compressimagesmessage")] CompressImagesMessage compressImagesMessage,
            [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation("CompressImagesFunction: starting run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
            var installationTokenParameters = new InstallationTokenParameters
            {
                AccessTokensUrl = string.Format(KnownGitHubs.AccessTokensUrlFormat, compressImagesMessage.InstallationId),
                AppId           = KnownGitHubs.AppId,
            };

            var installationToken = await InstallationToken.GenerateAsync(
                installationTokenParameters,
                File.OpenText(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.AppPrivateKey}")));

            var compressImagesParameters = new CompressimagesParameters
            {
                CloneUrl            = compressImagesMessage.CloneUrl,
                LocalPath           = LocalPath.CloneDir(Environment.GetEnvironmentVariable("TMP") ?? "/private/tmp/", compressImagesMessage.RepoName),
                Password            = installationToken.Token,
                RepoName            = compressImagesMessage.RepoName,
                RepoOwner           = compressImagesMessage.Owner,
                PgpPrivateKeyStream = File.OpenRead(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.PGPPrivateKeyFilename}")),
                PgPPassword         = File.ReadAllText(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.PGPPasswordFilename}"))
            };

            var didCompress = CompressImages.Run(compressImagesParameters, logger);

            if (didCompress)
            {
                logger.LogInformation("CompressImagesFunction: Successfully compressed images for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                openPrMessages.Add(new OpenPrMessage
                {
                    InstallationId = compressImagesMessage.InstallationId,
                    RepoName       = compressImagesMessage.RepoName,
                    CloneUrl       = compressImagesMessage.CloneUrl,
                });
            }

            logger.LogInformation("CompressImagesFunction: finished run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
        }
예제 #10
0
        public static async Task Run(
            [QueueTrigger("compressimagesmessage")] CompressImagesMessage compressImagesMessage,
            [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
            TraceWriter log,
            ExecutionContext context)
        {
            var installationTokenParameters = new InstallationTokenParameters
            {
                AccessTokensUrl = compressImagesMessage.AccessTokensUrl,
                AppId           = KnownGitHubs.AppId,
            };

            var installationToken = await InstallationToken.GenerateAsync(
                installationTokenParameters,
                File.OpenText(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.AppPrivateKey}")));

            var compressImagesParameters = new CompressimagesParameters
            {
                CloneUrl            = compressImagesMessage.CloneUrl,
                LocalPath           = LocalPath.CloneDir(Environment.GetEnvironmentVariable("TMP") ?? "/private/tmp/", compressImagesMessage.RepoName),
                Password            = installationToken.Token,
                RepoName            = compressImagesMessage.RepoName,
                RepoOwner           = compressImagesMessage.Owner,
                PgpPrivateKeyStream = File.OpenRead(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.PGPPrivateKeyFilename}")),
                PgPPassword         = File.ReadAllText(Path.Combine(context.FunctionDirectory, $"../{KnownGitHubs.PGPPasswordFilename}"))
            };

            var didCompress = CompressImages.Run(compressImagesParameters);

            if (didCompress)
            {
                log.Info("Compressed images; Route to OpenPR");
                openPrMessages.Add(new OpenPrMessage
                {
                    InstallationId = compressImagesMessage.InstallationId,
                    RepoName       = compressImagesMessage.RepoName,
                    CloneUrl       = compressImagesMessage.CloneUrl,
                });
            }

            log.Info("Completed run");
        }
        public static async Task Trigger(
            [QueueTrigger("compressimagesmessage")] CompressImagesMessage compressImagesMessage,
            [Queue("longrunningcompressmessage")] ICollector <CompressImagesMessage> longRunningCompressMessages,
            [Queue("openprmessage")] ICollector <OpenPrMessage> openPrMessages,
            ILogger logger,
            ExecutionContext context)
        {
            var installationTokenProvider = new InstallationTokenProvider();
            var repoChecks = new RepoChecks();
            var task       = RunAsync(installationTokenProvider, compressImagesMessage, openPrMessages, repoChecks, logger, context);

            if (await Task.WhenAny(task, Task.Delay(570000)) == task)
            {
                await task;
            }
            else
            {
                logger.LogInformation($"Time out exceeded!");
                longRunningCompressMessages.Add(compressImagesMessage);
            }
        }
예제 #12
0
        public static async Task RunAsync(
            IInstallationTokenProvider installationTokenProvider,
            CompressImagesMessage compressImagesMessage,
            ICollector <OpenPrMessage> openPrMessages,
            IRepoChecks repoChecks,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation("CompressImagesFunction: starting run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
            var installationTokenParameters = new InstallationTokenParameters
            {
                AccessTokensUrl = string.Format(KnownGitHubs.AccessTokensUrlFormat, compressImagesMessage.InstallationId),
                AppId           = KnownGitHubs.AppId,
            };

            var installationToken = await installationTokenProvider.GenerateAsync(
                installationTokenParameters,
                KnownEnvironmentVariables.APP_PRIVATE_KEY);

            // check if repo is archived before starting work
            var isArchived = await repoChecks.IsArchived(new GitHubClientParameters
            {
                Password  = installationToken.Token,
                RepoName  = compressImagesMessage.RepoName,
                RepoOwner = compressImagesMessage.Owner
            });

            if (isArchived)
            {
                logger.LogInformation("CompressImagesFunction: skipping archived repo {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                return;
            }

            // check if imgbot branch already exists before starting work
            var branchExists = await repoChecks.BranchExists(new GitHubClientParameters
            {
                Password  = installationToken.Token,
                RepoName  = compressImagesMessage.RepoName,
                RepoOwner = compressImagesMessage.Owner,
            });

            if (branchExists)
            {
                logger.LogInformation("CompressImagesFunction: skipping repo {Owner}/{RepoName} as branch exists", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                return;
            }

            var compressImagesParameters = new CompressimagesParameters
            {
                CloneUrl              = compressImagesMessage.CloneUrl,
                LocalPath             = LocalPath.CloneDir(KnownEnvironmentVariables.TMP ?? "/private/tmp/", compressImagesMessage.RepoName),
                Password              = installationToken.Token,
                RepoName              = compressImagesMessage.RepoName,
                RepoOwner             = compressImagesMessage.Owner,
                PgpPrivateKey         = KnownEnvironmentVariables.PGP_PRIVATE_KEY,
                PgPPassword           = KnownEnvironmentVariables.PGP_PASSWORD,
                CompressImagesMessage = compressImagesMessage,
            };

            var didCompress = CompressImages.Run(compressImagesParameters, logger);

            if (didCompress)
            {
                logger.LogInformation("CompressImagesFunction: Successfully compressed images for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                openPrMessages.Add(new OpenPrMessage
                {
                    InstallationId = compressImagesMessage.InstallationId,
                    RepoName       = compressImagesMessage.RepoName,
                    CloneUrl       = compressImagesMessage.CloneUrl,
                });
            }

            logger.LogInformation("CompressImagesFunction: finished run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
        }
예제 #13
0
        public static async Task RunAsync(
            IInstallationTokenProvider installationTokenProvider,
            CompressImagesMessage compressImagesMessage,
            ICollector<OpenPrMessage> openPrMessages,
            ICollector<CompressImagesMessage> compressImagesMessages,
            CloudTable settingsTable,
            IRepoChecks repoChecks,
            ILogger logger,
            ExecutionContext context)
        {
            logger.LogInformation("CompressImagesFunction: starting run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
            var installationTokenParameters = new InstallationTokenParameters
            {
                AccessTokensUrl = string.Format(KnownGitHubs.AccessTokensUrlFormat, compressImagesMessage.InstallationId),
                AppId = KnownGitHubs.AppId,
            };
            var installationToken = await installationTokenProvider.GenerateAsync(
                installationTokenParameters,
                KnownEnvironmentVariables.APP_PRIVATE_KEY);

            // check if repo is archived before starting work
            var isArchived = await repoChecks.IsArchived(new GitHubClientParameters
            {
                Password = installationToken.Token,
                RepoName = compressImagesMessage.RepoName,
                RepoOwner = compressImagesMessage.Owner
            });

            if (isArchived)
            {
                logger.LogInformation("CompressImagesFunction: skipping archived repo {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                return;
            }

            // check if imgbot branch already exists before starting work
            var branchExists = await repoChecks.BranchExists(new GitHubClientParameters
            {
                Password = installationToken.Token,
                RepoName = compressImagesMessage.RepoName,
                RepoOwner = compressImagesMessage.Owner,
            });

            if (branchExists && !compressImagesMessage.IsRebase)
            {
                logger.LogInformation("CompressImagesFunction: skipping repo {Owner}/{RepoName} as branch exists", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                return;
            }

            var compressImagesParameters = new CompressimagesParameters
            {
                CloneUrl = compressImagesMessage.CloneUrl,
                LocalPath = LocalPath.CloneDir(KnownEnvironmentVariables.TMP ?? "/private/tmp/", compressImagesMessage.RepoName),
                Password = installationToken.Token,
                RepoName = compressImagesMessage.RepoName,
                RepoOwner = compressImagesMessage.Owner,
                IsRebase = compressImagesMessage.IsRebase,
                PgpPrivateKey = KnownEnvironmentVariables.PGP_PRIVATE_KEY,
                PgPPassword = KnownEnvironmentVariables.PGP_PASSWORD,
                CompressImagesMessage = compressImagesMessage,
                Settings = await Common.TableModels.SettingsHelper.GetSettings(settingsTable, compressImagesMessage.InstallationId, compressImagesMessage.RepoName),
            };

            var didCompress = CompressImages.Run(compressImagesParameters, compressImagesMessages, logger);

            if (didCompress && compressImagesParameters.CloneUrl.Contains(".wiki.git"))
            {
                logger.LogInformation("CompressImagesFunction: Successfully compressed images for {Owner}/{RepoName}/wiki", compressImagesMessage.Owner, compressImagesMessage.RepoName);
            }
            else if (didCompress)
            {
                var update = compressImagesMessage.IsRebase;
                logger.LogInformation("CompressImagesFunction: Successfully compressed images for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
                openPrMessages.Add(new OpenPrMessage
                {
                    InstallationId = compressImagesMessage.InstallationId,
                    RepoName = compressImagesMessage.RepoName,
                    CloneUrl = compressImagesMessage.CloneUrl,
                    Update = compressImagesMessage.IsRebase,
                });
            }

            try
            {
                Directory.Delete(compressImagesParameters.LocalPath, recursive: true);
            }
            catch (Exception exception)
            {
                logger.LogError(exception, "Error cleaning up local directory");
            }

            logger.LogInformation("CompressImagesFunction: finished run for {Owner}/{RepoName}", compressImagesMessage.Owner, compressImagesMessage.RepoName);
        }