// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Xml; using EpicGames.Core; using UnrealBuildBase; namespace AutomationTool.Tasks { /// /// Parameters for a Helm task /// public class HelmTaskParameters { /// /// Helm command line arguments /// [TaskParameter] public string Chart { get; set; } /// /// Name of the release /// [TaskParameter] public string Deployment { get; set; } /// /// The Kubernetes namespace /// [TaskParameter(Optional = true)] public string Namespace { get; set; } /// /// The kubectl context /// [TaskParameter(Optional = true)] public string KubeContext { get; set; } /// /// The kubectl config file to use /// [TaskParameter(Optional = true)] public string KubeConfig { get; set; } /// /// Values to set for running the chart /// [TaskParameter(Optional = true)] public string Values { get; set; } /// /// Values to set for running the chart /// [TaskParameter(Optional = true)] public string ValuesFile { get; set; } /// /// Environment variables to set /// [TaskParameter(Optional = true)] public string Environment { get; set; } /// /// File to parse environment variables from /// [TaskParameter(Optional = true)] public string EnvironmentFile { get; set; } /// /// Additional arguments /// [TaskParameter(Optional = true)] public string Arguments { get; set; } /// /// Base directory for running the command /// [TaskParameter(Optional = true)] public string WorkingDir { get; set; } } /// /// Spawns Helm and waits for it to complete. /// [TaskElement("Helm", typeof(HelmTaskParameters))] public class HelmTask : SpawnTaskBase { readonly HelmTaskParameters _parameters; /// /// Construct a Helm task /// /// Parameters for the task public HelmTask(HelmTaskParameters parameters) { _parameters = parameters; } /// /// ExecuteAsync the task. /// /// Information about the current job /// Set of build products produced by this node. /// Mapping from tag names to the set of files they include public override async Task ExecuteAsync(JobContext job, HashSet buildProducts, Dictionary> tagNameToFileSet) { // Build the argument list List arguments = new List(); arguments.Add("upgrade"); arguments.Add(_parameters.Deployment); arguments.Add(new FileReference(_parameters.Chart).FullName); arguments.Add("--install"); arguments.Add("--reset-values"); if (_parameters.Namespace != null) { arguments.Add("--namespace"); arguments.Add(_parameters.Namespace); } if (_parameters.KubeContext != null) { arguments.Add("--kube-context"); arguments.Add(_parameters.KubeContext); } if (_parameters.KubeConfig != null) { arguments.Add("--kubeconfig"); arguments.Add(_parameters.KubeConfig); } if (!String.IsNullOrEmpty(_parameters.Values)) { foreach (string value in SplitDelimitedList(_parameters.Values)) { arguments.Add("--set"); arguments.Add(value); } } if (!String.IsNullOrEmpty(_parameters.ValuesFile)) { foreach (FileReference valuesFile in ResolveFilespec(Unreal.RootDirectory, _parameters.ValuesFile, tagNameToFileSet)) { arguments.Add("--values"); arguments.Add(valuesFile.FullName); } } string additionalArguments = String.IsNullOrEmpty(_parameters.Arguments) ? String.Empty : $" {_parameters.Arguments}"; await SpawnTaskBase.ExecuteAsync("helm", CommandLineArguments.Join(arguments) + additionalArguments, workingDir: _parameters.WorkingDir, envVars: ParseEnvVars(_parameters.Environment, _parameters.EnvironmentFile)); } /// /// Output this task out to an XML writer. /// public override void Write(XmlWriter writer) { Write(writer, _parameters); } /// /// Find all the tags which are used as inputs to this task /// /// The tag names which are read by this task public override IEnumerable FindConsumedTagNames() { yield break; } /// /// Find all the tags which are modified by this task /// /// The tag names which are modified by this task public override IEnumerable FindProducedTagNames() { yield break; } } }