繁体   English   中英

如何通过CI / CD在本地从VSTS生成SSAS表格并将其部署到Azure分析服务

[英]How to build and deploy SSAS tabular from VSTS through CI/CD locally and to Azure Analysis services

我正在Visual Studio 2017中从事SSAS表格项目,希望在本地和天蓝色分析服务中自动化构建和部署(和测试)。 该项目已连接到Azure Devops项目,并且可以正常工作。

但是,在以天蓝色的开发人员构建和部署项目时,我很费劲。 我关注了有关该主题的博客( https://notesfromthelifeboat.com/post/analysis-services-1-deployment/ ),作者创建了一些Powershell脚本,当我在Windows Powershell ISE上本地运行它们时,它们可以在我的计算机上运行。 但是,当我尝试在Powershell任务中使用相同的Powershell文件在devops上创建构建管道时,它失败了。 我创建了一些变量,并设置了对powershell文件的引用。 到目前为止一切顺利,当我尝试运行构建时,出现错误提示:

Import-Module:未加载指定的模块'SqlServer',因为在任何模块中均未找到有效的模块文件

似乎devops中的powershell无法加载Import-Module -Name SqlServer。 我在网上搜索了一个解决方案,但到目前为止没有任何效果,ImpI的其他组合发现在Powershell ISe和Powershell ci-build任务之间$ env:PSModulePath环境变量之间存在细微的差异,但我不确定这是否是问题。

如果您有任何了解如何解决此问题的经验,或者对如何在本地部署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

对于第三方模块,解决方案是修改$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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM