public AzurePipelines.Job[] ExtractAzurePipelinesJobsV2(JToken jobsJson, string strategyYaml) { GeneralProcessing gp = new GeneralProcessing(_verbose); AzurePipelines.Job[] jobs = new AzurePipelines.Job[jobsJson.Count()]; if (jobsJson != null) { int i = 0; foreach (JToken jobJson in jobsJson) { AzurePipelines.Job job = new AzurePipelines.Job { job = jobJson["job"]?.ToString(), deployment = jobJson["deployment"]?.ToString(), displayName = jobJson["displayName"]?.ToString(), template = jobJson["template"]?.ToString() }; if (jobJson["pool"] != null) { job.pool = gp.ProcessPoolV2(jobJson["pool"].ToString()); } if (jobJson["strategy"] != null) { job.strategy = gp.ProcessStrategyV2(jobJson["strategy"].ToString()); } else if (strategyYaml != null) { job.strategy = gp.ProcessStrategyV2(strategyYaml); } if (jobJson["dependsOn"] != null) { job.dependsOn = gp.ProcessDependsOnV2(jobJson["dependsOn"].ToString()); } if (jobJson["condition"] != null) { job.condition = ConditionsProcessing.TranslateConditions(jobJson["condition"].ToString()); } if (jobJson["environment"] != null) { job.environment = gp.ProcessEnvironmentV2(jobJson["environment"].ToString()); } if (jobJson["timeoutInMinutes"] != null) { int.TryParse(jobJson["timeoutInMinutes"].ToString(), out int timeOut); if (timeOut > 0) { job.timeoutInMinutes = timeOut; } } if (jobJson["continueOnError"] != null) { bool.TryParse(jobJson["continueOnError"].ToString(), out bool continueOnError); job.continueOnError = continueOnError; } if (jobJson["variables"] != null) { VariablesProcessing vp = new VariablesProcessing(_verbose); job.variables = vp.ProcessParametersAndVariablesV2(null, jobJson["variables"].ToString()); } if (jobJson["steps"] != null) { try { job.steps = GenericObjectSerialization.DeserializeYaml <AzurePipelines.Step[]>(jobJson["steps"].ToString()); } catch (Exception ex) { ConversionUtility.WriteLine($"DeserializeYaml<AzurePipelines.Step[]>(jobJson[\"steps\"].ToString() swallowed an exception: " + ex.Message, _verbose); } } jobs[i] = job; i++; } } return(jobs); }
public Dictionary <string, GitHubActions.Job> ProcessStagesV2(JToken stagesJson, string strategyYaml) { AzurePipelines.Job[] jobs = null; List <AzurePipelines.Stage> stages = new List <AzurePipelines.Stage>(); if (stagesJson != null) { //for each stage foreach (JToken stageJson in stagesJson) { AzurePipelines.Stage stage = new AzurePipelines.Stage { stage = stageJson["stage"]?.ToString(), displayName = stageJson["displayName"]?.ToString(), condition = stageJson["condition"]?.ToString() }; if (stageJson["dependsOn"] != null) { GeneralProcessing gp = new GeneralProcessing(_verbose); stage.dependsOn = gp.ProcessDependsOnV2(stageJson["dependsOn"].ToString()); } if (stageJson["variables"] != null) { VariablesProcessing vp = new VariablesProcessing(_verbose); stage.variables = vp.ProcessParametersAndVariablesV2(null, stageJson["variables"].ToString()); } if (stageJson["jobs"] != null) { JobProcessing jp = new JobProcessing(_verbose); stage.jobs = jp.ExtractAzurePipelinesJobsV2(stageJson["jobs"], strategyYaml); } stages.Add(stage); } //process the jobs if (stages != null) { int jobCount = 0; foreach (Stage stage in stages) { if (stage.jobs != null) { jobCount += stage.jobs.Length; } } jobs = new AzurePipelines.Job[jobCount]; //Giant nested loop ahead. Loop through stages, looking for all jobs int jobIndex = 0; foreach (Stage stage in stages) { if (stage.jobs != null) { for (int i = 0; i < stage.jobs.Length; i++) { jobs[jobIndex] = stage.jobs[i]; if (stage.variables != null) { if (jobs[jobIndex].variables == null) { jobs[jobIndex].variables = new Dictionary <string, string>(); } foreach (KeyValuePair <string, string> stageVariable in stage.variables) { //Add the stage variable if it doesn't already exist if (jobs[jobIndex].variables.ContainsKey(stageVariable.Key) == false) { jobs[jobIndex].variables.Add(stageVariable.Key, stageVariable.Value); } } } if (stage.condition != null) { jobs[jobIndex].condition = stage.condition; } //Get the job name string jobName = ConversionUtility.GenerateJobName(stage.jobs[i], jobIndex); //Rename the job, using the stage name as prefix, so that we keep the job names unique jobs[jobIndex].job = stage.stage + "_Stage_" + jobName; jobIndex++; } } } } } //Build the final list of GitHub jobs and return it if (jobs != null) { Dictionary <string, GitHubActions.Job> gitHubJobs = new Dictionary <string, GitHubActions.Job>(); foreach (AzurePipelines.Job job in jobs) { JobProcessing jobProcessing = new JobProcessing(_verbose); gitHubJobs.Add(job.job, jobProcessing.ProcessJob(job, null)); } return(gitHubJobs); } else { return(null); } }