19.05.2016

Automatisiertes Deployment einer BI-Solution - Teil 1 SSIS Pakete

Technical Value

In der klassischen Softwareentwicklung gehört es zum guten Ton eine Software über eine Installationsroutine bereitzustellen. Doch was macht man in BI-Projekten? In einem Umfeld, in dem zu einer Lösung verschiedene Projekttypen mit unterschiedlichsten Deploymentanforderungen gehören?

Meine favorisierte Antwort: Man verwendet PowerShell! Diese Miniserie soll zeigen, wie man mit Hilfe von einigen einfachen PowerShell Scripten das komplette Deployment einer BI-Solution automatisieren kann. Die Serie behandelt die folgenden Themen:

Für die vollständige Automatisierung empfiehlt sich zusätzlich ein Tool, welches den Build der einzelnen Solutions übernimmt (z.B. den Einsatz eines Build Servers in Verbindung mit der bevorzugten Versionsverwaltung, oder ein simples Batch-Script). In diesem und allen weiteren Teilen gehe ich davon aus, dass ein Build Mechanismus existiert. Für das SSIS Deployment werden die ispac Dateien benötigt, welche beim Build einer Solution erstellt werden.

SSIS Deployment unter der Lupe

Um SSIS-Solutions bereitzustellen gibt es verschiedene Möglichkeiten. Das Package Deployment, bei welchem die SSIS-Pakete einfach auf das Dateisystem des gewünschten Ziel-Server kopiert werden, und das Project Deployment, bei welchem die SSIS-Pakete im SQL Server gespeichert werden. Seit SSIS 2012 sollte die bevorzugte Methode wohl das Project-Deployment sein, denn nur so können alle neuen Funktionen von SSIS genutzt werden.

Doch wie funktioniert das Project-Deployment? Als Entwickler kann ich mein Projekt direkt aus dem Visual Studio heraus deployen. Rechtsklick und Deploy, das kennt man schon lange. In den wenigsten Fällen ist jedoch der Entwickler auch derjenige, der das Produktions-Deployment durchführt und der Administrator, oder der Betrieb verfügt nicht immer über ein Visual Studio.

Dem Deployment Verantwortlichen kann natürlich eine ispac-Datei zur Verfügung gestellt werden. Mit einem Doppelklick auf die ispac-Datei wird der Deployment-Wizard geöffnet, das Deployment erfolgt analog dem Visual Studio Deployment und ist in wenigen Klicks durchgeführt. Doch was, wenn man mehrere Projekte hat? Mehrere ispacs zur Verfügung stellen und den Verantwortlichen jedes einzelne Projekt manuell deployen lassen? Das erfordert einen sehr geduldigen Ansprechpartner…. Oder man erstellt ein einfaches PowerShell Script, welches das komplette Deployment übernimmt und nur noch gestartet werden muss.

1. Benötigte DLLs und grundlegende Einstellungen

