Exemple #1
0
        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));
            }
        }