Используйте модуль Powershell Az для публикации версии на портале разработчиков

У меня есть сценарий PowerShell, который запускается в моем конвейере выпуска Azure Devops для моего API, который использует документ swagger из моего API для автоматической передачи изменений в APIM.

Недостающий шаг заключается в том, что после внесения исправлений мне нужно обновить портал разработчика последней схемой и спецификациями. Я не могу, чтобы разработчик выходил и нажимал кнопку публикации каждый раз, когда мы выпускаем релиз.

Согласно этому сообщению, я могу получить токен с идентификатором пользователя ( не уверен, какой идентификатор пользователя он хочет, я использую принципала службы) и делаю сообщение, но я надеялся, что в модуле есть доступная утилита, которую я использовал для остальной части моего скрипта.

param([string]$subscriptionId = "", [string]$resourceGroup = "", [string]$apimName = "", [string]$apiId = "", [string]$swaggerJsonPath = "", [string]$apiPath = "", [string]$baseApiUrl = "", [string]$version = "")

$ErrorActionPreference = 'Stop'

# Install-Module -Name Az -AllowClobber -Scope CurrentUser
Import-Module Az

$ctx = Get-AzContext

if ($subscriptionId -eq '')
{
    $subscriptionId = $ctx.Subscription.Id
}

#fix version - this will come in as a build number with periods, which are not allowed
#use dashes instead
$version = $version.Replace('.', '-')

Write-Output "Resource Group: ${resourceGroup}"
Write-Output "APIM Name: ${apimName}"
Write-Output "Api Id: ${apiId}"
Write-Output "Swagger Path: ${swaggerJsonPath}"
Write-Output "Api Path: ${apiPath}"
Write-Output "Base Api Url: ${baseApiUrl}"
Write-Output "Version: ${version}"

# Set the context to the subscription Id
Select-AzSubscription -SubscriptionId $subscriptionId

Write-Output "Subscription loaded: ${subscriptionId}"

# load the API management gateway context 
$apimContext = New-AzApiManagementContext -ResourceGroupName $resourceGroup -ServiceName $apimName

Write-Output "APIM Context"
Write-Output $apimContext

# create a new revision with the supplied version (this should be the release number)
$apiRevision = New-AzApiManagementApiRevision -Context $apimContext -ApiId $apiId -ApiRevision $version

Write-Output "API Revision"
Write-Output $apiRevision

try
{
    Write-Output "Begin API Import from Swagger"

    # import the swagger as open id spec - this will fail if the name of the api in swagger does not match the name of the api in the gateway
    $importResult = Import-AzApiManagementApi -Context $apimContext -SpecificationUrl $swaggerJsonPath -SpecificationFormat OpenApi -ApiId $apiId -Path $apiPath -ServiceUrl $baseApiUrl -ApiRevision $apiRevision.ApiRevision -ApiVersion $apiRevision.ApiVersion

    Write-Output "Api refreshed from swagger [${swaggerJsonPath}]"
    Write-Output $importResult
}
catch
{
    Write-Output 'Api Import Failure'
    Write-Output $_.Exception

    Write-Output 'Beginning Cleanup'

    #clean up the revision we made
    Remove-AzApiManagementApiRevision -Context $apimContext -ApiId $apiId -ApiRevision $version

    Write-Output "Revision ${$apiRevision.ApiRevision} removed"

    exit 10
}

# set the revision as current (release it to the public)
$apiRelease = New-AzApiManagementApiRelease -Context $apimContext -ApiId $apiId -ApiRevision $version

Write-Output "API Release"
Write-Output $apiRelease

# TODO: Publish dev portal

Если модуль еще не предоставлен, могу ли я получить токен sas с помощью принципала-службы?




Ответы (1)


В azure powershell нет встроенной команды для публикации портала разработки, вы можете получить токен sas с вашим субъектом службы и вызвать api через powershell.

Во-первых, убедитесь, что параметр Enable Management REST API равен Yes на лазурном портале.

введите описание изображения здесь

Затем используйте команды ниже.

$resourceGroup = "xxxxxx"
$apimName = "xxxxxx"
$apimContext = New-AzApiManagementContext -ResourceGroupName $resourceGroup -ServiceName $apimName
$Access = Get-AzApiManagementTenantAccess -Context $apimContext
$token = (New-AzApiManagementUserToken -Context $apimContext -UserId $Access.Id).UserToken

$header = @{
    'Authorization' = 'SharedAccessSignature ' + $token
}

Invoke-RestMethod -Method Post -Uri "https://$apimName.developer.azure-api.net/publish" -Headers $header

введите описание изображения здесь

Через некоторое время проверьте его на портале, все работает нормально.

введите описание изображения здесь

person Joy Wang    schedule 16.04.2021
comment
При попытке указать URL-адрес я получаю сообщение об ошибке: Invoke-RestMethod: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS. - person Josh; 21.04.2021
comment
Затем я попробовал URL-адрес API управления на экране, где вы включаете API управления: https: // $ {apimName} .management.azure-api.net / publish. Это привело к ошибке размещения версии api в строке запроса. Итак, затем я добавил значение QS, и теперь он хочет, чтобы я использовал полностью определенный путь /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName} - person Josh; 21.04.2021
comment
Ладно, разобрался. У нас есть собственный домен на нашем шлюзе. Мы должны использовать URL-адрес ourcustomdevportaldoman.com/publish. - person Josh; 21.04.2021