public BuildRepositoryTests()
 {
     _request        = Substitute.For <IRequest>();
     _requestFactory = Substitute.For <IRequestFactory>();
     _requestFactory.Create(Arg.Any <string>(), Arg.Any <Method>(), Arg.Any <bool>()).Returns(_request);
     _sut = new BuildRepository(_requestFactory);
 }
示例#2
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            // set provider instances for legacy code (task manager, preview provider)
            Services.AddSenseNetProviderInstances();

            var configuration = Services.GetService <IConfiguration>();

            var repositoryBuilder = new RepositoryBuilder()
                                    .UseConfiguration(configuration)
                                    .UseLogger(new SnFileSystemEventLogger())
                                    .UseTracer(new SnFileSystemTracer())
                                    .UseAccessProvider(new UserAccessProvider())
                                    .UseDataProvider(new MsSqlDataProvider())
                                    .StartWorkflowEngine(false)
                                    .UseTraceCategories("Event", "Custom", "System", "Security") as RepositoryBuilder;

            // hook for developers to modify the repository builder before start
            BuildRepository?.Invoke(repositoryBuilder, Services);

            try
            {
                Repository = ContentRepository.Repository.Start(repositoryBuilder);

                if (OnRepositoryStartedAsync != null)
                {
                    await OnRepositoryStartedAsync.Invoke(Repository, Services);
                }
            }
            catch (Exception ex)
            {
                SnLog.WriteException(ex, $"Error during repository start: {ex.Message}");
                throw;
            }
        }
/*		static void StreamDeclaredSystemsValue<TDoc, TCursor>(IO.TagElementStream<TDoc, TCursor, string> s,
 *                      BlamEngine engine,
 *                      ref string externsFile)
 *                      where TDoc : class
 *                      where TCursor : class
 *              {
 *                      s.StreamAttributeOpt("externs", ref externsFile, Predicates.IsNotNullOrEmpty);
 *              }*/

        public void Serialize <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
            where TDoc : class
            where TCursor : class
        {
            Contract.Assert(s.Owner == null);
            s.Owner = this;

            using (s.EnterUserDataBookmark(this))
            {
                BuildRepository.Serialize(s);

                using (var bm = s.EnterCursorBookmarkOpt("Systems", mSystemPrototypes, Predicates.HasItems)) if (bm.IsNotNull)
                    {
                        s.StreamableElements("System",
                                             mSystemPrototypes, this, StreamSystemPrototypeKey);
                    }
            }

/*			using (var bm = s.EnterCursorBookmarkOpt("Systems", mDeclaredSystems, Predicates.HasItems)) if (bm.IsNotNull)
 *                              s.StreamElements("System", mDeclaredSystems, this,
 *                                      StreamSystemPrototypeKey, StreamDeclaredSystemsValue,
 *                                      _ctxt => null);*/

            if (s.IsReading)
            {
                if (mSystemPrototypes.Count > 0)
                {
                    mActiveSystems = new Dictionary <Values.KGuid, EngineSystemBase>(mSystemPrototypes.Count);
                }
            }
        }
示例#4
0
        public async Task <ActionResult> migrate()
        {
            BuildRepository _bModel = new BuildRepository();
            await _bModel.MigrateAddedModifiedToHistory();

            return(RedirectToAction("index"));
        }
示例#5
0
        public async Task <ActionResult> cache()
        {
            BuildRepository _bModel = new BuildRepository();
            await _bModel.RegenerateCachedProperties();

            return(RedirectToAction("index"));
        }
        public void GetLastFailedBuildAsync_WithFailedBuilds_ReturnsLastBuild()
        {
            // Arrange
            var data = new List <Build>
            {
                new Build {
                    BuildNumber = "bn0", Id = 0, CreatedAt = new DateTime(2014, 01, 01), Status = BuildStatus.PartiallySucceeded
                },
                new Build {
                    BuildNumber = "bn1", Id = 1, CreatedAt = new DateTime(2014, 01, 02), Status = BuildStatus.Failed
                },
                new Build {
                    BuildNumber = "bn2", Id = 2, CreatedAt = new DateTime(2014, 01, 03), Status = BuildStatus.Succeeded
                }
            }
            .AsQueryable();


            var mockContext = BuildBuildContext(data);

            var target = new BuildRepository(mockContext.Object);

            // Act
            var act = target.GetLastFailedBuildAsync().Result;

            // Assert
            Assert.AreEqual(1, act.Id);
        }
