我正在将 SQL Server 数据库部署到 Azure,该部署的一部分是将静态数据作为部署后任务加载到某些表中。我的 YAML 已设置完毕,因此我们可以在“逐个客户端”上部署,手动执行管道。客户端部署后数据与 SQL 文件中的 SQL 项目一起存储在客户端文件夹中。
我的 Yaml 任务:
- task: SqlAzureDacpacDeployment@1
inputs:
azureSubscription: ${{ parameters.azureSubscription }}
serverName: ${{ parameters.serverName }}
databaseName: ${{ parameters.databaseName }}
sqlUsername: ${{ parameters.sqlUsername }}
sqlPassword: 'pwd'
deployType: 'DacpacTask'
DacpacFile: ${{ parameters.dacpacFile }}
DeploymentAction: ${{ parameters.DeploymentAction }}
AdditionalArguments: /v:RunPostDeployment=${{ parameters.RunPostDeployment }} /v:tenant=${{ parameters.tenant }}
displayName: Deploy SQL DacPac
我的两个 SQL CMD 变量是
RunPostDeployment
,默认为 true
和 tenant
默认为 CompanyA
。 CompanyA 是一个包含 SQL 脚本数据的文件夹。
我的部署后控制器 SQL 文件:
IF '$(RunPostDeployment)' = 'True'
BEGIN
-- Set Vars
:r .\variables.sql
-- Tenant and Stages
:r ..\config_data\$(tenant)\tenant_and_stage.sql
:r .\tenant.sql
:r .\stage.sql
-- Pipeline and Parameters
:r ..\config_data\$(tenant)\pipeline_and_parameters.sql
:r .\pipeline.sql
:r .\pipeline_parameter.sql
-- Column Mappings
:r ..\config_data\$(tenant)\column_mappings.sql
:r .\column_mapping.sql
END
运行我的 YAML 管道并选择
CompanyA
,一切都非常顺利。但是选择CompanyB
,则不会加载任何数据。如果我将 tenant
默认设置为 CompanyB
,那么我会遇到相反的情况。它几乎看起来像设置租户的 YAML 任务不起作用。我已经检查了通常的拼写、大小写等,一切都很好。
进一步测试表明 YAML 任务上传递的值并未被传递。删除默认值并为
false
提供 RunPostDeployment
会产生相反的结果!
其他一些人可能需要这个答案,但解决方案位于
VSBuild@1
YAML 任务中,而不是部署中!
在上面的控制器文件中,我使用
$(tenant)
动态选择客户端文件夹,并通过后期绑定嵌入 SQL 变量的 Json 数据,例如
:r ..\config-data\$(tenant)\pipelines-and-parameters.sql
。 IE。后期绑定解决了这个问题,而不是拥有一个随着每个新客户端而增长的控制器文件。
由于 SQL Cmd 变量(租户)有默认值,因此它没有选择包含我想要的文件(带有 Json 的 SQL 变量)的文件夹,并且始终使用默认客户端。当到达 dacpac 部署时,我可以提供任何 SQL Cmd 值,但这无关紧要,因为 dacpac 已经使用其 SQL 部署后 SQL 文件创建了!
调整了两个要素。首先在
sqlproj
文件中:
<ItemGroup>
<SqlCmdVariable Include="RunPostDeployment">
<Value>$(RunPostDeployment)</Value>
<DefaultValue>False</DefaultValue>
</SqlCmdVariable>
<SqlCmdVariable Include="tenant">
<Value>$(tenant)</Value>
<DefaultValue>default</DefaultValue>
</SqlCmdVariable>
</ItemGroup>
值与变量名称匹配。而不是 VS Code 设置的一些随机值,例如sql_cmd_6!
其次,在
VSBuild@1
中,我提供了要设置为参数的值,因此当编译 dacpac
时,它会采用正确的客户端文件夹(Json SQL 变量):
- task: VSBuild@1
inputs:
solution: $(sqlProjectFile)
msbuildArgs: '/p:Configuration=$(buildConfiguration) /p:SqlCmdVariables=RunPostDeployment=${{parameters.RunPostDeployment}};tenant=${{parameters.tenant}}'
platform: 'Any CPU'
configuration: $(buildConfiguration)