繁体   English   中英

使用连续或自动部署时,如何部署数据库?

[英]When using Continuous or Automated Deployment, how do you deploy databases?

我正在考虑按需实施Team City和Octopus Deploy for CI和Deployment。 但是,数据库部署将变得棘手,因为许多旧的.net应用程序具有混乱的数据库。

Redgate似乎对Team City有一个很好的插件,但价格可能是绊脚石

你用什么? 我很高兴执行脚本,但这是比较方面(即已发生变化)我正在努力。

我们利用一个名为RoundhousE的免费工具来处理我们项目的数据库更改,并且使用Octopus Deploy很容易使用它。

我们在我们的解决方案中创建了一个名为DatabaseMigration的新项目,包括项目中的RoundhousE exe,我们保留RoundhousE的db更改脚本的文件夹,然后利用Octopus如何在部署之前,期间和之后调用powershell脚本(分别为PreDeploy.ps1,Deploy.ps1和PostDeploy.ps1)并将Deploy.ps1添加到项目中,其中包含以下内容:

$ roundhouse_exe_path =“。\\ rh.exe”

$ scripts_dir =“。\\ Databases \\ DatabaseName”

$ roundhouse_output_dir =“。\\ output”

if($ OctopusParameters){

$ env = $ OctopusParameters [“RoundhousE.ENV”]

$ db_server = $ OctopusParameters [“SqlServerInstance”]

$ db_name = $ OctopusParameters [“DatabaseName”]

} else {

$ ENV = “本地”

$ db_server =“。\\ SqlExpress”

$ db_name =“DatabaseName”}

&$ roundhouse_exe_path -s $ db_server -d $ db_name -f $ scripts_dir --env $ env --silent -o> $ roundhouse_output_dir

在那里你可以看到我们检查Octopus运行部署脚本时传入的任何章节变量(参数)的位置,否则我们会使用一些默认值,然后我们只需调用RoundhousE可执行文件。

然后你只需要将该项目作为Octopus打包的一部分,然后在Octopus中添加一个步骤来部署该包,它将作为每个部署的一部分执行。

我们已经看过RedGate解决方案并且几乎得出了相同的结论,不幸的是,这是让我们离开这条路线的成本。

我能想到的唯一事情是根据您现有的数据库生成受版本控制的数据库迁移脚本,然后在构建过程中执行这些脚本。 如果您将来要查看.NET项目(不使用CMS),可能会考虑使用实体框架代码进行首次迁移。

我记得有一段时间回顾这一点,对我而言,似乎有很多信任你必须投入到这种过程中,因为自动部署到开发或测试服务器并不是那么糟糕,因为数据可能是可替换的...但是,自动更新UAT或生产服务器的想法可能会将操作团队的后端发送给操作团队,他们可能负责数据库,或者至少可以恢复它。非常正确。

话虽如此,我确实认为它的方式可行,因为它太容易被数据库部署脚本吓到了,而且当事情被遗忘或遗漏时。

我似乎记得使用Red Gate的SQL Compare和SQL Data Compare工具,因为(我认为)有一个命令行方式,它可以很好地处理脚本部署过程,如Team City,CruiseControl.Net等。

使用关系数据库时,风险和复杂性更多。 在NoSQL数据库中,一切都是“文档”,我想连续部署并不是一个问题。 某些对象将具有“旧”数据结构,直到通过新发布的代码更新它们。 在这种情况下,您的代码可能需要能够支持不同的数据结构。 缺失属性或具有不同类型的属性应该包含在编写良好,防御性编码的应用程序中。

我可以看到针对生产数据库运行脚本的风险,但CI和持续交付的重点是这些脚本将在其他环境中运行和测试,以消除任何“陷阱”:-)

当您实际按下按钮进行部署时,这不会减少手指交叉和翘曲的数量!

拥有数据库部署自动化是一项真正的挑战,特别是在尝试将许多方法部署为本机应用程序代码时执行构建时。

在构建一次部署很多时,您编译代码并创建二进制文件,然后在环境中复制它们。 从数据库的角度来看,相当于生成脚本一次并在所有环境中执行它们。 这种方法不处理来自不同分支的合并,进程外更改(生产中的关键修复)等...

我所知道的数据库部署自动化 (免责声明 - 我在DBmaestro工作)正如我从客户那里听到的那样是使用构建和按需部署方法。 使用此方法,您可以构建数据库增量脚本,作为部署(执行)过程的一部分。 使用基线感知分析,解决方案知道是否为更改生成部署脚本或保护目标,而不是还原它或暂停,并允许您合并更改并解决冲突。

考虑一下我们在这个线程上成功尝试过的简单解决方案 - 如何持续交付基于SQL的应用程序?

免责声明 - 我在CloudMunch工作

我们在visual studio解决方案中使用Octopus Deploy和数据库项目。

  1. 构建代理使用带有dacpac文件的octopack创建nuget包,并在其中发布配置文件并将其推送到NuGet服务器。
  2. 然后,发布过程使用SqlPackage.exe实用程序为发布环境生成更新脚本,并将其作为工件添加到发行版中。
  3. 以前使用SQLCMD.exe实用程序在下一步中执行的脚本。

创建和执行步骤的这种分离使我们有可能在两者之间进行手动步骤,以便有人在Live环境中执行脚本之前进行验证,更不用说,在发布中保存为工件的脚本始终可以参考,在任何以后。

是否有需求我会提供更多细节和步骤脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM