Vi i DIPS ASA ønsker å legge til rette for enkel deployment av programvaren vår på kundenes maskinvare. La oss ta en titt hva vi gjør for å komme i mål med dette med PowerShell, NuGet og Chocolatey.

Jeg heter Bjørn-Petter Johannessen og er i dag medisinstudent. På grunn av teknisk bakgrunn fra Helse Nord IKT har jeg sett på og forbedret installasjonsprosessen av DIPS sin programvare.

Fra MSI til skriptbar installasjon

Tradisjonelt er DIPS Classic en monolitisk applikasjon som blir publisert til kunden vha. MSI. Dette fungerer bra når man har én, eller i alle fall ganske få, MSI-pakker som systemet består av.

DIPS Arena er en plugin-basert applikasjon. Arena kan kjøre med få eller mange moduler installert avhengig av kundens behov. Siden antallet MSI-er da økte betraktelig, trengte vi en bedre måte å publisere programvaren på.

Løsningen ble en skriptbar installasjon basert på Chocolatey. Fordelen med dette er en enklere og plug-in-basert installasjon. Kunden kjører ett PowerShell-skript som starter installasjonen av det vi har pakket. Dette skriptet kan modifiseres av kunden dersom det er noen spesielle behov. Vi har lagt til rette for å kunne legge inn kode som kjøres før og etter vårt installasjonsskript. Det er også mulig å skrive om PowerShell-skriptet, eller lage sin egen måte å installere DIPS på.

Men, hold an litt.. Hva er PowerShell, NuGet og Chocolatey?

PowerShell

PowerShell ble lansert i 2006 som standard Shell på Windows Server, og er ment for å automatisere administrative oppgaver i Windows. Vi har brukt PowerShell for å kalle choco install, parse output fra Chocolatey og til å behandle konfigurasjonen for DIPS-pakkene.

NuGet

NuGet er pakkebehandleren Microsoft pusher for .NET som brukes til å installere kodebiblioteker og -avhengigeter. Ruby har gems, Python har pip, JavaScript har nmp og .NET har NuGet. I oppførsel kan en NuGet pakke sees på som en ZIP-pakke med litt meta-data, som id, versjonsnummer, tittel, osv.

Pakkebehandleren (nuget.exe), pakkeformatet(*.nuspec filer), NuGet pakker(*.nupkg filer) og den offisielle nettsiden hvor du kan laste ned pakker(nuget.org) heter så å si det samme. Videre vil vi i hovedsak referere til NuGet pakker når vi nevner NuGet.

NuGet

Chocolatey

Chocolatey er en installasjonsmekansime som benytter NuGet-formatet for å distribuere og installere pakker. En Chocolatey-pakke er tilsynelatende lik en vanlig NuGet-pakke, med unntak av en ting: En Chocolatey pakke har en skript kalt ChocolateyInstall.ps1 pakket med som beskriver hvordan pakken skal installeres. Chocolatey kan benytte en Packages.config fil som inneholder pakkene man ønsker å installere. En Chocolatey-pakke kan også ta mot parametere, som vi har samlet i en egen parameters.config fil. Konfigurasjonsparametrene blir lagt inn i DIPS sin konfigurasjon ved hjelp av en PowerShell-funksjon vi har laget og pakket med pakkene.

Installasjon

Chocolatey som verktøy benytter seg av en pakkebrønn (eller webserver som tilbyr pakker om man vil) for å hente ned pakker. Siden vi idag ikke har en slik tjener som alle sykehusene når, har vi valgt å lage en “offline” installatør som benytter ferdig nedlastede Chocolatey-pakker og et enkelt wrapper-skript som installerer disse. Det hele blir pakket via ZIP og distribuert ut på vår kundeportal.

I svært korte trekk består installasjonsskriptet vårt av:

