Beispiel #1
0
        public FetchHandler(ITracer tracer,
                            IDeploymentManager deploymentManager,
                            IDeploymentSettingsManager settings,
                            IDeploymentStatusManager status,
                            IOperationLock deploymentLock,
                            IEnvironment environment,
                            IEnumerable <IServiceHookHandler> serviceHookHandlers,
                            IRepositoryFactory repositoryFactory,
                            IAutoSwapHandler autoSwapHandler)
        {
            _tracer              = tracer;
            _deploymentLock      = deploymentLock;
            _deploymentManager   = deploymentManager;
            _settings            = settings;
            _status              = status;
            _serviceHookHandlers = serviceHookHandlers;
            _repositoryFactory   = repositoryFactory;
            _autoSwapHandler     = autoSwapHandler;
            _markerFilePath      = Path.Combine(environment.DeploymentsPath, "pending");

            // Prefer marker creation in ctor to delay create when needed.
            // This is to keep the code simple and avoid creation synchronization.
            if (!FileSystemHelpers.FileExists(_markerFilePath))
            {
                try
                {
                    FileSystemHelpers.WriteAllText(_markerFilePath, String.Empty);
                }
                catch (Exception ex)
                {
                    tracer.TraceError(ex);
                }
            }
        }
Beispiel #2
0
 public ReceivePackHandler(ITracer tracer,
                           IGitServer gitServer,
                           IOperationLock deploymentLock,
                           IDeploymentManager deploymentManager,
                           IRepositoryFactory repositoryFactory,
                           IAutoSwapHandler autoSwapHandler)
     : base(tracer, gitServer, deploymentLock, deploymentManager)
 {
     _repositoryFactory = repositoryFactory;
     _autoSwapHandler = autoSwapHandler;
 }
Beispiel #3
0
 public ReceivePackHandler(ITracer tracer,
                           IGitServer gitServer,
                           IOperationLock deploymentLock,
                           IDeploymentManager deploymentManager,
                           IRepositoryFactory repositoryFactory,
                           IAutoSwapHandler autoSwapHandler)
     : base(tracer, gitServer, deploymentLock, deploymentManager)
 {
     _repositoryFactory = repositoryFactory;
     _autoSwapHandler   = autoSwapHandler;
 }
 private ReceivePackHandler CreateHandler(IGitServer gitServer = null, 
                                         IDeploymentManager deploymentManager = null, 
                                         IDeploymentSettingsManager settings = null, 
                                         IRepositoryFactory repositoryFactory = null,
                                         IAutoSwapHandler autoSwapHandler = null)
 {
     return new ReceivePackHandler(Mock.Of<ITracer>(),
                                   gitServer ?? Mock.Of<IGitServer>(),
                                   Mock.Of<IOperationLock>(),
                                   deploymentManager ?? Mock.Of<IDeploymentManager>(),
                                   repositoryFactory ?? Mock.Of<IRepositoryFactory>(),
                                   autoSwapHandler ?? Mock.Of<IAutoSwapHandler>());
 }
Beispiel #5
0
 private ReceivePackHandler CreateHandler(IGitServer gitServer = null,
                                          IDeploymentManager deploymentManager = null,
                                          IDeploymentSettingsManager settings  = null,
                                          IRepositoryFactory repositoryFactory = null,
                                          IAutoSwapHandler autoSwapHandler     = null)
 {
     return(new ReceivePackHandler(Mock.Of <ITracer>(),
                                   gitServer ?? Mock.Of <IGitServer>(),
                                   Mock.Of <IOperationLock>(),
                                   deploymentManager ?? Mock.Of <IDeploymentManager>(),
                                   repositoryFactory ?? Mock.Of <IRepositoryFactory>(),
                                   autoSwapHandler ?? Mock.Of <IAutoSwapHandler>()));
 }
 public DeploymentController(ITracer tracer,
                             IDeploymentManager deploymentManager,
                             IDeploymentStatusManager status,
                             IOperationLock deploymentLock,
                             IRepositoryFactory repositoryFactory,
                             IAutoSwapHandler autoSwapHandler)
 {
     _tracer = tracer;
     _deploymentManager = deploymentManager;
     _status = status;
     _deploymentLock = deploymentLock;
     _repositoryFactory = repositoryFactory;
     _autoSwapHandler = autoSwapHandler;
 }
