我正在寻找一个迁移框架,该框架将与使用.NetTiers的现有项目一起使用.NetTiers是一个需要CodeSmith生成数据访问代码的旧ORM。
我们有圆屋的经验,我们已成功使用它。在从Octopus Deploy运行部署时,我们还能够自动部署架构更改。相当简单,因为它只是SQL脚本的集合。
我有兴趣转到FluentMigrator。我喜欢FM DSL而且我找到了 这个问题 非常有用,但有几件事我不理解:
- 导入现有数据库模式[*]的正确方法是什么?
- 将迁移部署到生产环境的正确方法是什么[**]?
[*]我的假设是我使用SQL Server工具生成单个脚本,并使用ExecuteEmbeddedSql作为初始迁移。那是对的吗?
[**]似乎有三种主要方式来运行迁移(Command Line,NAnt runner,MSBuild runner)。他们需要访问数据库才能运行。想象一下,我们希望将其部署到PROD环境中。开发人员和构建服务器无法访问此环境。你如何针对那种环境运行这些跑步者?
我们通常的部署过程是生成需要作为部署的一部分进行部署的SQL脚本集合。 Ops作为部署的一部分运行它们,或者作为Octopus Deploy流程(powershell)的一部分自动运行,或者如果部署在Octopus之外,则手动运行。
我们在这个特定项目中遇到的一个复杂问题是.NetTiers。这意味着我们必须使用.NetTiers运行CodeSmith代码生成,才能构建数据访问层,然后才能对这些实体和数据服务进行编码。因此,我们的工作流程必须是:
- 写迁移
- 运行迁移到升级数据库(针对特定的.NetTiers数据库)
- 针对特定的.NetTiers数据库运行.NetTiers(中央构建服务器)
- 针对新.NetTiers生成的实体,数据库字段等的代码
我很想抛弃.NetTiers,但遗憾的是重构不是一个可行的选择。
我终于解决了这个问题。可以在以下位置找到解决方案的完整大纲 http://benpowell.org/deploying-database-migrations-in-net-using-fluentmigrator-teamcity-and-octopus-deploy/。
我总结了下面的博客文章。我的大多数问题都与对FluentMigrator缺乏了解有关。我会逐一挑出原来的问题。
导入现有数据库模式的正确方法是什么?
我找不到“正确的方法”,但我找到了一种对我有用的方法!我做出了以下核心决定:
- 一世 编写整个数据库的脚本 作为基线。我包括了所有表,过程,约束,视图,索引等。我将我的第一次迭代设置为该基线。我选择了没有DROP的CREATE选项。这将是我的迁移。
- 我运行了相同的脚本转储,但只选择DROP。这将是我的迁移。
基线迁移只需要使用 EmbeddedScript
执行附加脚本的方法(我也将脚本组织到迭代文件夹中)。
[Tags(Environments.DEV, Environments.TIERS, Environments.CI, Environments.TEST)]
[Migration(201403061552)]
public class Baseline : Migration
{
public override void Up()
{
this.Execute.EmbeddedScript("BaselineUp.sql");
}
public override void Down()
{
this.Execute.EmbeddedScript("BaselineDown.sql");
}
}
基线解决了......
如何处理.NetTiers
好吧,这有点挑战。我创建了一个特定的.NetTiers数据库,我将用它来运行.NetTiers代码生成。在FluentMigrator中,您可以“标记”迁移。我决定根据环境进行标记。因此,我有'tiers'标签以及'dev','test','uat','prod'等标签。这些如何运行将在稍后进行。
在进行模式更改时,我创建了迁移并使用标记“层”来关注.NetTiers模式更改。然后我跑了 migrate.exe 在......之外 Visual Studio外部工具 使用该特定标记作为标志。与我的机器名匹配的app.config数据库连接将是使用的数据库连接,因此我将其指向层数据库。现在我的迁移已运行我的.NetTiers源数据库已准备就绪。我现在可以运行.NetTiers Codesmith代码生成工具来生成新的DLL。
.NetTiers解决了......
将迁移部署到生产环境的正确方法是什么?
我正在使用Octopus Deploy并且非常诚实,如果您要部署.NET应用程序,尤其是部署到多个服务器,这应该是您这样做的绝对首选工具!
我不会详细介绍Octopus Deploy,但是在基础层面 你可以将TeamCity和Octopus一起部署。 OD提供了两个项目来帮助您前进。
- 一个名为Octopack的程序,它将您的应用程序包装为NuGet包。
- TeamCity插件,使TeamCity构建NuGet包并将其作为在NuGet提要上公开的工件提供。
然后,Octopus Deploy使用该NuGet订阅源并将这些包部署到端点服务器。此部署过程的一部分是运行PreDeploy和PostDeploy Powershell脚本。在这里,我将使用我的特定标签运行migrate.exe应用程序。
部署解决了......
我终于解决了这个问题。可以在以下位置找到解决方案的完整大纲 http://benpowell.org/deploying-database-migrations-in-net-using-fluentmigrator-teamcity-and-octopus-deploy/。
我总结了下面的博客文章。我的大多数问题都与对FluentMigrator缺乏了解有关。我会逐一挑出原来的问题。
导入现有数据库模式的正确方法是什么?
我找不到“正确的方法”,但我找到了一种对我有用的方法!我做出了以下核心决定:
- 一世 编写整个数据库的脚本 作为基线。我包括了所有表,过程,约束,视图,索引等。我将我的第一次迭代设置为该基线。我选择了没有DROP的CREATE选项。这将是我的迁移。
- 我运行了相同的脚本转储,但只选择DROP。这将是我的迁移。
基线迁移只需要使用 EmbeddedScript
执行附加脚本的方法(我也将脚本组织到迭代文件夹中)。
[Tags(Environments.DEV, Environments.TIERS, Environments.CI, Environments.TEST)]
[Migration(201403061552)]
public class Baseline : Migration
{
public override void Up()
{
this.Execute.EmbeddedScript("BaselineUp.sql");
}
public override void Down()
{
this.Execute.EmbeddedScript("BaselineDown.sql");
}
}
基线解决了......
如何处理.NetTiers
好吧,这有点挑战。我创建了一个特定的.NetTiers数据库,我将用它来运行.NetTiers代码生成。在FluentMigrator中,您可以“标记”迁移。我决定根据环境进行标记。因此,我有'tiers'标签以及'dev','test','uat','prod'等标签。这些如何运行将在稍后进行。
在进行模式更改时,我创建了迁移并使用标记“层”来关注.NetTiers模式更改。然后我跑了 migrate.exe 在......之外 Visual Studio外部工具 使用该特定标记作为标志。与我的机器名匹配的app.config数据库连接将是使用的数据库连接,因此我将其指向层数据库。现在我的迁移已运行我的.NetTiers源数据库已准备就绪。我现在可以运行.NetTiers Codesmith代码生成工具来生成新的DLL。
.NetTiers解决了......
将迁移部署到生产环境的正确方法是什么?
我正在使用Octopus Deploy并且非常诚实,如果您要部署.NET应用程序,尤其是部署到多个服务器,这应该是您这样做的绝对首选工具!
我不会详细介绍Octopus Deploy,但是在基础层面 你可以将TeamCity和Octopus一起部署。 OD提供了两个项目来帮助您前进。
- 一个名为Octopack的程序,它将您的应用程序包装为NuGet包。
- TeamCity插件,使TeamCity构建NuGet包并将其作为在NuGet提要上公开的工件提供。
然后,Octopus Deploy使用该NuGet订阅源并将这些包部署到端点服务器。此部署过程的一部分是运行PreDeploy和PostDeploy Powershell脚本。在这里,我将使用我的特定标签运行migrate.exe应用程序。
部署解决了......