In-place build script

V nedávných příspěvcích (zde a zde) jsem prezentoval PowerShellový modul zjednodušující některé administrační úkony ohledně Dynamics AX. Slíbil jsem také ukázat jeho využití v buildech s i bez Team Foundation Serveru.

Využití TFS Buildu má své výhody – třeba pro logování a oznamování výsledků, automatické vytváření pracovních položek při selhání buildu a podobně. Bez TFS si musíme vše potřebné implementovat sami – ale reálně TFS používá jen menšina firem, takže nějaké TFS-free řešení je často nezbytné.

Tento článek pojednává o jednom takovém skriptu – chci zejména předvést, jak snadno lze v PowerShellu vytvořit infrastrukturu pro logování průběhu buildu a odesílání výsledků.

Funkce

Skript jsem vyvinul a reálně používám pro aktualizace vývojových prostředí, ne pro plnohodnotné buildy. Dokáže zkompilovat AX aplikaci, aktualizovat křížové reference, restartovat AOS apod. Průběh buildu se loguje do souboru a pokud je to nastaveno, výsledky včetně logu jsou odeslány e-mailem.

Obsah logu vypadá například takto:

Dynamics AX 2012 Automated Build
Run by: mdrab
AX config: X:\AxConfig\DEV.axc
==========
[19:20:24] Started
[19:20:24] Restarting AOS
[19:22:56] AOS restarted
[19:22:56] Compiling application
[22:22:48] Application compiled
X++ compilation errors: 4
[22:22:48] Compiling IL
[22:37:07] IL compiled
[22:37:07] Synchronizing database
[22:47:20] Database synchronized
[22:47:20] Finished

Takto vypadá e-mail o úspěšném buildu (to v tomto skriptu znamená, že proběhly všechny kroky, ne nutně bez kompilačních chyb). Všimněte si přiloženého logu a výsledků kompilace.

Pokud build selže, obsahuje e-mail text výjimky a popis místa, kde k chybě došlo:

Download

Script je umístěn ve stejném CodePlexovém projektu jako DynamicsAxCommunity modul, konkrétně zde.

Předpoklady

Skript vyžaduje modul DynamicsAxCommunity – ten musí být nainstalován buďto v nějakém PowerShellovém profilu, nebo případně přímo ve skriptu. Předpokládá také, že je spuštěn na stejném počítači jako AOS.

Další požadavky závisí na prováděných akcích. Jde například o přístup do Dynamics AX (na to nezapomeňte zejména když vytváříte plánovanou úlohu běžící pod jiným uživatelem).

Popis skriptu

Skript vyžaduje jediný parametr – cestu ke klientské konfiguraci Dynamics AX:

param
(
	[Parameter(Mandatory=$true)]
	[string]$axConfigFile
)

Skript je rozdělen do regionů, které názorně ukazují jeho strukturu:

In-place build script structure

V regionu Process definition můžete určit, které kroky se budou provádět:

$restartAos = $true
$runCompilation = $true
$runCompilationToIL = $true
$runSynchronization = $true
$runXref = $true

a jak dlouho se má čekat na jejich dokončení:

$compilationTimeout = (New-TimeSpan -Hours 4).TotalSeconds
$ilCompilationTimeout = (New-TimeSpan -Minutes 30).TotalSeconds
$synchronizationTimeout = (New-TimeSpan -Minutes 30).TotalSeconds
$xrefTimeout = (New-TimeSpan -Hours 6).TotalSeconds
$xrefIndexTimeout = (New-TimeSpan -Minutes 30).TotalSeconds

V regionu E-mail parameters určujete, zda se má odeslat e-mail s výsledky, SMTP server atd.

Ve Variables se inicializuje několik proměnných, například $logFileName.

Functions obsahuje dvě funkce – LogMessage zapisující zprávu do logovacího souboru a SendEmail odesílající e-mail s výsledky.

Region Error handling využívá příkaz trap k zachycení a zalogování výjimek.

V Initialization se provádí trocha špinavé práce – validace vstupu a inicializace logovacího souboru.

Region Process provádí vlastní build. Vždy se kontroluje, zda se má patřičný krok provést, loguje se start a konec a volá se funkce z modulu DynamicsAxCommunity. Viz například synchronizaci databáze:

if ($runSynchronization)
{
	LogMessage "Synchronizing database" -AppendTime
	Synchronize-AXDatabase -LogPath $logdir -Timeout $synchronizationTimeout
	LogMessage "Database synchronized" -AppendTime
}

Nakonec region Send status e-mail odešle e-mail, pokud všechno proběhlo úspěšně.

Automatické spuštění

Pro automatické spouštění se výborně hodí plánovač úloh ve Windows – podporuje odložený start, periodické spouštění a případně i další aktivační události.

V plánovači úloh vytvořte novou úlohu a jako akci zvolte spuštění programu. V poli Program/script uveďte powershell.exe a do Add arguments zadejte -NonInteractive -File “cesta ke skriptu.ps1” “cesta ke konfiguraci.axc”. Nezapomeňte na Předpoklady.

Závěr

Tento skript není bůhvíjak univerzální – dělal jsem ho pro podmínky na mém projektu a velmi pravděpodobně vám nebude přesně vyhovovat. Ale jeho architekturu považuji za dostatečně jednoduchou i užitečnou zároveň – a je na vás, abyste si ho uzpůsobili po svém.

V tuto chvíli většina partnerů spravuje prostředí ručně, což má za následek neustálé potíže se špatně zkompilovanými aplikacemi, pozdě odhalenými chybami, zastaralými křížovými referencemi a tak dále. Automatizace je efektivním řešením těchto potíží – byla by chyba ji nevyužít.