示例#7
0
        public async Task <ActionResult> RegenerateCache()
        {
            var bRepo = new BuildRepository();
            await bRepo.RegenerateCachedProperties();

            return(RedirectToAction(nameof(Index)));
        }
 public BuildTasksService(PriorityQueue <BuildTask> queue, BuildStepRepository buildStepRepository, ILogger <BuildTasksService> logger, ProjectRepository projectRepository, BuildRepository buildRepository)
 {
     this.queue = queue;
     this.buildStepRepository = buildStepRepository;
     this.logger            = logger;
     this.projectRepository = projectRepository;
     this.buildRepository   = buildRepository;
 }
        protected override async System.Threading.Tasks.Task InitializeAsync(CancellationToken cancellationToken, IProgress <ServiceProgressData> progress)
        {
            // Switches to the UI thread, which most of this package requires. Even joining the main thread here improves
            // the load time of the package, and it stops a warning popping up when you load vs2019 with the package installed.
            await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);

            await base.InitializeAsync(cancellationToken, progress);

            output = new OutputWindowWrapper(this);

            SettingsManager       settingsManager = new ShellSettingsManager(ServiceProvider.GlobalProvider);
            WritableSettingsStore settingsStore   = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings);

            Settings.Instance = new Settings(settingsStore);

            var factory    = new BuildFactory();
            var repository = new BuildRepository(Settings.Instance.RepositoryPath);

            monitor      = new BuildMonitor.Domain.Monitor(factory, repository);
            dataAdjuster = new DataAdjusterWithLogging(repository, output.WriteLine);

            //if invalid data, adjust it
            dataAdjuster.Adjust();


            // Get solution build manager
            sbm = ServiceProvider.GlobalProvider.GetService(typeof(SVsSolutionBuildManager)) as IVsSolutionBuildManager2;
            if (sbm != null)
            {
                sbm.AdviseUpdateSolutionEvents(this, out updateSolutionEventsCookie);
            }

            // Must hold a reference to the solution events object or the events wont fire, garbage collection related
            events         = GetDTE().Events.SolutionEvents;
            events.Opened += Solution_Opened;
            GetDTE().Events.BuildEvents.OnBuildBegin += Build_Begin;

            output.WriteLine("Build monitor initialized");
            output.WriteLine("Path to persist data: {0}", Settings.Instance.RepositoryPath);

            monitor.SolutionBuildFinished = b =>
            {
                output.Write("[{0}] Time Elapsed: {1} \t\t", b.SessionBuildCount, b.SolutionBuildTime.ToTime());
                output.WriteLine("Session build time: {0}\n", b.SessionMillisecondsElapsed.ToTime());
                output.WriteLine("Rebuild All: {0}\n", b.SolutionBuild.IsRebuildAll);
                //System.Threading.Tasks.Task.Factory.StartNew(() => SaveToDatabase(b));
            };

            monitor.ProjectBuildFinished = b => output.WriteLine(" - {0}\t-- {1} --", b.MillisecondsElapsed.ToTime(), b.ProjectName);

            // In vs 2017 and earlier, this event was always called, but in 2019 it isn't called if you open a solution on startup.
            // I imagine this is because the solution has already loaded before we connect to the events. To get over it we just
            // manually call the event here.
            Solution_Opened();

            AnalyseBuildTimesCommand.Initialize(this);
        }
 protected PullRequestUpdaterBase(IPullRequestRepository pullRequestRepository, RequestData requestData, RepositoryRepository repositoryRepository,
                                  UpdateStatusRepository updateStatusRepository, BuildRepository buildRepository, ILogger <PullRequestUpdaterBase> logger) : base(logger)
 {
     RequestData = requestData;
     this.repositoryRepository   = repositoryRepository;
     this.updateStatusRepository = updateStatusRepository;
     this.buildRepository        = buildRepository;
     PullRequestRepository       = pullRequestRepository;
 }
