我有一个正在部署到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代理。它已更新。每次添加用户定义的功能时,都会重新启动代理服务。
- 我已经通过使用两个帐户连接到目标实例来验证帐户和密码
- 我已尝试使用Azure Active Directory主体进行身份验证,这些主体是Azure SQL数据库上的管理员
- 我尝试使用SQL Server身份验证
- 我为SqlPackage的Windows自托管代理添加了一个用户定义的功能,其兼容性级别为150,与数据库兼容性级别相匹配
- 我尝试将数据库兼容性级别从150降低到130,以匹配代理上的系统定义功能
- 我验证了目录结构与YAML匹配,并且DACPAC和发布配置文件存在
- 我验证了存储在YAML之外的管道变量中的值
- 我已验证运行代理的计算机是否在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