Beispiel #7
0
 public DeploymentController(ITracer tracer,
                             IDeploymentManager deploymentManager,
                             IDeploymentStatusManager status,
                             IOperationLock deploymentLock,
                             IRepositoryFactory repositoryFactory,
                             IAutoSwapHandler autoSwapHandler)
 {
     _tracer            = tracer;
     _deploymentManager = deploymentManager;
     _status            = status;
     _deploymentLock    = deploymentLock;
     _repositoryFactory = repositoryFactory;
     _autoSwapHandler   = autoSwapHandler;
 }
 public DeploymentController(ITracer tracer,
                             IEnvironment environment,
                             IAnalytics analytics,
                             IDeploymentManager deploymentManager,
                             IDeploymentStatusManager status,
                             IDeploymentSettingsManager settings,
                             IOperationLock deploymentLock,
                             IRepositoryFactory repositoryFactory,
                             IAutoSwapHandler autoSwapHandler)
 {
     _tracer = tracer;
     _environment = environment;
     _analytics = analytics;
     _deploymentManager = deploymentManager;
     _status = status;
     _settings = settings;
     _deploymentLock = deploymentLock;
     _repositoryFactory = repositoryFactory;
     _autoSwapHandler = autoSwapHandler;
 }
Beispiel #9
0
 public DeploymentController(ITracer tracer,
                             IEnvironment environment,
                             IAnalytics analytics,
                             IDeploymentManager deploymentManager,
                             IDeploymentStatusManager status,
                             IDeploymentSettingsManager settings,
                             IOperationLock deploymentLock,
                             IRepositoryFactory repositoryFactory,
                             IAutoSwapHandler autoSwapHandler)
 {
     _tracer            = tracer;
     _environment       = environment;
     _analytics         = analytics;
     _deploymentManager = deploymentManager;
     _status            = status;
     _settings          = settings;
     _deploymentLock    = deploymentLock;
     _repositoryFactory = repositoryFactory;
     _autoSwapHandler   = autoSwapHandler;
 }
Beispiel #10
0
 private FetchHandler CreateFetchHandler(ITracer tracer = null,
                                         IDeploymentManager deploymentManager   = null,
                                         IDeploymentSettingsManager settings    = null,
                                         IDeploymentStatusManager status        = null,
                                         IOperationLock deploymentLock          = null,
                                         IEnvironment environment               = null,
                                         IServiceHookHandler serviceHookHandler = null,
                                         IRepositoryFactory repositoryFactory   = null,
                                         IFileSystem fileSystem           = null,
                                         IAutoSwapHandler autoSwapHandler = null)
 {
     FileSystemHelpers.Instance = fileSystem ?? Mock.Of <IFileSystem>();
     return(new FetchHandler(tracer ?? Mock.Of <ITracer>(),
                             deploymentManager ?? Mock.Of <IDeploymentManager>(),
                             settings ?? Mock.Of <IDeploymentSettingsManager>(),
                             status ?? Mock.Of <IDeploymentStatusManager>(),
                             deploymentLock ?? Mock.Of <IOperationLock>(),
                             environment ?? Mock.Of <IEnvironment>(),
                             new[] { serviceHookHandler ?? Mock.Of <IServiceHookHandler>() },
                             repositoryFactory ?? Mock.Of <IRepositoryFactory>(),
                             autoSwapHandler ?? Mock.Of <IAutoSwapHandler>()));
 }
