private async Task ProcessEnvironmentDeployment(EnvironmentDeployment deployment, bool suppressMessages, IUiLogger uiLogger) { uiLogger.WriteLine("Starting deployment!"); var failedProjects = new Dictionary <ProjectDeployment, TaskDetails>(); var taskRegister = new Dictionary <string, TaskDetails>(); var projectRegister = new Dictionary <string, ProjectDeployment>(); foreach (var project in deployment.ProjectDeployments) { Release result; if (string.IsNullOrEmpty(project.ReleaseId)) { uiLogger.WriteLine("Creating a release for project " + project.ProjectName + "... "); result = await helper.CreateRelease(project, deployment.FallbackToDefaultChannel); } else { uiLogger.WriteLine("Fetching existing release for project " + project.ProjectName + "... "); result = await helper.GetRelease(project.ReleaseId); } uiLogger.WriteLine("Creating deployment task for " + result.Version + " to " + deployment.EnvironmentName); var deployResult = await helper.CreateDeploymentTask(project, deployment.EnvironmentId, result.Id); uiLogger.WriteLine("Created"); var taskDeets = await helper.GetTaskDetails(deployResult.TaskId); //taskDeets = await StartDeployment(uiLogger, taskDeets, !deployment.DeployAsync); if (deployment.DeployAsync) { taskRegister.Add(taskDeets.TaskId, taskDeets); projectRegister.Add(taskDeets.TaskId, project); } else { if (taskDeets.State == Models.TaskStatus.Failed) { uiLogger.WriteLine("Failed deploying " + project.ProjectName); failedProjects.Add(project, taskDeets); } uiLogger.WriteLine("Deployed!"); uiLogger.WriteLine("Full Log: " + System.Environment.NewLine + await this.helper.GetTaskRawLog(taskDeets.TaskId)); taskDeets = await helper.GetTaskDetails(deployResult.TaskId); } } // This needs serious improvement. if (deployment.DeployAsync) { await DeployAsync(uiLogger, failedProjects, taskRegister, projectRegister); } uiLogger.WriteLine("Done deploying!"); if (failedProjects.Any()) { uiLogger.WriteLine("Some projects didn't deploy successfully: "); foreach (var failure in failedProjects) { var link = string.Empty; if (failure.Value.Links != null) { if (failure.Value.Links.ContainsKey("Web")) { link = configuration.OctopusUrl + failure.Value.Links["Web"]; } } uiLogger.WriteLine(failure.Key.ProjectName + ": " + link); } } if (!suppressMessages) { uiLogger.WriteLine("Done deploying!" + (failedProjects.Any() ? " There were failures though. Check the log." : string.Empty)); } }