在msbuild / deploy期间在ci中设置连接字符串的正确方法

时间:2015-08-17 20:41:20

标签: .net msbuild continuous-integration msdeploy

我有一个CI服务器(Bamboo,但我不认为这很重要)构建和自动部署我的应用程序。在本地开发期间,我使用localdb(<connectionStrings>中的web.config节点)

    <add name="MyApp" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\v11.0;Integrated Security=True;Connect Timeout=30;Initial Catalog=MyApp" />
    <add name="MyApp_Patients" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\v11.0;Integrated Security=True;Connect Timeout=30;Initial Catalog=AppleHms_MyApp" />
    ...

部署时显然不应该使用它。它应该使用我的部署sql server连接字符串。

我知道我可以为此编写一个web.config转换,我甚至知道我可以加密web.config,但我不确定db连接字符串应该如何正确地进入。对我来说有意义的是CI服务器覆盖每个connectionString - 所以我的配置转换应该看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="MyApp" providerName="System.Data.SqlClient" connectionString="${main-db-connectionstring}"  xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
    <add name="MyApp_Patients" providerName="System.Data.SqlClient" connectionString="${patients-db-connectionstring}"  xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
    ...
  </connectionStrings>
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>
</configuration>

覆盖来自我的ci服务器中的变量(可能是msbuild或部署的某些部分)?

这是正确的,这是&#34;对&#34;这样做的方式?我究竟要与msbuild / deploy做些什么来实现这一目标?

2 个答案:

答案 0 :(得分:6)

我们也使用竹子进行CI和部署,我们正在做的是:

  • 包含默认Parameters.xml作为msdeploy参数声明文件的包项目。
  • 维护我们各种环境的SetParameters.xml文件。
  • 每晚打造包装项目。
  • 发布夜间包装作为竹制文物。
  • 在部署特定的每晚构建时,使用msdeploy对这些包应用参数化。

基本上与msdeploy相关的部署如下:

msdeploy
  -verb:sync  
  -source:package="NightlyPackage.zip"  
  -dest:iisApp="YourIISHost/YourIISSite"  
  -declareParamFile="YourEnvironementSetParameters.xml"

每个项目包的Parameters.xml如下所示:

<parameters>
    <parameter
       name="ConnectionString1-Web.config Connection String"  
       description=""  
       defaultValue="localhost">
          <parameterEntry  
             kind="XmlFile"  
             scope="\\web.config$"  
             match="/configuration/connectionStrings/add[@name='ConnectionString1']/@connectionString"  
           />
    </parameter>
 </parameters>

其中ConnectionString1是connectionString的名称。

您的YourEnvironementSetParameters.xml如下所示:

<parameters>
  <setParameter name="ConnectionString1-Web.config Connection String" value="Your parametrized connection string value " />
</parameters> 

使用webdeploy在某些字段上使用参数化时存在约定。关注连接字符串,因此在引用web.config连接字符串时,最好遵守以下参数命名:

%NameOfYourConnectionStringAsInWebConfig%-Web.config Connection String

答案 1 :(得分:2)

使用XMLPoke任务将是通过MSBuild脚本

执行此操作的正确方法

XMLPoke on MSDN

另外,为了获得非常好的参考,请查看Sayed Ibrahim Hashimi blog,始终提供帮助