Beispiel #11
0
 public DeploymentManager(ISiteBuilderFactory builderFactory,
                          IEnvironment environment,
                          ITraceFactory traceFactory,
                          IAnalytics analytics,
                          IDeploymentSettingsManager settings,
                          IDeploymentStatusManager status,
                          IOperationLock deploymentLock,
                          ILogger globalLogger,
                          IWebHooksManager hooksManager,
                          IAutoSwapHandler autoSwapHandler,
                          IFunctionManager functionManager)
 {
     _builderFactory = builderFactory;
     _environment = environment;
     _traceFactory = traceFactory;
     _analytics = analytics;
     _deploymentLock = deploymentLock;
     _globalLogger = globalLogger ?? NullLogger.Instance;
     _settings = settings;
     _status = status;
     _hooksManager = hooksManager;
     _autoSwapHandler = autoSwapHandler;
     _functionManager = functionManager;
 }
Beispiel #12
0
 public DeploymentManager(ISiteBuilderFactory builderFactory,
                          IEnvironment environment,
                          ITraceFactory traceFactory,
                          IAnalytics analytics,
                          IDeploymentSettingsManager settings,
                          IDeploymentStatusManager status,
                          IOperationLock deploymentLock,
                          ILogger globalLogger,
                          IWebHooksManager hooksManager,
                          IAutoSwapHandler autoSwapHandler,
                          IFunctionManager functionManager)
 {
     _builderFactory  = builderFactory;
     _environment     = environment;
     _traceFactory    = traceFactory;
     _analytics       = analytics;
     _deploymentLock  = deploymentLock;
     _globalLogger    = globalLogger ?? NullLogger.Instance;
     _settings        = settings;
     _status          = status;
     _hooksManager    = hooksManager;
     _autoSwapHandler = autoSwapHandler;
     _functionManager = functionManager;
 }
