Развертывание Virtual Assistant с использованием конвейеров и выпусков Azure DevOps - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать простой способ для владельцев продуктов встать и разорвать ресурсы Azure, необходимые для Virtual Assistant.Однако для сценария развертывания deploy.ps1 требуется PowerShell 6+, который, по-видимому, недоступен в DevOps Azure.

Какой лучший способ продолжить?

Опишите решение, которое вы бы хотеликак

Цель состоит в том, чтобы использовать конвейер выпуска, чтобы автоматически поддерживать ресурсы Azure, необходимые для работы бота.

Мысли

  • Есть ли способиспользовать PowerShell 6+ с помощью Azure PowerShell?
  • Не следует ли нам использовать deploy.ps1 для развертывания ресурсов в конвейере выпуска DevOps?

Код

Вот содержимоеdeploy.ps1 и ссылка на последнюю .

#Requires -Version 6

Param(
    [string] $name,
    [string] $resourceGroup,
    [string] $location,
    [string] $appId,
    [string] $appPassword,
    [string] $luisAuthoringKey,
    [string] $luisAuthoringRegion,
    [string] $parametersFile,
    [string] $languages = "en-us",
    [string] $outFolder = $(Get-Location),
    [string] $logFile = $(Join-Path $PSScriptRoot .. "deploy_log.txt")
)

# Reset log file
if (Test-Path $logFile) {
    Clear-Content $logFile -Force | Out-Null
}
else {
    New-Item -Path $logFile | Out-Null
}

# Get mandatory parameters
if (-not $name) {
    $name = Read-Host "? Bot Name (used as default name for resource group and deployed resources)"
}

if (-not $resourceGroup) {
    $resourceGroup = $name
}

if (-not $location) {
    $location = Read-Host "? Azure resource group region"
}

if (-not $appPassword) {
    $appPassword = Read-Host "? Password for MSA app registration (must be at least 16 characters long, contain at least 1 special character, and contain at least 1 numeric character)"
}

if (-not $luisAuthoringRegion) {
    $luisAuthoringRegion = Read-Host "? LUIS Authoring Region (westus, westeurope, or australiaeast)"
}

if (-not $luisAuthoringKey) {
    Switch ($luisAuthoringRegion) {
        "westus" { 
            $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://luis.ai/user/settings)"
            Break
        }
        "westeurope" {
            $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://eu.luis.ai/user/settings)"
            Break
        }
        "australiaeast" {
            $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://au.luis.ai/user/settings)"
            Break
        }
        default {
            Write-Host "! $($luisAuthoringRegion) is not a valid LUIS authoring region." -ForegroundColor DarkRed
            Break
        }
    }

    if (-not $luisAuthoringKey) {
        Break
    }
}

if (-not $appId) {
    # Create app registration
    $app = (az ad app create `
        --display-name $name `
        --password $appPassword `
        --available-to-other-tenants `
        --reply-urls 'https://token.botframework.com/.auth/web/redirect')

    # Retrieve AppId
    if ($app) {
        $appId = ($app | ConvertFrom-Json) | Select-Object -ExpandProperty appId
    }

    if(-not $appId) {
        Write-Host "! Could not provision Microsoft App Registration automatically. Review the log for more information." -ForegroundColor DarkRed
        Write-Host "! Log: $($logFile)" -ForegroundColor DarkRed
        Write-Host "+ Provision an app manually in the Azure Portal, then try again providing the -appId and -appPassword arguments. See https://aka.ms/vamanualappcreation for more information." -ForegroundColor Magenta
        Break
    }
}

# Get timestamp
$timestamp = Get-Date -f MMddyyyyHHmmss

# Create resource group
Write-Host "> Creating resource group ..."
(az group create --name $name --location $location) 2>> $logFile | Out-Null

