Как создать и развернуть табличную SSAS из VSTS через CI / CD локально и в службы анализа Azure - PullRequest
0 голосов
/ 18 декабря 2018

Я работаю над табличным проектом SSAS в Visual Studio 2017, где хочу автоматизировать сборку и развертывание (и тестирование) локально и в службах анализа Azure.Проект связан с проектом Azure Devops, и он работает.

Но я очень стараюсь, когда дело доходит до сборки и развертывания проекта в лазурных девопах.Я следил за блогом на эту тему (https://notesfromthelifeboat.com/post/analysis-services-1-deployment/)), и автор создал несколько сценариев PowerShell, которые работают на моем компьютере, когда я запускаю их локально в Windows Powershell ISE. Но когда я пытался создать конвейер сборки на devops, используятот же файл Powershell в задаче Powershell, он завершается ошибкой. Я создал несколько переменных и установил ссылку на файл powershell. Пока все отлично. Когда я попытался запустить сборку, я получил сообщение об ошибке:

Import-Module: указанный модуль 'SqlServer' не был загружен, поскольку ни в одном модуле не было найдено допустимого файла модуля

Кажется, что powershell в devops не может загрузить Import-Module -NameSqlServer. Я искал в сети решение, но пока ничего не помогло, и другая комбинация ImpI обнаружила, что существует небольшая разница в переменной среды $ env: PSModulePath между в Powershell ISe и в Powershell.Задача сборки, но я не уверен, что это проблема.

Если у кого-то из вас есть опыт, зная, как решить эту проблему, или у вас есть лучшее решение о том, как развернуть табличную модель SSAS локально и, особенно, о развертывании на Azure (может быть, у некоторых из вас есть опыт автоматизации) из сборки / выпуска.

настройка сборки на devops Ошибка при запуске сборки

Скрипт Powershell

Команда: .\deploy_model.ps1 -workspace c:\develop\tabular-automation -environment validation -analysisServicesUsername test_ssas -analysisServicesPassword test_ssas

  param(
    [Parameter(Mandatory)]
    [string]$workspace,
    [Parameter(Mandatory)]
    [string]$environment,
    [Parameter(Mandatory)]
    [string]$analysisServicesUsername,
    [Parameter(Mandatory)]
    [string]$analysisServicesPassword,
    [string]$databaseServer = "localhost",
    [string]$analysisServicesServer = "localhost"
)


Import-Module -Name SqlServer

$ErrorActionPreference = "Stop"

# Build the model
$msbuild = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe'
& "$msbuild" TabularExample.smproj "/p:Configuration=$environment" /t:Clean,Build /p:VisualStudioVersion=14.0

# Copy build outputs and deployment options to deployment directory
$deploymentDir = ".\deployment"
mkdir -Force $deploymentDir
cp "bin\$environment\*.*" $deploymentDir
cp .\deploymentoptions\*.* $deploymentDir

# Update deployment targets with parameters
$template = Get-Content .\deploymentoptions\Model.deploymenttargets
$expandedTemplate = $ExecutionContext.InvokeCommand.ExpandString($template)
$expandedTemplate | Set-Content "$deploymentDir\Model.deploymenttargets"

# Create the deployment script
Microsoft.AnalysisServices.Deployment.exe "$deploymentDir\Model.asdatabase" /s:"$deploymentDir\deploy.log" /o:"$deploymentDir\deploy.xmla" | Out-Default

# Deploy the model
$SECURE_PASSWORD = ConvertTo-SecureString $analysisServicesPassword -AsPlainText -Force
$CREDENTIAL = New-Object System.Management.Automation.PSCredential ($analysisServicesUsername, $SECURE_PASSWORD)
Invoke-ASCmd –InputFile "$workspace\$deploymentDir\deploy.xmla" -Server $analysisServicesServer -Credential $CREDENTIAL

1 Ответ

0 голосов
/ 20 февраля 2019

Для сторонних модулей или решением было изменить $env:PSModulePath так, чтобы он указывал на сетевое расположение с версией модуля, которую мы хотим, чтобы наши агенты сборки запускали.Я использую код, как показано ниже (мы также установили PSModulePath для относительного пути к нашим пользовательским модулям, которые хранятся в том же репо, но я удалил эту часть кода, поскольку вы не утверждаете, что у вас есть какие-либо пользовательские модули)

Мне это нравится больше, чем постоянно работающий Install-Module, потому что я лучше контролирую, какая версия модулей запущена, и мне не нужно беспокоиться о том, чтобы наши сборочные блоки постоянно взаимодействовали с PowershellGallery

try {
  Import-Module SQLServer -Force -ErrorAction Stop
}
catch {
$networkPath = "\\Network path to Modules\"
    if (!(Test-Path $networkPath)) {
      Write-Error "Can not set env:PSModulePath to the published location on the network" -ErrorAction Stop
    }
    else {
      if (!($env:PSModulePath -like "*;$networkPath*")) {
        $env:PSModulePath = $env:PSModulePath + ";$networkPath"
      }
    }
  }
  else {
    Write-Host "Setting the modulePath to $modulePath"
    if (!($env:PSModulePath -like "*;$modulePath*")) {
      $env:PSModulePath = $env:PSModulePath + ";$modulePath\"
    }
  }

  Import-Module SQLServer -Force -DisableNameChecking -ErrorAction Stop
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...