BizTalk Deployment-Automatisierung mit Powershell
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.