所以我正处于开发持续集成实践的阵痛中。我们是.Net / MSSQL商店。我们很快就会参加VS2012。我们已经确定了CruiseControl.Net用于CI服务器,使用msbuild编译我们的项目。我们使用SVN(稍后可能切换到Git,但这是另一个讨论)来进行源代码控制。我倾向于使用InstallShield将代码包(通常是Web应用程序和/或批量可执行文件)部署到我们的QA和生产服务器。 (CCNet将构建这些MSI作为我们CI的一部分。)我们也开始在我们的项目中包含单元测试,并将使用与CCNet集成的NUnit在办理登机手续时自动运行。
到目前为止,这适用于我们的标准Web app / exe开发。它不适合(还)适用于我们的MSSQL变更管理,或缺乏。我们如何做到这一点真是牛仔。有些人使用过Migrator.Net。其他人只是与Redgate进行SQL比较并生成脚本。还有一些人有手写的sql脚本。它可能在SVN中,也可能不在。数据库级别的“源代码管理”基本上是“我们备份了数据库”。 Boo,嘶嘶声。毋庸置疑,如果我们希望与我们的CI和我们的部署保持一致,我们需要解决某些问题。到目前为止,我倾向于使用VS SQL项目来处理变更管理和部署。
注意:我们(开发人员)不应该推动更改。系统管理员这样做。所以我们无法运行任何东西来部署代码或sql。
所以,要解决2个问题(我认为):
使用什么“技术”,以便我们的CI服务器吹走数据库的CI版本,以便可以针对它测试单元测试。我已经确定VS2012 SQL项目可以做到这一点。 CCNet可以针对db项目运行msbuild,db项目将重新创建数据库。这很容易。
如何为QA和prod环境生成更改脚本?这个我坚持下去。
VS可以进行模式比较,然后生成sql脚本 - 但它依赖于sqlcmd。所以我们的系统管理员必须从命令提示符运行sqlcmd来部署它...可能不太理想。正确?
我可以再次运行msbuild来部署...但是我不希望重新创建数据库,我只想要部署更改。
那么这里有什么选择?我需要一些自包含的东西供管理员运行 - 并签入SVN。我应该为数据库部署制作另一个msi吗? CCNet / msbuild可以为数据库更改(而不是重新创建)制作一些其他类型的“部署包”,系统管理员可以双击它们吗?
你们如何处理这个问题?
由于 汤姆
答案 0 :(得分:3)
查看SQL Server Data Tools package from the Microsoft site。
这将注册一个新的SQL Server 2012数据库类型项目,以包含所有数据库结构的定义。在构建时,这将生成一个可用于部署数据库的创建脚本。
然后,要升级数据库,请使用SQLPACKAGE.EXE工具,使用create script和target database server name生成Update.sql脚本。
更新:关于你如何运行单元测试的问题,你可以创建补充方法,通过启动进程并将路径传递给输出create.sql脚本来调用创建脚本,然后让你的测试'拆除'数据库使用相同的方法,但使用drop database语句。