示例#11
0
 public PullRequestUpdater(PullRequestRepository pullRequestRepository, RequestData requestData, RepositoryRepository repositoryRepository,
                           UpdateStatusRepository updateStatusRepository, BuildRepository buildRepository, ILogger <PullRequestUpdater> logger) : base(logger)
 {
     this.requestData            = requestData;
     this.repositoryRepository   = repositoryRepository;
     this.updateStatusRepository = updateStatusRepository;
     this.buildRepository        = buildRepository;
     this.pullRequestRepository  = pullRequestRepository;
 }
示例#12
0
 public BuildUpdater(BuildRepository buildRepository, RequestData requestData, ProjectRepository projectRepository, UpdateStatusRepository updateStatusRepository, ILogger <BuildUpdater> logger, RepositoryRepository repositoryRepository, BuildDefinitionRepository buildDefinitionRepository)
     : base(logger)
 {
     this.buildRepository           = buildRepository;
     this.requestData               = requestData;
     this.projectRepository         = projectRepository;
     this.updateStatusRepository    = updateStatusRepository;
     this.repositoryRepository      = repositoryRepository;
     this.buildDefinitionRepository = buildDefinitionRepository;
 }
        public BuildMonitorPackage()
        {
            Settings.CreateApplicationFolderIfNotExist();

            var factory    = new BuildFactory();
            var repository = new BuildRepository(Settings.RepositoryPath);

            monitor      = new Monitor(factory, repository);
            dataAdjuster = new DataAdjusterWithLogging(repository, PrintLine);
        }
示例#14
0
        private async Task <BuildDefinition> CreateDefinitionAsync(string definitionName, SdkComponent component, CancellationToken cancellationToken)
        {
            var serviceEndpoint = await Context.GetServiceEndpointAsync(cancellationToken);

            var repository = Context.Repository;

            var buildRepository = new BuildRepository
            {
                DefaultBranch = Context.Branch,
                Id            = repository,
                Name          = repository,
                Type          = "GitHub",
                Url           = new Uri($"https://github.com/{repository}.git"),
                Properties    = { ["connectedServiceId"] = serviceEndpoint.Id.ToString() }
            };

            var projectReference = await Context.GetProjectReferenceAsync(cancellationToken);

            var agentPoolQueue = await Context.GetAgentPoolQueue(cancellationToken);

            var normalizedRelativeYamlPath = component.RelativeYamlPath.Replace("\\", "/");

            var definition = new BuildDefinition()
            {
                Name       = definitionName,
                Project    = projectReference,
                Path       = Context.DevOpsPath,
                Repository = buildRepository,
                Process    = new YamlProcess()
                {
                    YamlFilename = normalizedRelativeYamlPath
                },
                Queue = agentPoolQueue
            };

            if (!Context.WhatIf)
            {
                Logger.LogDebug("Creating definition named '{0}'.", definitionName);

                var buildClient = await Context.GetBuildHttpClientAsync(cancellationToken);

                definition = await buildClient.CreateDefinitionAsync(
                    definition : definition,
                    cancellationToken : cancellationToken
                    );

                Logger.LogInformation("Created definition '{0}' at: {1}", definitionName, definition.GetWebUrl());
            }
            else
            {
                Logger.LogWarning("Skipping creating definition '{0}' (--whatif).", definitionName);
            }

            return(definition);
        }
        public void GetCurrentBuildReturnsIsCurrentlyBuilding()
        {
            SetupMockConnectionHelper(MockUrl, SetUpExpectedResultXml());
            SetupMockConnectionHelper(ExpectedResult.ApiLink, XDocument.Parse("<build><building>true</building><result>Unstable</result></build>"));

            _buildRepositoryToTest = new BuildRepository(_mockHelper.Object);

            var buildToTest = _buildRepositoryToTest.GetCurrentBuild(MockUrl);

            Assert.IsTrue(buildToTest.IsBuilding);
        }