Beispiel #13
0
        // key goal is to create background tracer that is independent of request.
        public static void PerformBackgroundDeployment(DeploymentInfo deployInfo, IEnvironment environment, IDeploymentSettingsManager settings, TraceLevel traceLevel, Uri uri, IDisposable tempDeployment, IAutoSwapHandler autoSwapHandler, ChangeSet tempChangeSet)
        {
            var tracer       = traceLevel <= TraceLevel.Off ? NullTracer.Instance : new XmlTracer(environment.TracePath, traceLevel);
            var traceFactory = new TracerFactory(() => tracer);

            var backgroundTrace = tracer.Step(XmlTracer.BackgroundTrace, new Dictionary <string, string>
            {
                { "url", uri.AbsolutePath },
                { "method", "POST" }
            });

            Task.Run(() =>
            {
                try
                {
                    // lock related
                    string lockPath           = Path.Combine(environment.SiteRootPath, Constants.LockPath);
                    string deploymentLockPath = Path.Combine(lockPath, Constants.DeploymentLockFile);
                    string statusLockPath     = Path.Combine(lockPath, Constants.StatusLockFile);
                    string hooksLockPath      = Path.Combine(lockPath, Constants.HooksLockFile);
                    var statusLock            = new LockFile(statusLockPath, traceFactory);
                    var hooksLock             = new LockFile(hooksLockPath, traceFactory);
                    var deploymentLock        = new DeploymentLockFile(deploymentLockPath, traceFactory);

                    var analytics = new Analytics(settings, new ServerConfiguration(), traceFactory);
                    var deploymentStatusManager = new DeploymentStatusManager(environment, analytics, statusLock);
                    var repositoryFactory       = new RepositoryFactory(environment, settings, traceFactory);
                    var siteBuilderFactory      = new SiteBuilderFactory(new BuildPropertyProvider(), environment);
                    var webHooksManager         = new WebHooksManager(tracer, environment, hooksLock);
                    var functionManager         = new FunctionManager(environment, traceFactory);
                    var deploymentManager       = new DeploymentManager(siteBuilderFactory, environment, traceFactory, analytics, settings, deploymentStatusManager, deploymentLock, NullLogger.Instance, webHooksManager, functionManager);
                    var fetchHandler            = new FetchHandler(tracer, deploymentManager, settings, deploymentStatusManager, deploymentLock, environment, null, repositoryFactory, autoSwapHandler);

                    try
                    {
                        // Perform deployment
                        deploymentLock.LockOperation(() =>
                        {
                            fetchHandler.PerformDeployment(deployInfo, tempDeployment, tempChangeSet).Wait();
                        }, "Performing continuous deployment", TimeSpan.Zero);
                    }
                    catch (LockOperationException)
                    {
                        if (tempDeployment != null)
                        {
                            tempDeployment.Dispose();
                        }

                        using (tracer.Step("Update pending deployment marker file"))
                        {
                            // REVIEW: This makes the assumption that the repository url is the same.
                            // If it isn't the result would be buggy either way.
                            FileSystemHelpers.SetLastWriteTimeUtc(fetchHandler._markerFilePath, DateTime.UtcNow);
                        }
                    }
                }
                catch (Exception ex)
                {
                    tracer.TraceError(ex);
                }
                finally
                {
                    backgroundTrace.Dispose();
                }
            });
        }
 private FetchHandler CreateFetchHandler(ITracer tracer = null,
                                         IDeploymentManager deploymentManager = null,
                                         IDeploymentSettingsManager settings = null,
                                         IDeploymentStatusManager status = null,
                                         IOperationLock deploymentLock = null,
                                         IEnvironment environment = null,
                                         IServiceHookHandler serviceHookHandler = null,
                                         IRepositoryFactory repositoryFactory = null,
                                         IFileSystem fileSystem = null,
                                         IAutoSwapHandler autoSwapHandler = null)
 {
     FileSystemHelpers.Instance = fileSystem ?? Mock.Of<IFileSystem>();
     return new FetchHandler(tracer ?? Mock.Of<ITracer>(),
                             deploymentManager ?? Mock.Of<IDeploymentManager>(),
                             settings ?? Mock.Of<IDeploymentSettingsManager>(),
                             status ?? Mock.Of<IDeploymentStatusManager>(),
                             deploymentLock ?? Mock.Of<IOperationLock>(),
                             environment ?? Mock.Of<IEnvironment>(),
                             new[] { serviceHookHandler ?? Mock.Of<IServiceHookHandler>() },
                             repositoryFactory ?? Mock.Of<IRepositoryFactory>(),
                             autoSwapHandler ?? Mock.Of<IAutoSwapHandler>());
 }
