另一种方法是在构建流水线期间生成迁移脚本(一个常规的SQL脚本),并将此脚本作为您的工件的一部分。要执行此操作,请运行以下命令:
dotnet ef migrations script --output $(build.artifactstagingdirectory)\sql\migrations.sql -i
请注意-i
标志,它使此脚本可以在同一数据库上多次运行
将此脚本作为工件的一部分后,您可以通过使用内置任务Azure SQL Database Deployment
在发布流水线上运行该脚本。
有关更多信息,请查看此链接
编辑:正如@PartickBorkowicz所指出的,与从Build / Release Agent角度以常规方式访问数据库相关的一些问题。以下是一些额外提示:如何在不将数据库和连接字符串存储在代码中的情况下继续生活。
1. 构建流水线
如果不做任何处理,构建代理将需要数据库连接才能运行dotnet ef migrations script
脚本。但是有一个技巧可以让您在没有数据库和连接字符串的情况下工作:IDesignTimeDbContextFactory
您只需创建如下类即可:
public class YourDesignTimeContextFactory : IDesignTimeDbContextFactory<YourDbContext>
{
public YourDbContext CreateDbContext(string[] args)
{
var databaseConnectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog=LocalDB;Integrated Security=True;Pooling=False";
var builder = new DbContextOptionsBuilder<YourDbContext>();
builder.UseSqlServer(databaseConnectionString);
return new YourDbContext(builder.Options);
}
}
一旦它出现在您的项目中(您不需要注册它),您的生成代理将能够生成带有迁移逻辑的 SQL 脚本,而无需访问实际数据库。
2. 发布流水线
现在你已经生成了 SQL 脚本,并将其作为构建流水线的一部分包含在工件中。现在,发布流水线是您想要在实际数据库上运行此脚本的时候 - 您需要以某种方式连接到此数据库。为了以安全的方式执行此操作,您不应将密码存储在代码的任何地方。一个好的方法是将密码保存在 Azure 密钥保管库中。Azure 发布流水线中有一个名为 Azure Key Vault 的内置任务。这将获取您的秘密,您可以在下一步中使用: Azure SQL 数据库部署。您只需要设置选项:
AuthenticationType: Connection String
ConnectionString: `$(SqlServer--ConnectionString)` - this value depends on your secret name in Key Vault
Deploy type: SQL Script File
SQL Script: $(System.DefaultWorkingDirectory)/YourProject/drop/migrations/script.sql - this depends how you setup your artifact in build pipeline.
通过这种方式,您可以在不访问数据库的情况下生成迁移,并且可以运行迁移SQL而无需在代码中存储连接字符串。