示例#16
0
        private async Task <BuildDefinition> CreateDefinitionAsync(string definitionName, SdkComponent component, CancellationToken cancellationToken)
        {
            var sourceRepository = await Context.GetSourceRepositoryAsync(cancellationToken);

            var buildRepository = new BuildRepository()
            {
                DefaultBranch = Context.Branch,
                Id            = sourceRepository.Id,
                Name          = sourceRepository.FullName,
                Type          = "GitHub",
                Url           = new Uri(sourceRepository.Properties["cloneUrl"]),
            };

            buildRepository.Properties.AddRangeIfRangeNotNull(sourceRepository.Properties);

            var projectReference = await Context.GetProjectReferenceAsync(cancellationToken);

            var agentPoolQueue = await Context.GetAgentPoolQueue(cancellationToken);

            var normalizedRelativeYamlPath = component.RelativeYamlPath.Replace("\\", "/");

            var definition = new BuildDefinition()
            {
                Name       = definitionName,
                Project    = projectReference,
                Path       = Context.DevOpsPath,
                Repository = buildRepository,
                Process    = new YamlProcess()
                {
                    YamlFilename = normalizedRelativeYamlPath
                },
                Queue = agentPoolQueue
            };

            if (!Context.WhatIf)
            {
                Logger.LogDebug("Creating definition named '{0}'.", definitionName);

                var buildClient = await Context.GetBuildHttpClientAsync(cancellationToken);

                definition = await buildClient.CreateDefinitionAsync(
                    definition : definition,
                    cancellationToken : cancellationToken
                    );

                Logger.LogInformation("Created definition '{0}' at: {1}", definitionName, definition.GetWebUrl());
            }
            else
            {
                Logger.LogWarning("Skipping creating definition '{0}' (--whatif).", definitionName);
            }

            return(definition);
        }
示例#17
0
 public JobRequestUpdater(JobRequestRepository jobRequestRepository, RequestData requestData, PoolRepository poolRepository, BuildRepository buildRepository, UpdateStatusRepository updateStatusRepository, BuildDefinitionRepository buildDefinitionRepository, ProjectRepository projectRepository, ReleaseDefinitionRepository releaseDefinitionRepository, ILogger <JobRequestUpdater> logger) : base(logger)
 {
     this.jobRequestRepository        = jobRequestRepository;
     this.requestData                 = requestData;
     this.poolRepository              = poolRepository;
     this.buildRepository             = buildRepository;
     this.updateStatusRepository      = updateStatusRepository;
     this.buildDefinitionRepository   = buildDefinitionRepository;
     this.projectRepository           = projectRepository;
     this.releaseDefinitionRepository = releaseDefinitionRepository;
 }