Beispiel #15
0
        // key goal is to create background tracer that is independent of request.
        public static void PerformBackgroundDeployment(DeploymentInfo deployInfo, IEnvironment environment, IDeploymentSettingsManager settings, TraceLevel traceLevel, Uri uri, IDisposable tempDeployment, IAutoSwapHandler autoSwapHandler, ChangeSet tempChangeSet)
        {
            var tracer = traceLevel <= TraceLevel.Off ? NullTracer.Instance : new XmlTracer(environment.TracePath, traceLevel);
            var traceFactory = new TracerFactory(() => tracer);

            var backgroundTrace = tracer.Step(XmlTracer.BackgroundTrace, new Dictionary<string, string>
            {
                {"url", uri.AbsolutePath},
                {"method", "POST"}
            });

            Task.Run(() =>
            {
                try
                {
                    // lock related
                    string lockPath = Path.Combine(environment.SiteRootPath, Constants.LockPath);
                    string deploymentLockPath = Path.Combine(lockPath, Constants.DeploymentLockFile);
                    string statusLockPath = Path.Combine(lockPath, Constants.StatusLockFile);
                    string hooksLockPath = Path.Combine(lockPath, Constants.HooksLockFile);
                    var statusLock = new LockFile(statusLockPath, traceFactory);
                    var hooksLock = new LockFile(hooksLockPath, traceFactory);
                    var deploymentLock = new DeploymentLockFile(deploymentLockPath, traceFactory);

                    var analytics = new Analytics(settings, new ServerConfiguration(), traceFactory);
                    var deploymentStatusManager = new DeploymentStatusManager(environment, analytics, statusLock);
                    var repositoryFactory = new RepositoryFactory(environment, settings, traceFactory);
                    var siteBuilderFactory = new SiteBuilderFactory(new BuildPropertyProvider(), environment);
                    var webHooksManager = new WebHooksManager(tracer, environment, hooksLock);
                    var functionManager = new FunctionManager(environment, traceFactory);
                    var deploymentManager = new DeploymentManager(siteBuilderFactory, environment, traceFactory, analytics, settings, deploymentStatusManager, deploymentLock, NullLogger.Instance, webHooksManager, autoSwapHandler, functionManager);
                    var fetchHandler = new FetchHandler(tracer, deploymentManager, settings, deploymentStatusManager, deploymentLock, environment, null, repositoryFactory, null);

                    // Perform deployment
                    var acquired = deploymentLock.TryLockOperation(() =>
                    {
                        fetchHandler.PerformDeployment(deployInfo, tempDeployment, tempChangeSet).Wait();
                    }, TimeSpan.Zero);

                    if (!acquired)
                    {
                        if (tempDeployment != null)
                        {
                            tempDeployment.Dispose();
                        }

                        using (tracer.Step("Update pending deployment marker file"))
                        {
                            // REVIEW: This makes the assumption that the repository url is the same.
                            // If it isn't the result would be buggy either way.
                            FileSystemHelpers.SetLastWriteTimeUtc(fetchHandler._markerFilePath, DateTime.UtcNow);
                        }
                    }
                }
                catch (Exception ex)
                {
                    tracer.TraceError(ex);
                }
                finally
                {
                    backgroundTrace.Dispose();
                }
            });
        }
