public override async Task ExecuteAsync(OutputContext output, Application application, ServiceEntry service) { if (SkipWithoutProject(output, service, out var project)) { return; } if (SkipWithoutContainerInfo(output, service, out var container)) { return; } var chartDirectory = Path.Combine(application.GetProjectDirectory(project), "charts"); if (Directory.Exists(chartDirectory) && !Force) { throw new CommandException("'charts' directory already exists for project. use '--force' to overwrite."); } else if (Directory.Exists(chartDirectory)) { Directory.Delete(chartDirectory, recursive: true); } var chart = new HelmChartStep(); await HelmChartGenerator.GenerateAsync( output, application, service, project, container, chart, new DirectoryInfo(chartDirectory)); output.WriteInfoLine($"Generated Helm Chart at '{Path.Combine(chartDirectory, chart.ChartName)}'."); }
public static async Task BuildHelmChartAsync(OutputContext output, Application application, ContainerStep container, HelmChartStep chart) { if (output is null) { throw new ArgumentNullException(nameof(output)); } if (application is null) { throw new ArgumentNullException(nameof(application)); } if (container is null) { throw new ArgumentNullException(nameof(container)); } if (chart is null) { throw new ArgumentNullException(nameof(chart)); } output.WriteInfoLine("building helm chart"); var outputDirectoryPath = Path.Combine(application.ProjectDirectory, "bin"); using var tempDirectory = TempDirectory.Create(); HelmChartGenerator.ApplyHelmChartDefaults(application, container, chart); var chartRoot = Path.Combine(application.ProjectDirectory, "charts"); var chartPath = Path.Combine(chartRoot, chart.ChartName); if (Directory.Exists(chartPath)) { output.WriteDebugLine($"found existing chart in '{chartPath}'"); } else { chartRoot = tempDirectory.DirectoryPath; chartPath = Path.Combine(chartRoot, chart.ChartName); output.WriteDebugLine($"generating chart in '{chartPath}"); await HelmChartGenerator.GenerateAsync(output, application, container, chart, new DirectoryInfo(tempDirectory.DirectoryPath)); } output.WriteDebugLine("running helm package"); output.WriteDebugLine($"> helm package -d \"{outputDirectoryPath}\" --version {application.Version.Replace('+', '-')} --app-version {application.Version.Replace('+', '-')}"); var capture = output.Capture(); var exitCode = await Process.ExecuteAsync( "helm", $"package . -d \"{outputDirectoryPath}\" --version {application.Version.Replace('+', '-')} --app-version {application.Version.Replace('+', '-')}", workingDir : chartPath, stdOut : capture.StdOut, stdErr : capture.StdErr); output.WriteDebugLine($"running helm package exit code: {exitCode}"); if (exitCode != 0) { throw new CommandException("helm package failed"); } output.WriteDebugLine("done building helm chart"); }
public static async Task BuildHelmChartAsync(OutputContext output, Application application, ServiceEntry service, Project project, ContainerInfo container, HelmChartStep chart) { if (output is null) { throw new ArgumentNullException(nameof(output)); } if (application is null) { throw new ArgumentNullException(nameof(application)); } if (service is null) { throw new ArgumentNullException(nameof(service)); } if (project is null) { throw new ArgumentNullException(nameof(project)); } if (container is null) { throw new ArgumentNullException(nameof(container)); } if (chart is null) { throw new ArgumentNullException(nameof(chart)); } var projectDirectory = Path.Combine(application.RootDirectory, Path.GetDirectoryName(project.RelativeFilePath) !); var outputDirectoryPath = Path.Combine(projectDirectory, "bin"); using var tempDirectory = TempDirectory.Create(); HelmChartGenerator.ApplyHelmChartDefaults(application, service, container, chart); var chartRoot = Path.Combine(projectDirectory, "charts"); var chartPath = Path.Combine(chartRoot, chart.ChartName); output.WriteDebugLine($"Looking for existing chart in '{chartPath}'."); if (Directory.Exists(chartPath)) { output.WriteDebugLine($"Found existing chart in '{chartPath}'."); } else { chartRoot = tempDirectory.DirectoryPath; chartPath = Path.Combine(chartRoot, chart.ChartName); output.WriteDebugLine($"Generating chart in '{chartPath}'."); await HelmChartGenerator.GenerateAsync(output, application, service, project, container, chart, new DirectoryInfo(tempDirectory.DirectoryPath)); } output.WriteDebugLine("Running 'helm package'."); output.WriteCommandLine("helm", $"package -d \"{outputDirectoryPath}\" --version {project.Version.Replace('+', '-')} --app-version {project.Version.Replace('+', '-')}"); var capture = output.Capture(); var exitCode = await Process.ExecuteAsync( "helm", $"package . -d \"{outputDirectoryPath}\" --version {project.Version.Replace('+', '-')} --app-version {project.Version.Replace('+', '-')}", workingDir : chartPath, stdOut : capture.StdOut, stdErr : capture.StdErr); output.WriteDebugLine($"Running 'helm package' exit code: {exitCode}"); if (exitCode != 0) { throw new CommandException("Running 'helm package' failed."); } output.WriteInfoLine($"Created Helm Chart: {Path.Combine(outputDirectoryPath, chart.ChartName + "-" + project.Version.Replace('+', '-') + ".tgz")}"); }
private static async Task ExecuteAsync(OutputContext output, FileInfo projectFile, List <string> outputs, bool force) { var config = await OpulenceConfigFactory.ReadConfigAsync(output, projectFile.DirectoryName); if (config == null) { // Allow operating without config for now. output.WriteInfoLine("config was not found, using defaults"); config = new OpulenceConfig() { Container = new ContainerConfig() { Registry = new RegistryConfig(), } }; } var application = ApplicationFactory.CreateDefault(config, projectFile); await ProjectReader.InitializeAsync(output, application); await ScriptRunner.RunProjectScriptAsync(output, application); for (var i = 0; i < application.Steps.Count; i++) { var step = application.Steps[i]; if (step is ContainerStep container) { if (!outputs.Contains("container")) { // We should still apply the defaults here because they'll be used by // the helm step. DockerfileGenerator.ApplyContainerDefaults(application, container); output.WriteDebugLine("skipping container"); continue; } output.WriteInfoLine("generating dockerfile"); var dockerFilePath = Path.Combine(application.ProjectDirectory, "Dockerfile"); if (File.Exists(dockerFilePath) && !force) { throw new CommandException("'Dockerfile' already exists for project. use --force to overwrite"); } // force multi-phase dockerfile - this makes much more sense in the workflow // where you're going to maintain the dockerfile yourself. container.UseMultiphaseDockerfile = true; File.Delete(dockerFilePath); await DockerfileGenerator.WriteDockerfileAsync(output, application, container, dockerFilePath); } else if (step is HelmChartStep chart) { if (!outputs.Contains("chart")) { output.WriteDebugLine("skipping helm chart"); continue; } output.WriteInfoLine("generating helm charts"); var chartDirectory = Path.Combine(application.ProjectDirectory, "charts"); if (Directory.Exists(chartDirectory) && !force) { throw new CommandException("'charts' directory already exists for project. use --force to overwrite"); } await HelmChartGenerator.GenerateAsync( output, application, application.Steps.Get <ContainerStep>() !, chart, new DirectoryInfo(chartDirectory)); } } }