示例#18
0
 private static void Main(string[] args)
 {
     Task.Run(async() =>
     {
         BuildRepository bModel = new BuildRepository();
         foreach (Build build in await bModel.SelectBuildsByOrder())
         {
             await bModel.Update(build);
         }
     }).Wait();
 }
        public void GetCurrentBuildReturnsBuildDetails()
        {
            SetupMockConnectionHelper(MockUrl, SetUpExpectedResultXml());
            SetupMockConnectionHelper(ExpectedResult.ApiLink, new XDocument());

            _buildRepositoryToTest = new BuildRepository(_mockHelper.Object);
            var buildToTest = _buildRepositoryToTest.GetCurrentBuild(MockUrl);

            Assert.AreEqual(ExpectedResult.BuildNumber, buildToTest.BuildNumber);
            Assert.AreEqual(ExpectedResult.Link, buildToTest.Link);
        }
        public void GetMonthlyHighlitedBuilds_OnTakeTwo_GetTwoBuildsFromDifferentProjects()
        {
            // Arrange
            var mockContext = BuildHighlitedBuildContext();
            var target      = new BuildRepository(mockContext.Object);

            // Act
            var act = target.GetMonthHighlitedBuilds(2014, 1, true, 2, null).Result;

            // Assert
            Assert.AreNotEqual(act[0].Project.Name, act[1].Project.Name);
        }
        public void GetMonthlyHighlitedBuilds_OnTakeTwo_GetTwoBuilds()
        {
            // Arrange
            var mockContext = BuildHighlitedBuildContext();
            var target      = new BuildRepository(mockContext.Object);

            // Act
            var act = target.GetMonthHighlitedBuilds(2014, 1, true, 2, null).Result;

            // Assert
            Assert.AreEqual(2, act.Count());
        }
        public void GetCurrentBuildWithUnrecognizedBuildState()
        {
            SetupMockConnectionHelper(MockUrl, SetUpExpectedResultXml());
            SetupMockConnectionHelper(ExpectedResult.ApiLink, XDocument.Parse("<build><result>Succeed</result></build>"));

            _buildRepositoryToTest = new BuildRepository(_mockHelper.Object);


            var buildToTest = _buildRepositoryToTest.GetCurrentBuild(MockUrl);

            Assert.AreEqual(Build.BuildState.Unknown, buildToTest.State);
        }
        public void GetMonthlyHighlitedBuilds_OnFilterByDashboard_GetDashboardProject()
        {
            // Arrange
            var mockContext = BuildHighlitedBuildContext();
            var target      = new BuildRepository(mockContext.Object);

            // Act
            var act = target.GetMonthHighlitedBuilds(2014, 1, true, 1, "DS1").Result;

            // Assert
            Assert.AreNotEqual("project1", act[0].Project.Name);
        }
示例#24
0
 public async Task<ActionResult> BuildLog(string projectId, string buildType)
 {
     if (!string.IsNullOrEmpty(projectId))
     {
         var buildRepo = new BuildRepository();
         if (!string.IsNullOrEmpty(projectId))
         {
             var builds = await buildRepo.GetByProject(projectId);
             return View(builds);
         }
     }
     return View(new List<Build>());
 }
        public void GetHighlitedBuilds_OnTop_GetHighestScoreBuilds()
        {
            // Arrange
            var mockContext = BuildHighlitedBuildContext();
            var target      = new BuildRepository(mockContext.Object);

            // Act
            var act = target.GetHighlitedBuilds(true, 1).Result;

            // Assert
            Assert.AreEqual(1, act.Count());
            Assert.AreEqual(4, act.First().Id);
        }
        public void GetCurrentBuildReturnsBuildState()
        {
            SetupMockConnectionHelper(MockUrl, SetUpExpectedResultXml());
            SetupMockConnectionHelper(ExpectedResult.ApiLink, XDocument.Parse("<build><result>Success</result></build>"));

            _buildRepositoryToTest = new BuildRepository(_mockHelper.Object);


            var buildToTest = _buildRepositoryToTest.GetCurrentBuild(MockUrl);

            Assert.AreEqual(ExpectedResult.State, buildToTest.State);
            Assert.IsFalse(buildToTest.IsBuilding);
        }
        public void GetMonthlyHighlitedBuilds_OnTopFalse_GetLowestScoreBuilds()
        {
            // Arrange
            var mockContext = BuildHighlitedBuildContext();
            var target      = new BuildRepository(mockContext.Object);

            // Act
            var act = target.GetMonthHighlitedBuilds(2014, 1, false, 1, null).Result;

            // Assert
            Assert.AreEqual(1, act.Count());
            Assert.AreEqual(12, act.First().Id);
        }
        public void GetBuildStateShouldIgnoreCase()
        {
            SetupMockConnectionHelper(MockUrl, SetUpExpectedResultXml(String.Format("<lastBuild><number>{0}</number><url>{1}</url></lastBuild>",
                                                                                    ExpectedResult.BuildNumber, ExpectedResult.Link)));

            SetupMockConnectionHelper(ExpectedResult.ApiLink, XDocument.Parse("<build><result>FAILURE</result></build>"));

            _buildRepositoryToTest = new BuildRepository(_mockHelper.Object);

            var buildToTest = _buildRepositoryToTest.GetCurrentBuild(MockUrl);

            Assert.AreNotEqual(Build.BuildState.Unknown, buildToTest.State);
            Assert.AreEqual(Build.BuildState.Failure, buildToTest.State);
        }
        public void GetLastBuild_WithNoBuilds_ReturnsNull()
        {
            // Arrange
            var data = new List <Build>().AsQueryable();

            var mockContext = BuildBuildContext(data);

            var target = new BuildRepository(mockContext.Object);

            /// Act
            var act = target.GetLastBuild();

            // Assert
            Assert.IsNull(act);
        }