# Deploy Azure services (deploys LUIS, QnA Maker, Content Moderator, CosmosDB)
Write-Host "> Deploying Azure services (this could take a while)..." -ForegroundColor Yellow
if ($parametersFile) {
    (az group deployment create `
        --name $timestamp `
        --resource-group $resourceGroup `
        --template-file "$(Join-Path $PSScriptRoot '..' 'Resources' 'template.json')" `
        --parameters "@$($parametersFile)" `
        --parameters microsoftAppId=$appId microsoftAppPassword="`"$($appPassword)`"") 2>> $logFile | Out-Null
}
else {
    (az group deployment create `
        --name $timestamp `
        --resource-group $resourceGroup `
        --template-file "$(Join-Path $PSScriptRoot '..' 'Resources' 'template.json')" `
        --parameters microsoftAppId=$appId microsoftAppPassword="`"$($appPassword)`"") 2>> $logFile | Out-Null
}

# Get deployment outputs
$outputs = (az group deployment show `
    --name $timestamp `
    --resource-group $resourceGroup `
    --query properties.outputs)

# If it succeeded then we perform the remainder of the steps
if ($outputs)
{
    # Log and convert to JSON
    $outputs >> $logFile
    $outputs = $outputs | ConvertFrom-Json

    # Update appsettings.json
    Write-Host "> Updating appsettings.json ..."
    if (Test-Path $(Join-Path $outFolder appsettings.json)) {
        $settings = Get-Content $(Join-Path $outFolder appsettings.json) | ConvertFrom-Json
    }
    else {
        $settings = New-Object PSObject
    }

    $settings | Add-Member -Type NoteProperty -Force -Name 'microsoftAppId' -Value $appId
    $settings | Add-Member -Type NoteProperty -Force -Name 'microsoftAppPassword' -Value $appPassword
    if ($outputs.appInsights) { $settings | Add-Member -Type NoteProperty -Force -Name 'appInsights' -Value $outputs.appInsights.value }
    if ($outputs.storage) { $settings | Add-Member -Type NoteProperty -Force -Name 'blobStorage' -Value $outputs.storage.value }
    if ($outputs.cosmosDb) { $settings | Add-Member -Type NoteProperty -Force -Name 'cosmosDb' -Value $outputs.cosmosDb.value }
    if ($outputs.contentModerator) { $settings | Add-Member -Type NoteProperty -Force -Name 'contentModerator' -Value $outputs.contentModerator.value }

    $settings | ConvertTo-Json -depth 100 | Out-File $(Join-Path $outFolder appsettings.json)

    # Delay to let QnA Maker finish setting up
    Start-Sleep -s 30

    # Deploy cognitive models
    Invoke-Expression "$(Join-Path $PSScriptRoot 'deploy_cognitive_models.ps1') -name $($name) -luisAuthoringRegion $($luisAuthoringRegion) -luisAuthoringKey $($luisAuthoringKey) -qnaSubscriptionKey $($outputs.qnaMaker.value.key) -outFolder $($outFolder) -languages `"$($languages)`""

    Write-Host "> Done."
}
else
{
    # Check for failed deployments
    $operations = az group deployment operation list -g $resourceGroup -n $timestamp | ConvertFrom-Json
    $failedOperations = $operations | Where { $_.properties.statusmessage.error -ne $null }
    if ($failedOperations) {
        foreach ($operation in $failedOperations) {
            switch ($operation.properties.statusmessage.error.code) {
                "MissingRegistrationForLocation" {
                    Write-Host "! Deployment failed for resource of type $($operation.properties.targetResource.resourceType). This resource is not avaliable in the location provided." -ForegroundColor DarkRed
                    Write-Host "+ Update the .\Deployment\Resources\parameters.template.json file with a valid region for this resource and provide the file path in the -parametersFile parameter." -ForegroundColor Magenta
                }
                default {
                    Write-Host "! Deployment failed for resource of type $($operation.properties.targetResource.resourceType)."
                    Write-Host "! Code: $($operation.properties.statusMessage.error.code)."
                    Write-Host "! Message: $($operation.properties.statusMessage.error.message)."
                }
            }
        }

        Write-Host "+ To delete this resource group, run 'az group delete -g $($resourceGroup) --no-wait'" -ForegroundColor Magenta
        Break
    }
}

Скриншоты установки

enter image description here

enter image description here

Попытка запустить Azure PowerShell

Когда я пытаюсь запустить сценарий с помощью Azure PowerShell, я получаю следующую ошибку.

##[error]The script 'deploy.ps1' cannot be run because it contained a "#requires" statement for Windows PowerShell 6.0. The version of Windows PowerShell that is required by the script does not match the currently running version of Windows PowerShell 5.1.17763.316.

Это с Azure PowerShell Version, установленным на Latest installed version.Использование Specify other version и 6.7.0, 6.2.1 или 6.0.0 также не работает.Ни один из них, кажется, на самом деле не имеет эффекта.Это всегда возвращается как 5.1.17763.316.

Ответы [ 2 ]

3 голосов
/ 23 мая 2019

Прежде всего, ваш скрипт использует Read-Host, который не может использоваться в конвейере.Агенты сборки имеют pwsh (то есть Powershell 6.0 +), но ваш сценарий вообще не использует Azure Powershell, он использует Azure CLI (который также доступен в агенте сборки).

В общем, вы бынужно реорганизовать ваш скрипт для конвейера, и он будет работать нормально.

1 голос
/ 24 мая 2019

Агенты сборки имеют PSv6, они также имеют PSv5 Программное обеспечение для каждого агента указано по адресу: https://github.com/Microsoft/azure-pipelines-image-generation/tree/master/images/win

Проблема в том, что задача состоит в том, чтобы использовать «Azure Powershell», который использует командлеты PS v5, поэтому принудительно использует PSv5 (powershell.exe) вместо PSv6 (pwsh.exe).

Если бы вы использовали обычную задачу «Powershell» и выбрали «Использовать Powershell Core», вам было бы трудно (или небезопасно) войти в систему.

Для этого сценария необходимо выполнить сценарий PSv6 из задачи Azure CLI. Для этого просто добавьте задачу CLI Azure и выполните приведенный ниже скрипт (исправьте путь и параметры к тому, что вы опубликовали).

pwsh -File ${System.DefaultWorkingDirectory}\<some-path-to>\deploy.ps1 -script-arguments-copy-pasted-here

ПРИМЕЧАНИЕ. Единственный способ, с помощью которого это работает, - это если ВСЕ параметры передаются и хост чтения не попадает, как указано в 4c74356b41, вы не можете получить входные данные из конвейера.

...