Come compilare e pubblicare un’estensione ALOps
- On 18 Ottobre, 2019
- dynamics, dynamics 365 business central, erp, microsoft dynamics, microsoft dynamics nav, navision
Con l’arrivo della Business Central una delle difficoltà con cui gli sviluppatori dovranno scontrarsi sarà la velocità con cui si dovrà scrivere, testare e pubblicare i nuovi sviluppi.
Una delle possibilità che si sta prendendo in considerazione per semplificare questo processo è l’utilizzo dell’estensione ALOps (un’estensione di Azure DevOps).
DevOps propone un modello che consente al team di sviluppo di programmare in maniera più rapida, rilasciando soluzioni di qualità e sicure, per ambienti tradizionali e in Cloud.
In particolare è interessante capire come compilare l’estensione presente nella nostra repository e successivamente pubblicarla nella docker container per effettuare in maniera più pratica dei test.
Il primo passo da effettuare consiste nel creare la pipeline di compilazione contenente tutti i passaggi che dovranno essere eseguiti.
Per la pipeline può essere utilizzato un file YAML (linguaggio di serializzazione dei dati progettato per essere direttamente scrivibile e leggibile dall’uomo).
Aggiungiamo quindi all’interno della repository un nuovo file avente l’estensione .yml.
Iniziamo dunque a popolare il nostro file Yaml:
variables:
build.clean: all
platform: x64
trigger: none
In particolare è importate, per i test, impostare trigger su “none” in modo da eseguire le istruzioni manualmente.
Dunque, una volta che si andrà a creare una nuova pipeline sarà necessario, impostare la repository scelta, selezionare YAML come configuratore, scegliere il nome della pipeline ed inserire il path del file creato in precedenza.
A questo punto creeremo, all’interno della stessa repository, un file jason vuoto che utilizzeremo come contenitore di tutte le impostazioni.
Per semplificarci il lavoro su Docker installiamo il modulo PowerShell NavContainerHelper e di conseguenza aggiungiamo il comando per eseguire lo script nel nostro file YAML, dopo aver inserito lo script nella repository:
steps:
– task: PowerShell@2
displayName: ‘Install NAVContainerHelper’
inputs:
targetType: filePath
filePath: ‘BuildScripts\InstallNAVContainerHelper.ps1’
Lo step successivo è creare un contenitore. Con Business Central sono necessari un utente e una password che verranno utilizzati per l’autenticazione, per questo motivo aggiungeremo alla nostra pipeline due nuove variabili globali.
Insieme ad Username e Password sarà inoltre necessario specificare il nome del contenitore.
Tutto ciò dovrà essere memorizzato nel file jason per rendere più semplice l’eventuale modifica di tali parametri.
Abbiamo ora necessità di creare uno script PowerShell che crei un contenitore:
Param ( | |
[ Parametro ( obbligatorio = $ vero )] | |
[ pscredential ] $ credential | |
) | |
$ settings = ( Get-Content ( Join-Path $ PSScriptRoot ” \ settings.json ” ) | ConvertFrom-Json ) | |
$ ContainerImage = $ settings .ContainerImage | |
$ ContainerName = $ settings .ContainerName | |
$ ContainerLicFile = $ settings .ContainerLicFile | |
Write-Host ” Crea $ ContainerName da $ ContainerImage “ | |
$ segmenti = ” $ PSScriptRoot ” .Split ( ‘ \ ‘ ) | |
$ rootFolder = ” $ ( $ segmenti [ 0 ]) \ $ ( $ segmenti [ 1 ]) “ | |
$ additionalParameters = @ ( ” –volume ” ” $ ( $ rootFolder ): C: \ Agent ” ” ” ) | |
$ myscripts = @ ( @ { ‘ MainLoop.ps1 ‘ = ‘ while ($ true) {start-sleep -seconds 10} ‘ }) | |
New-NavContainer parametri @ ` | |
– accept_eula: $ true ` | |
– containerName $ containerName ` | |
– imageName $ ContainerImage ` | |
– auth NAVUserPassword ` | |
– Credenziali $ credenziali ` | |
– alwaysPull ` | |
– updateHosts ` | |
– includeCSide ` | |
– doNotExportObjectsToText ` | |
– assegnarePremiumPlan ` | |
– enableSymbolLoading ` | |
– includeTestToolkit ` | |
– accept_outdated ` | |
– scorciatoie Nessuna ` | |
– licenseFile ” $ ContainerLicFile ” ` | |
– additionalParameters $ additionalParameters ` | |
– myScripts $ myscripts |
Sempre dopo aver inserito lo script all’interno della repository, quest’ultimo deve essere richiamato all’interno del file YAML:
– task: PowerShell@2
displayName: ‘Create Build Docker Container’
inputs:
targetType: filePath
filePath: ‘BuildScripts\CreateDockerContainer.ps1’
arguments: ‘-credential ([PSCredential]::new(“$(DockerContainerUsername)”, (ConvertTo-SecureString -String “$(DockerContainerPassword)” -AsPlainText -Force)))’
Una volta effettuati questi step possiamo procedere alla compilazione del codice contenuto nella repository.
Ancora una volta andiamo ad utilizzare NAVContainerHelper per creare lo script in PowerShell:
Param( |
[Parameter(Mandatory=$true)] |
[pscredential] $Credential, |
[Parameter(Mandatory=$true)] |
[string] $BuildFolder, |
[Parameter(Mandatory=$true)] |
[string] $BuildArtifactFolder |
) |
Write-Host “Compiling single App” |
$settings = (Get-Content (Join-Path $PSScriptRoot “\settings.json”) | ConvertFrom-Json) |
$ContainerName = $settings.ContainerName |
Compile-AppInNavContainer -containerName $ContainerName -credential $Credential -appProjectFolder (Join-Path $BuildFolder $_) -appOutputFolder (Join-Path $BuildArtifactFolder $_) -UpdateSymbols -AzureDevOps | Out-Null |
Successivamente è necessario aggiungere il comando all’interno del nostro file per consentire l’esecuzione dello script:
– task: PowerShell@2
displayName: ‘Compile Single App stored in Repo’
inputs:
targetType: filePath
filePath: ‘BuildScripts\CompileSingleApp.ps1’
arguments: ‘-Credential ([PSCredential]::new(“$(DockerContainerUsername)”, (ConvertTo-SecureString -String “$(DockerContainerPassword)” -AsPlainText -Force))) -BuildFolder “$(Build.Repository.LocalPath)” -BuildArtifactFolder “$(Build.ArtifactStagingDirectory)”‘
failOnStderr: true
In ultima fase ci dedichiamo alla creazione dello script che consentirà la pubblicazione della nostra estensione:
Param ( |
[ Parametro ( obbligatorio = $ vero )] |
[ pscredential ] $ Credential , |
[ Parametro ( obbligatorio = $ vero )] |
[ stringa ] $ BuildArtifactFolder |
) |
Write-Host ” Pubblicazione di una singola app ” $ BuildArtifactFolder |
$ settings = ( Get-Content ( Join-Path $ PSScriptRoot ” \ settings.json ” ) | ConvertFrom-Json ) |
$ ContainerName = $ settings .ContainerName |
Get-ChildItem – Path $ BuildArtifactFolder – Recurse – Includi * .app | ForEach-Object { |
” App per host di scrittura : ” $ _. Nome completo |
Publish-NavContainerApp – containerName $ ContainerName – appFile $ _ .FullName – skipVerification – sync – install |
} |
E per finire aggiungiamo il passaggio per eseguire lo script creato, nel nostro file YAML:
– task: PowerShell@2
displayName: ‘Publish Single App’
inputs:
targetType: filePath
filePath: ‘BuildScripts\PublishSingleApp.ps1’
arguments: ‘-Credential ([PSCredential]::new(“$(DockerContainerUsername)”, (ConvertTo-SecureString -String “$(DockerContainerPassword)” -AsPlainText -Force))) -BuildArtifactFolder “$(Build.ArtifactStagingDirectory)”‘
failOnStderr: true
0 Comments