示例#30
0
        public async Task <BuildDefinition> CreatePipeline(string name, string projectName, string repositoryName, string filename, string folderPath)
        {
            BuildDefinition definition = new BuildDefinition
            {
                Name        = name,
                Description = $"A pipeline for {name} based on {filename}"
            };

            BuildRepository repository = new BuildRepository
            {
                Name          = repositoryName,
                Type          = "tfsgit",
                DefaultBranch = "master"
            };

            definition.Repository = repository;
            definition.Path       = folderPath;

            var process = new YamlProcess
            {
                YamlFilename = filename
            };

            definition.Process = process;

            definition.Queue = new AgentPoolQueue
            {
                Id = await GetAgentQueueByHeuristic(projectName)
            };

            ContinuousIntegrationTrigger ciTrigger = new ContinuousIntegrationTrigger();

            ciTrigger.SettingsSourceType = 2;
            definition.Triggers.Add(ciTrigger);

            BuildDefinition pipeline = null;

            try
            {
                pipeline = await Build.CreateDefinitionAsync(definition, projectName);
            }
            catch (DefinitionExistsException)
            {
                pipeline = await GetPipeline(projectName, name);
            }

            return(pipeline);
        }
示例#31
0
        protected override void Initialize()
        {
            base.Initialize();

            output = new OutputWindowWrapper(this);

            SettingsManager       settingsManager = new ShellSettingsManager(ServiceProvider.GlobalProvider);
            WritableSettingsStore settingsStore   = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings);

            Settings.Instance = new Settings(settingsStore);

            var factory    = new BuildFactory();
            var repository = new BuildRepository(Settings.Instance.RepositoryPath);

            monitor      = new Monitor(factory, repository);
            dataAdjuster = new DataAdjusterWithLogging(repository, output.WriteLine);

            //if invalid data, adjust it
            dataAdjuster.Adjust();


            // Get solution build manager
            sbm = ServiceProvider.GlobalProvider.GetService(typeof(SVsSolutionBuildManager)) as IVsSolutionBuildManager2;
            if (sbm != null)
            {
                sbm.AdviseUpdateSolutionEvents(this, out updateSolutionEventsCookie);
            }

            // Must hold a reference to the solution events object or the events wont fire, garbage collection related
            events         = GetDTE().Events.SolutionEvents;
            events.Opened += Solution_Opened;
            GetDTE().Events.BuildEvents.OnBuildBegin += Build_Begin;

            output.WriteLine("Build monitor initialized");
            output.WriteLine("Path to persist data: {0}", Settings.Instance.RepositoryPath);

            monitor.SolutionBuildFinished = b =>
            {
                output.Write("[{0}] Time Elapsed: {1} \t\t", b.SessionBuildCount, b.SolutionBuildTime.ToTime());
                output.WriteLine("Session build time: {0}\n", b.SessionMillisecondsElapsed.ToTime());
                output.WriteLine("Rebuild All: {0}\n", b.SolutionBuild.IsRebuildAll);
                //System.Threading.Tasks.Task.Factory.StartNew(() => SaveToDatabase(b));
            };

            monitor.ProjectBuildFinished = b => output.WriteLine(" - {0}\t-- {1} --", b.MillisecondsElapsed.ToTime(), b.ProjectName);
            AnalyseBuildTimesCommand.Initialize(this);
        }
