我们正在使用 DevOps YAML 管道来构建数据库更改并将其部署到我们的生产环境。数据库通过 DACPAC 文件部署。我们在数据库项目中配置了部署前和部署后文件。在预部署文件中,我们添加显式数据库架构更改,否则在部署 DACPAC 时会触发数据丢失错误,例如删除对象或重命名表或列。但由于 DACPAC 部署评估数据库架构时不考虑预部署脚本,因此如果我们不首先显式执行预部署脚本,我们仍然会收到这些数据丢失警告。为此,我在部署 YAML 文件中的 DACPAC 任务之前添加了一个 SQL 脚本任务。
问题是我们更喜欢使用多个预部署脚本来分隔某些任务。由于一个数据库项目只能有1个预部署脚本,因此我们使用SQLCMD语句从主脚本中调用其他文件。由于某种原因,当我执行管道时,它将正确执行预部署脚本,但随后开始在错误的文件夹中搜索其他文件。我已经用标准 :r ./
PRINT N'Execute PreDeployKeysAndSystemUsers.sql'
:r .\PreDeployKeysAndSystemUsers.sql
PRINT N'Execute PreDeployUsersAndRoles.sql'
:r .\PreDeployUsersAndRoles.sql
PRINT N'Execute PreDeployDDLStatements.sql'
:r .\PreDeployDDLStatements.sql
这是执行此脚本的 YAML 片段:
- task: SqlAzureDacpacDeployment@1
displayName: 2. Execute PreDeployment Script
inputs:
azureSubscription: '${{ parameters.ServiceConnectionPrefix}}${{ parameters.env }}'
AuthenticationType: 'servicePrincipal'
ServerName: '$(ServerName)'
DatabaseName: '${{ parameters.SQLDatabaseName }}'
deployType: 'SqlTask'
SqlFile: '$(Pipeline.Workspace)/${{ parameters.SQLProjectName }}/${{ parameters.SQLProjectName }}/01_preDeployment/Script.PreDeployment_t10-asqldb-mdw.sql'
执行此操作时,我们会收到以下错误:
请注意预部署脚本和名为“PreDeployKeysAndSystemUsers.sql”的脚本的路径如何不同,尽管脚本中存在 .\ 引用。可能需要注意的是,我们使用自托管代理来运行部署。
我不知道如何配置它。任何帮助将不胜感激。
使用 SqlAzureDacpacDeployment 任务时,我可以重现相同的问题。
查看错误任务的调试日志。我注意到 SqlAzureDacpacDeployment 任务将通过 PowerShell 脚本执行 sql 文件:
D:\a\_tasks\SqlAzureDacpacDeployment_ce85a08b-a538-4d2b-8589-1d37a9ab970f\1.234.0\DeploySqlAzure.ps1
任务本身实际上执行 DeploySqlAzure.ps1 文件。
因此,任务的实际执行路径是在任务配置文件夹下,而不是在 checkout repo 的源文件下。
更详细的信息,您可以查看任务源代码:DeploySqlAzure.ps1
要解决此问题,您可以使用 CopyFiles@2 任务/手动将相关 sql 文件复制到 SqlAzureDacpacDeployment 任务之前的路径:
C:\agents\mdwh_prd\_work\_tasks\SqlAzureDacpacDeployment_ce85a08b-a538-4d2b-8589-1d37a9ab970f\1.234.0\
例如:
- task: CopyFiles@2
displayName: 'Copy Files to: C:\agents\mdwh_prd\_work\_tasks\SqlAzureDacpacDeployment_ce85a08b-a538-4d2b-8589-1d37a9ab970f\1.234.0\PreDeployUsersAndRoles.sql'
inputs:
SourceFolder: folderpath
Contents: |
PreDeployKeysAndSystemUsers.sql
PreDeployUsersAndRoles.sql
PreDeployDDLStatements.sql
TargetFolder: 'C:\agents\mdwh_prd\_work\_tasks\SqlAzureDacpacDeployment_ce85a08b-a538-4d2b-8589-1d37a9ab970f\1.234.0\PreDeployUsersAndRoles.sql'