使用Transforms

时间:2017-01-22 17:56:14

标签: c# tfs webdeploy

TFS 2015,vNext构建过程(不是xaml)

我正在尝试自动化MVC Web应用程序的部署过程。它将部署的服务器具有不同的SQL连接字符串。所以我当前的部署是手动将web.config文件复制到web.config.save,使用WebDeploy部署新版本,然后转到旧的web.config.save文件并复制连接字符串。我现在的规模已经达到了不可持续的程度。所以我需要进一步自动化这个过程。我有TFS自动构建和部署到我的测试服务器(它也有一个不同的连接字符串,所以这是一个很好的测试)。在“发布”属性中,我尝试取消选中“发布 - 设置 - 数据库”部分中的“在运行时使用此连接字符串(更新目标web.config)”复选框,然后再次在项目中检入TFS。但是在部署时,web.config采用默认设置。我不想删除此设置,因为我想在那里安装新的安装默认连接字符串。

我可以编写一个xml传输程序来保存当前连接字符串,然后在完成时重写。但我认为必须有一种方法可以用当前的工具集来做到这一点,为什么尝试重新发明轮子?

我开始使用转换的路径。所以我在VS2015中创建了一个web.config.release,然后将其添加到web.config.release文件中:

<connectionStrings>
   <add xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" name="AppEntities"       connectionString="metadata=res://*/Models.DBName.csdl|res://*/Models.DBName.ssdl|res://*/Models.DBName.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLExpress;initial catalog=DBName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

那么,有没有人知道如果只在当前的web.config中不存在用于部署的SQL连接字符串更新?

1 个答案:

答案 0 :(得分:1)

我在TFS 2015 vNext版本中获得了这方面的经验, 在2016年第二季度,我们分配了一名Dev Ops人员,他非常擅长PowerShell,并且他拥有构建和部署流程的所有权。他提出的一些事情是一个后期构建脚本。

现在回答您的问题:对于我们来说,Post-Build脚本将执行部署部分,作为部署的一部分,您将更新web.config中的连接字符串。现在,这将要求团队中的某些人使用PowerShell变得非常好。

现在我要做的是在原始文件中写一个特殊的单词,比如&#34; {ConStringHere}&#34;,并用Powershell脚本替换它,这样你只会替换它一次

请参阅此处如何验证文件是否包含单词并使用PowerShell替换它: Powershell, using contains to check if files contain a certain word

我将重点介绍这种方法遇到的一些好处:

  • 您不需要解决方案,项目和类来修改某些文件。大多数构建后的文件修改可以使用line或2在powershell中完成。
  • 您可以在TFS中保留powershell脚本,保留更改的历史记录和注释。
  • 您可以将特殊值(连接字符串,用户,密码)定义为构建变量,这些变量比项目中的硬编码值更容易更改且安全性更高。
  • 每个环境可以有多个脚本。理想情况下,每个环境的所有脚本应该几乎相同,但是在生产中,您可以发布到2个不同的服务器,因此您需要两次调用一行。
  • 您可以节省开发人员的时间,因为维护PowerShell的人不一定是一个完整的堆栈开发人员。