示例#32
0
        private async Task<Task> ProcessBuild(Project project, string buildType, string user)
        {
            var buildRepo = new BuildRepository();
            var ticks = DateTime.Now.Ticks.ToString();
            var build = new Build
            {
                ProjectId = project.Id,
                BuildType = buildType,
                Status = "Pulling source files",
                BuildDateTime = Helper.SetDateForMongo(DateTime.Now),
                BuildFileLog = string.Format("{0}{1}_{2}Build.txt", user, ticks, buildType),
                GitFileLog = string.Format("{0}{1}_{2}GitPull.txt", user, ticks, buildType),
                OutputZipFile = string.Format("{0}{1}_{2}Build.zip", user, ticks, buildType),
            };
            await buildRepo.CreateSync(build);

            return Task.Factory.StartNew(() =>
            {
                var startDateTime = DateTime.Now;
                var baseWorkingDirectory = ConfigurationManager.AppSettings["WorkingDirectory"].ToString();
                var baseOutputDirectory = ConfigurationManager.AppSettings["OutputDirectory"].ToString();

                var workingDirectory = Path.Combine(baseWorkingDirectory, DateTime.Now.Ticks.ToString());
                if (!Directory.Exists(workingDirectory))
                {
                    Directory.CreateDirectory(workingDirectory);
                }

                var outputDirectory = Path.Combine(baseOutputDirectory, string.Format("{0}\\{1}\\{2}", user, project.Id.ToString(), buildType));
                if (!Directory.Exists(outputDirectory))
                {
                    Directory.CreateDirectory(outputDirectory);
                }

                var gitCommand = string.Format("git clone https://{0}:{1}@{2}", project.GitUsername, project.GitPassword, project.GitUrl.Replace("https://", ""));

                ExecuteCommand(gitCommand, workingDirectory, outputDirectory, build.GitFileLog);

                var workingDirectoryInfo = new DirectoryInfo(workingDirectory);
                var projectFolderName = (workingDirectoryInfo.GetDirectories()).FirstOrDefault().ToString();

                if (!string.IsNullOrEmpty(projectFolderName))
                {
                    var projectFolder = Path.Combine(workingDirectory, projectFolderName);
                    var cordovaAddPlatformCommand = string.Format("cordova platform add {0}", buildType);

                    ExecuteCommand(cordovaAddPlatformCommand, projectFolder, outputDirectory, build.BuildFileLog);

                    var cordovaBuildCommand = string.Format("cordova build {0}", buildType);

                    Task.Run(async () =>
                    {
                        var timeDifference = DateTime.Now - startDateTime;
                        buildRepo.UpdateStatus("Building project", build.Id.ToString(), (int)timeDifference.TotalSeconds);
                    });

                    ExecuteCommand(cordovaBuildCommand, projectFolder, outputDirectory, build.BuildFileLog);

                    var buildDirectory = Path.Combine(workingDirectory, projectFolder, string.Format("platforms\\{0}", buildType));
                    var zipFullPath = Path.Combine(outputDirectory, build.OutputZipFile);
                    Task.Run(async () =>
                    {
                        var timeDifference = DateTime.Now - startDateTime;
                        buildRepo.UpdateStatus("Completed", build.Id.ToString(), (int)timeDifference.TotalSeconds);
                    });
                    ZipFile.CreateFromDirectory(buildDirectory, zipFullPath, CompressionLevel.Fastest, true);
                    
                }


            });

        }