Azure CI(YAML)管道在执行任务时失败SqlAzureDacpacDeployment@1SqlPackage



我有一个正在部署到Azure SQL数据库实例的数据库项目。此CI管道在组织外部的另一个环境中工作。我们把它搬入这个组织。失败的作业是部署作业。所使用的任务是SqlAzureDacpacDeployment@1

错误消息:

##[error]***发生意外故障:出现一个或多个错误。。

##[error]Azure SQL DACPAC任务失败。SqlPackage.exe已退出,代码为1。请查看如何在中排除故障https://aka.ms/sqlazuredeployreadme#troubleshooting-

代码:

- task: SqlAzureDacpacDeployment@1
displayName: 'info...'
inputs:
azureSubscription: $(ServiceConnection)
serverName: $(sqlServer)
databaseName: $(DbName)
SqlUsername: $(AdminAccount)
SqlPassword: $(AdminAccountPassword)
dacpacFile: '$(BuildName)\db_name\bin\Output\db_name.dacpac'
publishProfile: '$(BuildName)$(publishProfile)'

部署任务使用DACPAC和发布配置文件的组合。由于SQLCMD变量的广泛使用,这是必要的。该代理是自承载的Windows代理。它已更新。每次添加用户定义的功能时,都会重新启动代理服务。

  1. 我已经通过使用两个帐户连接到目标实例来验证帐户和密码
  2. 我已尝试使用Azure Active Directory主体进行身份验证,这些主体是Azure SQL数据库上的管理员
  3. 我尝试使用SQL Server身份验证
  4. 我为SqlPackage的Windows自托管代理添加了一个用户定义的功能,其兼容性级别为150,与数据库兼容性级别相匹配
  5. 我尝试将数据库兼容性级别从150降低到130,以匹配代理上的系统定义功能
  6. 我验证了目录结构与YAML匹配,并且DACPAC和发布配置文件存在
  7. 我验证了存储在YAML之外的管道变量中的值
  8. 我已验证运行代理的计算机是否在Azure SQL数据库实例上启用了防火墙规则

我现在正在寻找一个类似的任务。

您可以使用服务主体而不是SQL身份验证来部署Azure SQL数据库。

参考:https://datasharkx.wordpress.com/2021/03/11/automated-deployment-of-azure-sql-database-azure-sql-data-warehouse-through-azure-devops-via-service-principal-part-1/

https://datasharkx.wordpress.com/2021/03/12/automated-deployment-of-azure-sql-database-azure-sql-data-warehouse-through-azure-devops-via-service-principal-part-2/

此外,删除publishProfile选项,改为以以下格式提供项目变量:

AdditionalArguments: /v:MyVariable=Y /v:Environment=TST

这应该奏效。

您的最终YAML文件应该如下所示:

- task: SqlAzureDacpacDeployment@1
displayName: Deploy dacpac
inputs:
azureSubscription: $(ServiceConnection)
ServerName: <server_name>
DatabaseName: <database_name>
DacpacFile: $(Pipeline.Workspace)dropMyDacpac.dacpac
AdditionalArguments: /v:ResetStuff=Y /v:Environment=TST
DeploymentAction: Publish
AuthenticationType: servicePrincipal

最新更新