Skip to content

Instantly share code, notes, and snippets.

@S1r-Lanzelot
Last active April 21, 2022 18:04
Show Gist options
  • Save S1r-Lanzelot/e0863b33cca1f8956c028e211b555dd4 to your computer and use it in GitHub Desktop.
Save S1r-Lanzelot/e0863b33cca1f8956c028e211b555dd4 to your computer and use it in GitHub Desktop.
Methods for SSIS Project C# Deployment with environment references
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