Last active
April 21, 2022 18:04
-
-
Save S1r-Lanzelot/e0863b33cca1f8956c028e211b555dd4 to your computer and use it in GitHub Desktop.
Methods for SSIS Project C# Deployment with environment references
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private const string SSIS_AUTO_GENERATED_PARAM_PREFIX = "CM."; | |
private static void DeployIspac(string targetConnectionString, string folderName, string ispacSourcePath) | |
{ | |
using (var targetConn = new SqlConnection(targetConnectionString)) | |
{ | |
IntegrationServices targetIntegrationSvcs = new IntegrationServices(targetConn); | |
Catalog targetCatalog = targetIntegrationSvcs.Catalogs["SSISDB"]; | |
CatalogFolder targetFolder = targetCatalog.Folders.FirstOrDefault(f => f.Name == folderName); | |
if (targetFolder == null) | |
{ | |
Console.ForegroundColor = ConsoleColor.Yellow; | |
Console.WriteLine("Folder did not exist in target server, creating folder."); | |
Console.ResetColor(); | |
targetFolder = new CatalogFolder(targetCatalog, folderName, string.Empty); | |
targetFolder.Create(); | |
} | |
EnvironmentInfo targetEnv = targetFolder.Environments.FirstOrDefault(e => e.Name == ENVIRONMENT_NAME); | |
if (targetEnv == null) | |
{ | |
Console.ForegroundColor = ConsoleColor.Yellow; | |
Console.WriteLine("Environment did not exist in target server, creating environment in destination folder."); | |
Console.ResetColor(); | |
targetEnv = new EnvironmentInfo(targetFolder, ENVIRONMENT_NAME, string.Empty); | |
targetEnv.Create(); | |
} | |
Console.WriteLine("Deploying projects."); | |
var projectIspacList = Directory.GetFiles(ispacSourcePath, "*.ispac"); | |
foreach (var projectIspac in projectIspacList) | |
{ | |
string projectName = Path.GetFileNameWithoutExtension(projectIspac); | |
Console.WriteLine($"Deploying {projectName}."); | |
byte[] projectFile = File.ReadAllBytes(projectIspac); | |
var op = targetFolder.DeployProject(projectName, projectFile); | |
targetFolder.Alter(); | |
ProjectInfo targetProj; | |
try | |
{ | |
//creating new integrations services to pull back recently deployed project as refreshing at services/catalog/and or folder level only pulls back refreshed properties. | |
targetProj = new IntegrationServices(targetConn).Catalogs["SSISDB"].Folders[folderName].Projects | |
.First(p => p.Name == projectName); | |
} | |
catch | |
{ | |
Console.ForegroundColor = ConsoleColor.Red; | |
Console.Error.WriteLine($"Deployment of {projectName} to taget server failed, project could not be found."); | |
Console.ResetColor(); | |
return; | |
} | |
Console.ForegroundColor = ConsoleColor.Yellow; | |
bool didAddEnvParam = false; | |
foreach (var param in targetProj.Parameters) | |
{ | |
if (param.Required && !param.Name.StartsWith(SSIS_AUTO_GENERATED_PARAM_PREFIX) && targetEnv.Variables[param.Name] == null) | |
{ | |
didAddEnvParam = true; | |
AddEnvVariable(param, targetEnv, projectName); | |
} | |
} | |
foreach (var package in targetProj.Packages) | |
{ | |
foreach (var param in package.Parameters) | |
{ | |
if (param.Required && !param.Name.StartsWith(SSIS_AUTO_GENERATED_PARAM_PREFIX) && targetEnv.Variables[param.Name] == null) | |
{ | |
didAddEnvParam = true; | |
AddEnvVariable(param, targetEnv, projectName); | |
} | |
} | |
} | |
if (didAddEnvParam) | |
targetEnv.Alter(); | |
Console.ResetColor(); | |
//must add all params before refrencing | |
if(!targetProj.References.Any(r => r.Name.Equals(ENVIRONMENT_NAME, StringComparison.OrdinalIgnoreCase))) | |
targetProj.References.Add(ENVIRONMENT_NAME); | |
foreach (var param in targetProj.Parameters) | |
{ | |
if (param.Required && !param.Name.StartsWith(SSIS_AUTO_GENERATED_PARAM_PREFIX) && targetEnv.Variables[param.Name] != null) | |
param.Set(ParameterInfo.ParameterValueType.Referenced, param.Name); | |
} | |
foreach (var package in targetProj.Packages) | |
{ | |
foreach (var param in package.Parameters) | |
{ | |
if (param.Required && !param.Name.StartsWith(SSIS_AUTO_GENERATED_PARAM_PREFIX) && targetEnv.Variables[param.Name] != null) | |
param.Set(ParameterInfo.ParameterValueType.Referenced, param.Name); | |
} | |
package.Alter(); | |
} | |
targetProj.Alter(); | |
} | |
} | |
} | |
private static void AddEnvVariable(ParameterInfo param, EnvironmentInfo targetEnv, string projectName) | |
{ | |
Type paramType = Type.GetType($"System.{param.DataType}"); | |
object defaultValue = paramType.IsValueType ? Activator.CreateInstance(paramType) : string.Empty; | |
targetEnv.Variables.Add(param.Name, param.DataType, defaultValue, param.Sensitive, param.Description); | |
Console.Error.WriteLine($"Parameter [{param.Name}] not found for {projectName}. Creating parameter however the value must be manually set in the given environment."); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment