我有一个使用 Azure SQL Server 作为数据存储的应用程序。该应用程序具有集成测试,它连接到一个真实的数据库 - 出于测试目的,该数据库是 Visual Studio 附带的 SQL Server 本地数据库。
为了部署应用程序,我们使用 Azure Devops 管道和
windows-latest
图像。部署管道的第一步是调用解决方案的所有测试。
现在我正在添加全文搜索目录。我创建了一个新的迁移并添加了
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("create fulltext catalog ft as default", true);
migrationBuilder.Sql("create fulltext index on dbo.Persons([FirstName] language 1033, [LastName] language 1033) key index PK_Persons on ft with stoplist = system", true);
}
当我运行集成测试时,数据库迁移步骤失败并显示
SQLException:无法在用户实例中使用全文搜索
这符合预期,因为 localDb 不支持全文索引。
这在开发本地计算机上不会成为问题,因为可以使用具有高级服务的 SQL Server Express。它在构建服务器上不太理想,因为它只有 localDb 作为 Visual Studio 的一部分,并且 Microsoft 没有为该映像列出任何(其他)SQL Server。
那么,解决这个问题的正确(行业标准)方法是什么?
目前我正在考虑使用环境变量在运行集成测试时跳过迁移步骤或检查迁移时的数据库版本并跳过 localdb 的步骤。
我不想考虑在 Azure 中设置真实的数据库进行测试。
迁移在生产数据库上运行良好。
请参阅有关 Microsoft 托管代理的文档:软件
目前 Azure DevOps Microsoft 托管代理仅包括 localDB 数据库。
根据您的需求,您需要在 Pipeline 中使用 SQL Server Express 或其他真实的 sql server。
您可以参考以下两种方法:
方法1:使用Microsoft托管代理时,可以使用命令:
choco install sql-server-express
在Azure DevOps Pipeline中安装sql server express。
pool:
vmImage: 'windows-latest'
steps:
- script: 'choco install sql-server-express'
.....
方法2:在Azure DevOps Pipeline中,可以考虑使用YAML Pipeline中的Container Job。
您可以找到现有的 SQL Server docker 镜像或使用 sql server 创建 docker 镜像。
然后就可以在容器作业中使用docker镜像了。
例如:
pool:
vmImage: 'ubuntu-latest'
container:
image: mcr.microsoft.com/mssql/server:2017-latest
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'build'
在这种情况下,管道任务将在 docker 镜像中运行。它将能够使用真正的sql服务器来运行构建。
此外,您可以考虑使用自托管代理作为管道代理。可以使用本机作为Pipeline运行环境。