Modules/businessdev.ALbuild.Marketplace/Public/Submit-BcMarketplaceApp.ps1
|
function Submit-BcMarketplaceApp { <# .SYNOPSIS Submits an AL app to Microsoft Marketplace (AppSource) end to end. .DESCRIPTION Orchestrates a Marketplace submission: authenticates (Partner Center and product-ingestion scopes), resolves the product by name, uploads the app (and library apps) and creates a submission, waits for validation, and optionally promotes it to live. Requires a valid ALbuild license. .PARAMETER ProductName The Marketplace product (offer) name. .PARAMETER AppFile The main .app file. .PARAMETER LibraryAppFile Optional dependent/library .app files. .PARAMETER TenantId Azure AD tenant id for the Partner Center service principal. .PARAMETER ClientId Service principal client id. .PARAMETER ClientSecret Service principal client secret. .PARAMETER AutoPromote Promote to live after successful validation. .PARAMETER TimeoutMinutes Validation timeout. Default 40. .OUTPUTS PSCustomObject with ProductId, SubmissionId, Validation, Promoted. #> [CmdletBinding(SupportsShouldProcess)] [OutputType([PSCustomObject])] param( [Parameter(Mandatory)] [string] $ProductName, [Parameter(Mandatory)] [string] $AppFile, [string[]] $LibraryAppFile = @(), [Parameter(Mandatory)] [string] $TenantId, [Parameter(Mandatory)] [string] $ClientId, [Parameter(Mandatory)] [object] $ClientSecret, [switch] $AutoPromote, [int] $TimeoutMinutes = 40 ) Assert-ALbuildLicensed -Feature 'Marketplace' $graphAuth = New-BcMarketplaceAuthContext -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret -Scope 'https://graph.microsoft.com/.default' $partnerAuth = New-BcMarketplaceAuthContext -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret -Scope 'https://api.partner.microsoft.com/.default' Write-ALbuildLog "Resolving product '$ProductName' ..." $products = @(Get-BcMarketplaceProduct -AuthContext $graphAuth -Name $ProductName) if ($products.Count -eq 0) { throw "Marketplace product '$ProductName' was not found." } if ($products.Count -gt 1) { throw "Multiple products match '$ProductName'; use a more specific name." } $product = $products[0] if (-not $PSCmdlet.ShouldProcess($product.name, 'Create and validate Marketplace submission')) { return } $submission = New-BcMarketplaceSubmission -AuthContext $partnerAuth -ProductId $product.id -AppFile $AppFile -LibraryAppFile $LibraryAppFile $validation = Wait-BcMarketplaceValidation -AuthContext $partnerAuth -ProductId $product.id -SubmissionId $submission.id -TimeoutMinutes $TimeoutMinutes $promoted = $false if ($AutoPromote -and $validation.Completed) { Invoke-BcMarketplacePromotion -AuthContext $partnerAuth -ProductId $product.id -SubmissionId $submission.id | Out-Null $promoted = $true } return [PSCustomObject]@{ ProductId = $product.id SubmissionId = $submission.id Validation = $validation Promoted = $promoted } } |