BizTalk Deployment-Automatisierung mit Powershell

Einer unserer Kunden, der mehrere BizTalk Server mit verschiedenen Konfigurationen im Einsatz hat, wollte eine Deployment-Automatisierung dieser Server. Die Ziele: Zeit sparen, die Fehleranfälligkeit durch manuelle Konfiguration senken, den sogenannten Bus-Faktor (https://de.wikipedia.org/wiki/Truck_Number) senken und im Fehlerfall „Rollbacks“ ermöglichen.

Dafür sollte nur auf PowerShell sowie die mitgelieferten Tools und Bibliotheken zurückgegriffen werden. Sprich: Um die Abhängigkeiten niedrig zu halten, waren Tools oder Bibliotheken Dritter von vornherein ausgeschlossen.

Bevor ich auf die von uns gewählte Lösung eingehe, hier noch eine kleine Einschränkung: Aus Gründen der Einfachheit wird jedes Mal ein Full-Deployment gemacht, d.h. alles wird immer komplett entfernt und dann wieder neu hinzugefügt. Uns ist bewusst, dass er gerade den Zeitfaktor des Deployments nach oben treibt, jedoch aber verhindert, dass zuvor ungetestete Kombinationen, die durch manuelle Änderungen ins System gelangt sind, ausgerollt werden.

Für unsere Lösung haben wir folgenden Tools und Bibliotheken benutzt:

  • PowerShell 5.0 (x86 / x64)
  • WMI
  • BizTalkfactory.PowerShell.Extensions
  • System.EnterpriseServices.Internal.Publish
  • Microsoft.BizTalk.ExplorerOM
  • Btstask

Für die Konfiguration unseres Deployments gibt es eine simple XML-Konfigurationsdatei.

Mittels „@@[Key]@@“ werden später Werte eingesetzt, die aus einem Key-Value-Store kommen und die für jeden Rechner anders sind. Dadurch kann jeder Server individuell konfiguriert werden, ohne das sich die Grundstruktur des Deployments unterscheidet.

<DeployConfig>

<Host Name=“AutoDeployTestBizTalkServerApplication“ HostType=“InProcess“

NtGroupName=“@@Host_BizTalkServerPrc_GroupName@@“ Delete=“false“>

<Property Name=“IsDefault“ Value=“false“ />

<Property Name=“IsHost32BitOnly“ Value=“false“ />

<Property Name=“HostTracking“ Value=“false“ />

<Property Name=“AuthTrusted“ Value=“false“ />

<Property Name=“GlobalMemoryThreshold“ Value=“0″ />

<Property Name=“ProcessMemoryThreshold“ Value=“50″ />

<HostInstance ServerName=“@@Host_BizTalkServerPrc_HostInstance_ServerName@@“ Logon=“@@Host_BizTalkServerPrc_HostInstance_Username@@“ Password=“@@Host_BizTalkServerPrc_HostInstance_Password@@“ Delete=“false“ Start=“false“ >

<Property Name=“IsDisabled“ Value=“false“/>

</HostInstance>

</Host>

 

<BizTalkApplication Name=“TFS-Deploy-Test“ Description=“TFS-Deploy-Test“ Delete=“true“>

<Resource Path=“TFS-Deploy-Test.dll“ />

<Binding Path=“TFS-Deploy-Test.BindingInfo.xml“>

<Replacement

NodeXPath=“//SendPort[@Name = ‚SP_Output‘]/PrimaryTransport/Address“

ValuePattern=“^.*$“

ValueReplacement=“@@BizTalkApplication_SendPortAddress@@“ />

<Replacement

NodeXPath=“//ReceiveLocation[@Name = ‚RPL_Input‘]/Address“

ValuePattern=“^.*$“

ValueReplacement=“@@BizTalkApplication_ReceivePortAddress@@“ />

</Binding>

</BizTalkApplication>
</DeployConfig>

Ablauf des Deployment-Skripts

X86 PowerShell starten da die BizTalkFactory.Powershell.Extensions leider nicht für x64 zur Verfügung stehen
BizTalkFactory.PowerShell.Extensions.dll installieren
.“$env:windir\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe“ „$env:BTSINSTALLPATH\SDK\Utilities\PowerShell\BizTalkFactory.PowerShell.Extensions.dll“
Konfigurations-Datei einlesen und die Wertersetzungen vornehmen
Alle in der Konfigurations-Datei gelisteten BizTalk Applikationen, sofern die bereits bestehen, entfernen

Alle noch laufenden Service Instanzen stoppen

Mittels “BizTalk:\Health and Activity\Service Instances” alle noch laufenden Instanzen zu der Applikation finden
“Terminate-ServiceInstance” auf diese Instanze aufrufen

Alle noch nicht „unenlisted“ Orchestrierungen unenlisten

Mittels “Biztalk:\Applications\$ApplicationName\Orchestrations\” alle noch nicht „unenlisted“ Orchestrations zu der Applikation finden
“ Unenlist-Orchestration” auf diese Orchestrations aufrufen

Alle noch nicht „unenlisted“ SendPorts unenlisten

Mittels “Biztalk:\Applications\$ApplicationName\Send Ports\” alle noch nicht „unenlisted“ SendPorts zu der Applikation finden
“ Unenlist- SendPort” auf diese SendPorts aufrufen

Die Applikation entfernen

Mittels BTSTask die Applikation entfernen da BizTalkFactory.PowerShell.Extensions leider kein equivalent anbietet
„btstask RemoveApp“

GAC bereinigen

Assemblies aus dem GAC entfernen
„System.EnterpriseServices.Internal.Publish.GacRemove(…)“

Alle in der Konfigurations-Datei gelisteten BizTalk Hosts sofern die bereits bestehen diese entfernen

Alle Adapterhandler entfernen

“DeleteAdapterHandler” aufrufen für jeden gelisteten Adapter der Hostinstan

Alle Hostinstanzen entfernen

“DeleteHostInstance” aufrufen für jede gelistete Instanz des Hosts

Alle Hosts entfernen

“DeleteHost” aufrufen für jeden gelisteten Host

Alle in der Konfigurations-Datei gelisteten BizTalk Hosts wieder hinzufügen

Host hinzufügen

Mit Hilfe des Microsoft.BizTalk.ExplorerOM eine neue Instance von „root/MicrosoftBizTalkServer:MSBTS_HostSetting“ anlegen und hinzufügen
Eine neue Instanz von „root/MicrosoftBizTalkServer:MSBTS_ServerHost“ anlegen und hinzufügen sofern sie noch nicht existiert, bzw. nicht „IsMapped=‘True‘“ ist

Hostinstanz hinzufügen

Eine neue Instanz von „root/MicrosoftBizTalkServer:MSBTS_HostInstance“ anlegen
Die Install-Methode auf diese Instanz aufrufen um die Instanz unter einen anderen Nutzer laufen zulassen
Die zugehörige Instanz von „root/MicrosoftBizTalkServer: MSBTS_HostInstanceSetting“ mittels WMI-Query holen und alle Einstellungen der Hostinstanz setzen
Die Hostinstanz starten
„Start-HostInstance“

Adapterhandler hinzufügen

Den Adapternamen nach folgendem Schema bestimmen “$($adapter.Type) $($adapter.Direction) Handler ($($hostItem.Name))“
Neue Instanz unter “BizTalk:\Platform Settings\Adapters\$($adapter.Type)” anlegen
“New-Item”
Die Individuelleneinstellungen des Adapters setzen
„Set-ItemProperty”

Alle in der Konfigurations-Datei gelisteten BizTalk Applikationen wieder hinzufügen

BizTalk Applikation hinzufügen

Mittels BTSTask die Applikation hinzufügen da BizTalkFactory.PowerShell.Extensions leider kein equivalent anbietet „btstask AddApp“

Gegebenenfalls die benötigten Ressourcen hinzufügen

Die Ressource zur BizTalk Applikation hinzufügen
“Add-ApplicationResource”
Nicht vergessen die Assembly auch zum GAC hinzuzufügen „System.EnterpriseServices.Internal.Publish.GacInstall(…)“

Gegebenenfalls die benötigten Applikationsreferenzen hinzufügen

Die Referenz zur BizTalk Applikation hinzufügen
“Add-ApplicationReference”

Binding importieren

Da das Binding auf jeden Rechner etwas anders sein soll führen wir die in der Konfigurations-Datei definierten Ersetzungen durch
Die Bindings zur BizTalk Applikation einbinden
“Import-Bindings”

BizTalk Applikation starten
„Start-Application”

Sofern keine Fehler aufgetreten sind und auch „$error“ leer ist sollte die neue Version ihrer BizTalk Platformsettings und Applikationen da sein und laufen

Nachwort

Unsere letztendliche Lösung war noch etwas umfassender, da der Kunde auch noch QUIBIF von uns eingesetzte, was wiederum bedeutete das noch ein paar Handgriffe mehr nötig waren wie z.B. QUIBIF sowie IIS konfigurieren oder auch DacPacs einspielen.
Für die Zukunft ist angedacht auch ein inkrementelles Deployment zu ermöglichen, aber mit dem ersten Schritt war unser Kunde schon sehr zufrieden.

Wenn Sie Interesse habe ihre BizTalk Anwendungen ebenfalls automatisiert zu deployen, sprechen sie uns gerne an, wir helfen ihnen.