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); } }); }