Function Install-DIPS
{
    Param (
        // Håndtering av parametre
    )
    
    // Håndtering av bl.a. $PackagesConfigFile som inneholder en liste over moduler og versjoner

    // Kode brukeren vil kjøre før installasjonen ($BeforeInstall)

    // Dette er det interessante som skjer:
    $chocoCommand = "choco install $PackagesConfigFile -s $packagesFolder -y -pre --package-parameters $ChocolateyParameters $forceParameter"
    Invoke-Expression $chocoCommand

    // Kode brukeren vil kjøre etter installasjonen ($AfterInstall)
}

Install-DIPS -InstallChocolatey -PackagesConfigFile Packages.config -ParametersFile *-parameters.config -BeforeInstall $beforeInstall -AfterInstall $afterInstall -ForceParameter $forceParameter

Packages.config inneholder en liste over pakkene Chocolatey skal installere. Eksempelvis klienten for DIPS Arena:

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="dips-arena-besttrack-client"     version="x.y.z" />
    <package id="dips-arena-desktop-client"       version="x.y.z" />
    <package id="dips-arena-framework-client"     version="x.y.z" />
    ..

parameters.config inneholder konfigurasjonen som kunden må endre, bl.a. installasjonslokasjon for klienten og serveradresse:

<?xml version="1.0" encoding="utf-8"?>
<parameters>
	<!-- Installation folder -->
    <parameter name="InstallLocation"     value="" /> <!-- The installation location. Example: “C:\DIPS” -->
	<!-- Config parameters -->
    <parameter name="ArenaServerHostName" value="" /> <!-- Hostname of the Arena-Server the client should connect to. Example: “arena-srv-01.domain.no” -->
    ..

I utgangspunktet vil output fra choco install komme uforandret ut. Men siden vi bruker en Packages.config-fil som inneholder alle pakkene Chocolatey skal installere, får vi ut av esken bare følgende output:

Installing the following packages: Packages.config

Ikke så greit å vite hva man egentlig installerer. Vi laget først en funksjon som parset innholdet i Packages.config og ga bedre output:

Packages to be installed:
 dips-arena-besttrack-client - x.y.z
 dips-arena-desktop-client - x.y.z
 dips-arena-framework-client - x.y.z
 ...

Deretter lagde vi en issue hos Chocolatey på dette. Siden Chocolatey er åpen kildekode, skrev Andreas Mosti C#-koden som løste issuen. Dette er med i Chocolatey versjon 0.10.0.

Hvordan kan kundene rulle ut programvare?

Vi har lagt til rette for å bruke vår installasjon på både servere og klienter. Kundene står fritt til å installere vår programvare slik de selv vil. Spesielt på klientsiden finnes det mange alternativer, bl.a. Microsoft System Center Configuration Manager og Altiris. Klienten kan enkelt rulles ut med disse verktøyene uten å bruke vårt installasjonsskript.

Skriptene er laget slik at kundene selv kan modifisere dem etter deres behov. Vi tar også mer enn gjerne imot tilbakemeldinger fra våre kunder.

Vårt installasjonsskript i fremtiden

I skrivende stund er det funksjonalitet vi savner i Chocolatey. Allerede installerte pakker kan reinstalleres med å legge på -force-parameteret, men man kan ikke velge hvilke pakker man ønsker å reinstallere. I tillegg er all output direkte fra Chocolatey, og vi gjør ingen parsing av denne. Vi ønsker å få plass en bedre håndtering av advarsler og feilmeldinger slik at det blir lettere å feilsøke installasjoner.

Konklusjon

Med en modularisert arkitektur, må utrullingen av applikasjonen være smidig. Chocolatey gir oss blant annet avhengighetshåndtering mellom pakker, og sørger for at vi alltid får med oss bitene en modul er avhengig av. Tiden med avglemte MSI-pakker er derfor forbi. Så langt har utrulling av DIPS i våre testmiljøer fungert mye mer effektivt, med store muligheter for skriptbarhet og automasjon.