Volautomatisch uitrollen van nieuwe Qlik Sense dashboards

Zo doe je dat…

De Casus

Bij HippoLine hebben wij een BI-applicatie ontwikkeld op het boekhoudprogramma Twinfield. Op dat dashboard heeft iedere klant zijn eigen variant met eigen data, AVG-proof en volledig betrouwbaar want de klant ziet alleen zijn eigen gegevens. In dit blog legt Thijs de Bruijn, BI-consultant, uit hoe dit werkt.

Elke klant heeft zijn eigen dashboard. Aan de hand van een stukje code in het script wordt bij dit dashboard de custom property uitgelezen die aan het document hangt. Aan de hand daarvan wordt gekeken welke dataconnectie gebruikt wordt.

Dit werkt heel fijn, voor alle aansluitingen geldt dat dezelfde applicatie gebruikt wordt, maar omdat je door middel van de custom property naar een andere dataconnectie kijkt, is de data voor alle klanten enkel hun eigen data.

Ongewenste downtime

Maar wat nu als er een nieuwe versie van de applicatie live willen zetten? Het is simpelweg veel werk om voor alle (10+) aansluitingen dit met het handje te doen. Bovendien: als je het dashboard overschrijft, zal deze een tijdje geen data hebben. Deze is er pas als het dashboard weer gereload is, en dat kan even duren. Dus: ongewenste downtime.

Dus: automatiseren die hap! Hiervoor hebben we dankbaar gebruik gemaakt van deze link: https://qlik.dev/libraries-and-tools/qlik-cli en deze: https://github.com/ahaydon/Qlik-Cli-Windows

Hoe het werkt

Met Qlik CLI (Command Line Interface) kan je eigenlijk alles in een command line doen wat je normaal gesproken in de management console met het handje zou doen. Met als bijkomend voordeel dat je dit kan automatiseren. Je hoeft dus niet meer veel rond te klikken, wat tijd scheelt, fouten voorkomt en je RSI bespaart.

Volg bovenstaande linkjes voor de installatie. Wij gebruiken een certificaat om te authentiseren en schrijven onze code in PowerShell. Omdat we stiekem een beetje trots zijn op onze oplossing, zullen we enkele checks en slimmigheden die we ingebouwd hebben niet laten zien, maar in de kern leggen we wel uit hoe deze code werkt.

De code (voor de liefhebber):

We beginnen met wat parameters, namelijk de naam van de bronapplicatie (vanwege versiebeheer kunnen we die hard ingeven, bijvoorbeeld TwinField-Bron-3.1.1) en de naam van de klant. De bronapp geven we trouwens nu even als parameter in. Omdat we hierboven nog een loopje hebben op klantnaam, is deze eigenlijk voor elke run altijd hetzelfde. Maar het gaat om de gedachte.

param (

[Parameter(Mandatory=$true)][string]$bronapp,

[Parameter(Mandatory=$true)][string]$klantnaam

)

En we moeten natuurlijk niet vergeten de module in te laden:

Import-Module Qlik-Cli

Allereerst zoeken we de bronapplicatie op, deze staat altijd in de TWINFIELD_DEV stream gepubliceerd:

$sourceApp = Get-QlikApp -filter “stream.name eq ‘TWINFIELD_DEV’ AND name eq ‘$bronapp'”

Zoals je ziet, eigenlijk ook precies wat je zelf bij elkaar zou klikken, je zoekt op stream en naam. Dan kan er maar 1 applicatie overblijven..

Hier maken we dan een kopietje van

$kopieApp = Get-QlikApp $sourceApp.id | Copy-QlikApp | Update-QlikApp -Name “_Tijdelijke kopie Twinfield $klantnaam” -customProperties @(“Twinfieldklant=$klantnaam)

Met het | karakter kan je makkelijk zaken achter elkaar laten gebeuren. Je pakt dus eigenlijk het origineel, kopieert deze, geeft er een tijdelijke naam aan en koppelt de custom property die gebruikt moet worden om de data in te laden.

Omdat de custom property er nu aan gekoppeld is, kunnen we gelijk de boel herladen:

$taak = New-QlikTask -appId $kopieApp.id  -name “_Herladen Twinfield  $klantnaam”

$taak_aanzetten = Start-QlikTask $taak.id -wait

$resultaat = Wait-QlikExecution -executionId $taak_aanzetten.value

Dus: nieuwe taak aangemaakt, aangezet, en wachten tot op een resultaat. Bij dit resultaat hebben we uiteraard nog wel iets in gebouwd om zeker te weten dat we niet per ongeluk het dashboard publiceren als de taak mislukt is.

Na de reload hebben we de tijdelijke taak niet meer nodig:

$taak_verwijderen = Remove-QlikTask $taak.id

En naar welk dashboard moet het nieuwe gevulde tijdelijke dashboard dan overschreven worden? Elke klant heeft zijn eigen stream en het dashboard heet altijd simpelweg Twinfield

$doelApp = Get-QlikApp -filter “stream.name eq ‘$klantnaam’ AND name eq ‘Twinfield'”

Nu we dit doel hebben, kunnen we de tijdelijke kopie simpelweg over het doel heen plaatsen:

$live_zetten = Switch-QlikApp $kopieApp.id $doelApp.id

De kopie hebben we niet meer nodig, en mag dus verwijderd worden.

$verwijderen_kopie = Remove-QlikApp $kopieApp.id

Kortom:

  • Zoek de bronapp op
  • Maak een kopietje
  • Geef deze een tijdelijke naam
  • Hang de juiste custom property er aan
  • Maak een reloadtaak
  • Reload
  • Verwijder reloadtaak
  • Zoek de doelapp op
  • Plaats de kopie over de doelapp
  • Verwijder de kopieapp
  • Ga terug naar 1, maar dan voor de volgende klant

Omdat we een loopje over de klanten heen doen, hadden we ook er voor kunnen kiezen om de kopie niet te verwijderen en telkens de kopie te hernoemen en er andere custom properties aan te hangen en de reloadtaak te hernoemen; de gebruikte methodiek is echter overzichtelijker en levert nauwelijks tijdswinst op.

Resultaat:

We kunnen nu een nieuwe versie van het dashboard heel makkelijk uitrollen, dit scheelt ons elke release zeker een dagdeel aan werk. Alles is veilig, slim, snel en geautomatiseerd! Wil je ook op die manier je Qlik Sense omgeving inrichten? Wij kunnen je daar bij helpen.