Für das Script werden die beiden DLLs Microsoft.SqlServer.Management.IntegrationServices und System.IO benötigt. Diese können über die folgenden Befehle eingebunden werden:

  1. [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.IntegrationServices")
  2. [void][System.Reflection.Assembly]::LoadWithPartialName("System.IO")

Des Weiteren rate ich dringend dazu jedes Script mit der Option

  1. $ErrorActionPreference = "Stop"

zu versehen. So steigt das Script beim Auftreten des ersten Fehlers aus und versucht nicht die nachfolgenden Schritte noch auszuführen.

2. Parameter definieren

Ich persönlich bin ein großer Freund von Parametrisierungen. Diese ermöglichen, dass ein Script auf verschiedenen Umgebungen eingesetzt werden kann, ohne dass jemand den Code abändern muss. Außerdem lässt es sich so wirklich als “Blackbox” betrachten. Mindestens die folgenden Parameter werden für das SSIS-Deployment benötigt:

  1. Name des Zielservers
  2. Name des SSIS Folders, welches deployed werden soll, bzw. zu welchem das Projekt hinzugefügt werden soll
  3. Pfad zu ein oder mehr ispac Dateien
  1. # declare parameter
  2. param (
  3.   [string]$ssisServerName = $(Read-Host "SSIS Server Name"),
  4.   [string]$ispacPath = $(Read-Host "Ordner mit ISPAC Datei(en)"),
  5.   [string]$ssisFolderName = $(Read-Host "SSIS Folder Name")
  6. )

Über Read-Host können erforderliche Parameter beim Ausführen des Scriptes abgefragt werden. Sollte ein Parameter vergessen werden, wird dieser automatisch vom Script abgefragt, anstatt z.B. mit einem Fehler auszusteigen.

3. Verbindung zum SQL Server aufbauen

Seit SQL Server 2012 gibt es die SQL Server Managed Objects (SMO) Assemblies, welche man in PowerShell verwenden kann. Diese setzen jedoch voraus, dass der SQL Server Provider für Windows PowerShell installiert ist. Daher verwende ich in folgendem Beispiel noch die “altmodische” Methode und verbinde mich mit den “alten” .NET-Klassen gegen den SQL Server. Diese sind in jeder Windows Installation vorhanden.

  1. # connecting to target SSIS Server
  2. Write-Host "Verbindung zu Zielserver wird aufgebaut..."
  3. $ssisNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
  4. $sqlConnectionString = "Data Source=" + $ssisServerName + ";Initial Catalog=master;Integrated Security=SSPI;"
  5. $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
  6. $ssisService = New-Object "$ssisNamespace.IntegrationServices" $sqlConnection
  7. $ssisdb = $ssisService.Catalogs[$ssisDbName]

4. Project Folder anlegen

Sofern das angegebene SSIS Folder noch nicht vorhanden ist, soll es neu angelegt werden. Ist es bereits vorhanden, sollen die Pakete später nur aktualisiert, oder neu hinzugefügt werden. Das bestehende Folder soll nicht überschrieben werden.

  1. # get SSIS Folder, or create a new one if none exists
  2. $ssisFolder = $ssisdb.Folders[$ssisFolderName]
  3. if(!$ssisFolder)
  4. {
  5.   Write-Host "Erstelle Verzeichnis $ssisFolderName..."
  6.   $ssisFolder = New-Object "$ssisNamespace.CatalogFolder" $ssisdb, $ssisFolderName, $ssisFolderName
  7.   $ssisFolder.Create()
  8.   $ssisFolder = $ssisdb.Folders[$ssisFolderName]
  9. }

5. SSIS Projekte deployen

Da das Script auch für das gleichzeitige Deployment mehrerer Projekte dienen soll, werden alle ispac Dateien in dem als Parameter übergebenen Verzeichnis betrachtet. Das Verzeichnis könnte auch rekursiv durchsucht werden, so kann das Deployment mit jeder beliebigen Verzeichnisstruktur erfolgen.

  1. $files = Get-ChildItem $ispacPath -Filter *.ispac
  2. foreach($file in $files)
  3. {
  4.   $ispacName = $file.Name.Split(".")[0]
  5.   $ispacPath = $file.FullName
  6.  
  7.   Write-Host "Deploying Project" $ispacName
  8.   $ssisFolder.DeployProject($ispacName, [System.IO.File]::ReadAllBytes($ispacPath)) | Out-Null
  9.   $ssisProject = $ssisFolder.Projects[$ispacName]
  10. }

Nun wurden alle SSIS-Projekte auf den Server deployed. Doch was, wenn die Pakete über ein Environment gesteuert werden sollen? Das demonstriere ich im nächsten Teil.

Teilen auf

Newsletter Anmeldung

Abonnieren Sie unseren Newsletter!
Lassen Sie sich regelmäßig über alle Neuigkeiten rundum ORAYLIS und die BI- & Big-Data-Branche informieren.

Jetzt anmelden