navcontainerhelper/AppHandling/Convert-BcAppsToRuntimePack...

175 строки
7.8 KiB
PowerShell

<#
.Synopsis
Preview function for Converting BC Apps to Runtime Packages
.Description
Preview function for Converting BC Apps to Runtime Packages
.Parameter showMyCode
Include this switch if you want to include the app's source code in the runtime package.
.Parameter includeSourceInPackageFile
Include this switch if you want to include source code in the runtime package.
.Parameter skipFailingApps
If set, a failing app (compiler error or anything else) does not stop the whole process but continues with the next app.
.Parameter afterEachRuntimeCreation
A script block to be executed after an app has been converted to a runtime package.
The parameters are 'appFile', containing the source path and 'runtimeFile' containing the path
to the newly extracted runtime file or $null if the process has failed and skipFailingApps has been set.
#>
function Convert-BcAppsToRuntimePackages {
Param(
[string] $containerName = $bcContainerHelperConfig.defaultContainerName,
[Parameter(Mandatory=$false)]
[string] $imageName = "my",
[Parameter(Mandatory=$true)]
$artifactUrl,
[Parameter(Mandatory=$false)]
[string] $licenseFile = "",
[Parameter(Mandatory=$false)]
[string] $addinsFolder,
[Parameter(Mandatory=$false)]
$publishApps = "",
[Parameter(Mandatory=$true)]
$apps,
[Parameter(Mandatory=$false)]
$destinationFolder = "",
[bool] $includeSourceInPackageFile,
[bool] $showMyCode,
[switch] $skipVerification,
[switch] $skipFailingApps,
[scriptblock] $afterEachRuntimeCreation = {}
)
$telemetryScope = InitTelemetryScope -name $MyInvocation.InvocationName -parameterValues $PSBoundParameters -includeParameters @()
try {
$appsFolder = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString())
try {
$apps = @(Sort-AppFilesByDependencies -appFiles (CopyAppFilesToFolder -appFiles $apps -folder $appsFolder) -WarningAction SilentlyContinue)
if ($apps.Count -eq 0) {
throw "No apps specified"
}
if ($publishApps) {
$publishApps = CopyAppFilesToFolder -appFiles $publishApps -folder $appsFolder
}
if (!($destinationFolder)) {
$destinationFolder = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString())
New-Item -Path $destinationFolder -ItemType Directory | Out-Null
}
elseif (Test-Path $destinationFolder) {
if (Get-ChildItem -Path $destinationFolder) {
throw "Destination folder is not empty"
}
}
else {
New-Item -Path $destinationFolder -ItemType Directory | Out-Null
}
$password = GetRandomPassword
$credential= (New-Object pscredential 'admin', (ConvertTo-SecureString -String $password -AsPlainText -Force))
$additionalParameters = @(
"--volume ""$($appsFolder):c:\apps"""
"--volume ""$($destinationFolder):c:\dest"""
"--env WebClient=N"
"--env httpSite=N"
)
if ($addinsFolder) {
$additionalParameters += @(
"--volume ""$($addInsFolder):c:\run\add-ins"""
)
}
New-BcContainer `
-containerName $containerName `
-imageName $imageName `
-accept_eula `
-shortcuts None `
-artifactUrl $artifactUrl `
-auth UserPassword `
-multitenant:$false `
-Credential $credential `
-licenseFile $licenseFile `
-additionalParameters $additionalParameters
$bcVersion = (Get-BcContainerNavVersion -containerOrImageName $containerName).ToLowerInvariant()
if ($publishApps) {
$publishApps = Sort-AppFilesByDependencies -containerName $containerName -appFiles $publishApps -WarningAction SilentlyContinue
$publishApps | % {
Invoke-ScriptInBcContainer -containerName $containerName -scriptblock { Param($appFile, $skipVerification)
Write-Host "Publishing $([System.IO.Path]::GetFileName($appFile))"
Publish-NavApp -ServerInstance $serverInstance -path $appFile -skipVerification:$skipVerification -packageType Extension
} -argumentList (Get-BcContainerPath -containerName $containerName -path $_), $skipVerification
}
}
$apps | ForEach-Object {
$appFile = $_
try {
$afterEachRuntimeCreationParameters = @{ 'appFile' = $appFile }
$runtimeFileName = Invoke-ScriptInBcContainer -containerName $containerName -scriptblock { Param($appFile, $destinationFolder, $bcVersion, $skipVerification, $showMyCode, $isShowMyCodePresent, $includeSourceInPackageFile, $isIncludeSourceInPackageFilePresent)
Write-Host "Publishing $([System.IO.Path]::GetFileName($appFile))"
Publish-NavApp -ServerInstance $serverInstance -path $appFile -skipVerification:$skipVerification -packageType Extension
$navAppInfo = Get-NAVAppInfo -Path $appFile
$appPublisher = $navAppInfo.Publisher
$appName = $navAppInfo.Name
$appVersion = $navAppInfo.Version
$appFileName = "$($appPublisher)_$($appName)_$($appVersion).runtime-$($bcVersion).app".Split([System.IO.Path]::GetInvalidFileNameChars()) -join ''
$params = @{
"ServerInstance" = $serverInstance
"appName" = $appName
"appPublisher" = $appPublisher
"appVersion" = $appVersion
"path" = (Join-Path $destinationFolder $appFileName)
}
if ($isShowMyCodePresent) {
$params += @{ "showMyCode" = $showMyCode }
}
if ($isIncludeSourceInPackageFilePresent) {
$params += @{ "includeSourceInPackageFile" = $includeSourceInPackageFile }
}
Write-Host "Creating Runtime Package $([System.IO.Path]::GetFileName($appFileName))"
Get-NavAppRuntimePackage @params
return $appFileName
} -argumentList (Get-BcContainerPath -containerName $containerName -path $appFile), (Get-BcContainerPath -containerName $containerName -path $destinationFolder), $bcVersion, $skipVerification, $showMyCode, $PSBoundParameters.ContainsKey('ShowMyCode'), $includeSourceInPackageFile, $PSBoundParameters.ContainsKey('includeSourceInPackageFile')
$afterEachRuntimeCreationParameters += @{ 'runtimeFile' = (Join-Path -Path $destinationFolder -ChildPath $runtimeFileName) }
}
catch {
if (!$skipFailingApps.IsPresent) {
throw
}
Write-Warning -Message "Failed creating Runtime Package for $($appFile)."
$afterEachRuntimeCreationParameters += @{ 'runtimeFile' = $null }
}
$afterEachRuntimeCreation.Invoke($afterEachRuntimeCreationParameters)
}
$destinationFolder
}
finally {
Remove-BcContainer -containerName $containerName
if (Test-Path $appsFolder) {
Remove-Item $appsFolder -Recurse -Force -ErrorAction SilentlyContinue
}
}
}
catch {
TrackException -telemetryScope $telemetryScope -errorRecord $_
throw
}
finally {
TrackTrace -telemetryScope $telemetryScope
}
}
Export-ModuleMember -Function Convert-BcAppsToRuntimePackages