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

Geo*_*uer 5 .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" />
    ...
Run Code Online (Sandbox Code Playgroud)

部署时显然不应该使用它.它应该使用我的部署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>
Run Code Online (Sandbox Code Playgroud)

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

这是正确的,这是"正确的"这样做的方式吗?究竟我与msbuild/deploy有什么关系才能实现这一目标?

Joh*_*lip 6

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

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

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

msdeploy
  -verb:sync  
  -source:package="NightlyPackage.zip"  
  -dest:iisApp="YourIISHost/YourIISSite"  
  -declareParamFile="YourEnvironementSetParameters.xml"
Run Code Online (Sandbox Code Playgroud)

每个项目包的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>
Run Code Online (Sandbox Code Playgroud)

ConnectionString1connectionString的名称在哪里.

您的YourEnvironementSetParameters.xml如下所示:

<parameters>
  <setParameter name="ConnectionString1-Web.config Connection String" value="Your parametrized connection string value " />
</parameters> 
Run Code Online (Sandbox Code Playgroud)

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

%NameOfYourConnectionStringAsInWebConfig%-Web.config Connection String
Run Code Online (Sandbox Code Playgroud)


Tot*_*tem 2

使用 XMLPoke 任务是通过 MSBuild 脚本执行此操作的正确方法

MSDN 上的 XMLPoke

另外,要获得非常好的参考,请查看Sayed Ibrahim Hashimi 博客,总是有帮助的