čtvrtek 3. září 2009

Nasazování úprav pomocí PowerShellu

Nejdřív bleskově pár slov o PowerShellu. PowerShell je (relativně) nový shell, tedy příkazová řádka pro Windows. Je objektový, je postaven na .NET a dobře si rozumí s mnoha komponentami Windows. Je součástí nových Windows (7, 2K8R2) a do starších lze doinstalovat. Vyskytuje se ve dvou hlavních verzích (1 a 2), které se pochopitelně liší funkcionalitou. Detailnější popis není předmětem tohoto postu, zájemcům doporučuji několik odkazů níže. Při nasazování úprav je potřeba udělat spoustu kroků - zastavit AOS, překopírovat vrstvy, labely, spustit AOS… Přímo si to říká o nějakou automatizaci. A PowerShell je pro tento úkol velmi vhodný nástroj. Připravil jsem jeden skript, který ukazuje některé možnosti PowerShellu využitelné pro nasazování úprav v AX. Jde o PowerShell 1.0 a AX2009. Pro AX4 by neměly být třeba žádné změny, u AX3 je situace složitější - například v tom, že AOS v AX3 nemá podobu Windows služby. Nápad volat business connector přímo z PowerShell skriptu jsem si vypůjčil odtud. Věřím, že komentáře v kódu jsou dostačující pro pochopení záměru:
#deklarace proměnných
$aosServiceName = "AOS50`$01"
$axPath = "C:\Program Files\Microsoft Dynamics AX\50"
$axApplPath = "$axPath\Application\Appl\DAX5"

#logování výstupu skriptu do souboru v aktuálním adresáři
$scriptLogName = Get-Date -f "dd-MM-yyyy"
Start-Transcript "$scriptLogName.log" -append -force

#start AOS (pokud neběží)
Start-Service $aosServiceName

#zalogování do AX pomocí business connectoru
[reflection.Assembly]::Loadfile("$axPath\Client\Bin\Microsoft.Dynamics.BusinessConnectorNet.dll")
$ax = New-Object Microsoft.Dynamics.BusinessConnectorNet.Axapta
$ax.logon("","","","")

#výpis počtu sessions (jen pro ukázku)
Write-Host "Sessions:" $ax.CallStaticClassMethod("xSession", "numSession")

#nalezení logovacího souboru kompilace (bude třeba později)
$logFile = Join-Path $ax.CallStaticClassMethod("xInfo", "AOTLogDirectory") "AxCompileAll.html"

#odhlášení z AX
$ax.logoff()

#zastavení AOS, zkopírování souborů, smazání indexů a opětovné spuštění AOS
Stop-Service $aosServiceName
copy "somewhere\*.aod" $axApplPath  #kopírování vrstev
copy "somewhere\*.ald" $axApplPath  #kopírování popisků
rm "$axApplPath\*.ali"              #smazání indexů popisků
rm "$axApplPath\axapd.aoi"          #smazání aplikačního indexu
Start-Service $aosServiceName

#kompilace aplikace
$proc = New-Object System.Diagnostics.Process
$proc.StartInfo.FileName = "$axPath\Client\Bin\Ax32.exe"
$proc.StartInfo.Arguments = "-startupCmd=compileall"
$proc.Start()
$proc.WaitForExit()

#otevření logu kompilace v prohlížeči
Invoke-Item $logFile
Po smazání aplikačního indexu (.aoi) se AOS spouští velmi dlouho, protože vytváří nový index. Kompilaci jsem chtěl původně řešit jako volání:
$ax.CallStaticClassMethod("SysCompileAll","compile")
ale ukázalo se to jako dost nešťastný nápad. Kompilace proběhla, ale ne příliš úspěšně. AX například hlásila chybějící inicializace globálních proměnných (např. infolog), což mě sice pobavilo, nicméně jsem chtěl prostředí ještě někdy používat a musel jsem ho znovu zkompilovat, tentokrát klasicky přes klienta. Ačkoli PowerShell není můj denní chleba a mé příležitostné psaní skriptů zahrnuje jistou dávku objevování, obětovaný čas se rychle vrátí. Navíc člověk dříve nebo později udělá chybu (a třeba smaže jiný soubor než zamýšlel), odladěný skript chyby nedělá. Nicméně skript je program jako každý jiný, je ho tedy třeba otestovat atd. Odkazy: PowerShell homepage PowerShell downloads (na PowerShell blogu) Windows PowerShell 1.0 Documentation Pack Scripting with Windows PowerShell (TechNet) Pokud PowerShell neznáte a chystáte se ho používat, rozhodně se podívejte po vhodném IDE, třeba: PowerGUI PowerShell Analyzer