使用 DevOps 自托管代理引用 SQL 预部署脚本中的其他文件

问题描述 投票:0回答:1

我们正在使用 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”的脚本的路径如何不同,尽管脚本中存在 .\ 引用。可能需要注意的是,我们使用自托管代理来运行部署。

我不知道如何配置它。任何帮助将不胜感激。

visual-studio azure-devops yaml azure-sql-database sqlcmd
1个回答
0
投票

使用 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'
© www.soinside.com 2019 - 2024. All rights reserved.