Beispiel #16
0
        // key goal is to create background tracer that is independent of request.
        public static async Task PerformBackgroundDeployment(
            DeploymentInfo deployInfo,
            IEnvironment environment,
            IDeploymentSettingsManager settings,
            TraceLevel traceLevel,
            Uri uri,
            bool waitForTempDeploymentCreation,
            IAutoSwapHandler autoSwapHandler)
        {
            var tracer       = traceLevel <= TraceLevel.Off ? NullTracer.Instance : new XmlTracer(environment.TracePath, traceLevel);
            var traceFactory = new TracerFactory(() => tracer);

            var backgroundTrace = tracer.Step(XmlTracer.BackgroundTrace, new Dictionary <string, string>
            {
                { "url", uri.AbsolutePath },
                { "method", "POST" }
            });

            // For monitoring creation of temp deployment
            var tcs = new TaskCompletionSource <object>();

            // This task will be let out of scope intentionally
            var deploymentTask = Task.Run(() =>
            {
                try
                {
                    // lock related
                    string lockPath           = Path.Combine(environment.SiteRootPath, Constants.LockPath);
                    string deploymentLockPath = Path.Combine(lockPath, Constants.DeploymentLockFile);
                    string statusLockPath     = Path.Combine(lockPath, Constants.StatusLockFile);
                    string hooksLockPath      = Path.Combine(lockPath, Constants.HooksLockFile);
                    var statusLock            = new LockFile(statusLockPath, traceFactory);
                    var hooksLock             = new LockFile(hooksLockPath, traceFactory);
                    var deploymentLock        = new DeploymentLockFile(deploymentLockPath, traceFactory);

                    var analytics = new Analytics(settings, new ServerConfiguration(), traceFactory);
                    var deploymentStatusManager = new DeploymentStatusManager(environment, analytics, statusLock);
                    var repositoryFactory       = new RepositoryFactory(environment, settings, traceFactory);
                    var siteBuilderFactory      = new SiteBuilderFactory(new BuildPropertyProvider(), environment);
                    var webHooksManager         = new WebHooksManager(tracer, environment, hooksLock);
                    var functionManager         = new FunctionManager(environment, traceFactory);
                    var deploymentManager       = new DeploymentManager(siteBuilderFactory, environment, traceFactory, analytics, settings, deploymentStatusManager, deploymentLock, NullLogger.Instance, webHooksManager, functionManager);
                    var fetchHandler            = new FetchHandler(tracer, deploymentManager, settings, deploymentStatusManager, deploymentLock, environment, null, repositoryFactory, autoSwapHandler);

                    IDisposable tempDeployment = null;

                    try
                    {
                        // Perform deployment
                        deploymentLock.LockOperation(() =>
                        {
                            ChangeSet tempChangeSet = null;
                            if (waitForTempDeploymentCreation)
                            {
                                // create temporary deployment before the actual deployment item started
                                // this allows portal ui to readily display on-going deployment (not having to wait for fetch to complete).
                                // in addition, it captures any failure that may occur before the actual deployment item started
                                tempDeployment = deploymentManager.CreateTemporaryDeployment(
                                    Resources.ReceivingChanges,
                                    out tempChangeSet,
                                    deployInfo.TargetChangeset,
                                    deployInfo.Deployer);

                                tcs.TrySetResult(null);
                            }

                            fetchHandler.PerformDeployment(deployInfo, tempDeployment, tempChangeSet).Wait();
                        }, "Performing continuous deployment", TimeSpan.Zero);
                    }
                    catch (LockOperationException)
                    {
                        if (tempDeployment != null)
                        {
                            tempDeployment.Dispose();
                        }

                        using (tracer.Step("Update pending deployment marker file"))
                        {
                            // REVIEW: This makes the assumption that the repository url is the same.
                            // If it isn't the result would be buggy either way.
                            FileSystemHelpers.SetLastWriteTimeUtc(fetchHandler._markerFilePath, DateTime.UtcNow);
                        }
                    }
                }
                catch (Exception ex)
                {
                    tracer.TraceError(ex);
                }
                finally
                {
                    backgroundTrace.Dispose();
                }
            });

            // When the frontend/ARM calls /deploy with isAsync=true, it starts polling
            // the deployment status immediately, so it's important that the temp deployment
            // is created before we return.
            if (waitForTempDeploymentCreation)
            {
                // If deploymentTask blows up before it creates the temp deployment,
                // go ahead and return.
                await Task.WhenAny(tcs.Task, deploymentTask);
            }
        }
Beispiel #17
-1
        public FetchHandler(ITracer tracer,
                            IDeploymentManager deploymentManager,
                            IDeploymentSettingsManager settings,
                            IDeploymentStatusManager status,
                            IOperationLock deploymentLock,
                            IEnvironment environment,
                            IEnumerable<IServiceHookHandler> serviceHookHandlers,
                            IRepositoryFactory repositoryFactory,
                            IAutoSwapHandler autoSwapHandler)
        {
            _tracer = tracer;
            _deploymentLock = deploymentLock;
            _environment = environment;
            _deploymentManager = deploymentManager;
            _settings = settings;
            _status = status;
            _serviceHookHandlers = serviceHookHandlers;
            _repositoryFactory = repositoryFactory;
            _autoSwapHandler = autoSwapHandler;
            _markerFilePath = Path.Combine(environment.DeploymentsPath, "pending");

            // Prefer marker creation in ctor to delay create when needed.
            // This is to keep the code simple and avoid creation synchronization.
            if (!FileSystemHelpers.FileExists(_markerFilePath))
            {
                try
                {
                    FileSystemHelpers.WriteAllText(_markerFilePath, String.Empty);
                }
                catch (Exception ex)
                {
                    tracer.TraceError(ex);
                }
            }
        }