【问题标题】:Proper way to set connection strings in ci during msbuild/deploy在 msbuild/deploy 期间在 ci 中设置连接字符串的正确方法
【发布时间】:2015-08-17 20:41:20
【问题描述】:

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

    <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 或 deploy 的某些部分)?

这是正确的“正确”方式吗?究竟我与 msbuild/deploy 有什么关系才能做到这一点?

【问题讨论】:

    标签: .net msbuild continuous-integration msdeploy


    【解决方案1】:

    我们也在使用竹子进行 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 是连接字符串的名称。

    您的 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
    

    【讨论】:

    • 感谢科雷什!如果参数来自文件,那么您是在将带有密码的文件检查到源代码控制中,不是吗?
    • 不,我们使用 SSPI 连接字符串。
    • 感谢这个答案的彻底性,特别是关于约定的文章,我不知道。改用这些约定解决了一个让我抓狂的部署问题!
    【解决方案2】:

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

    XMLPoke on MSDN

    还要获得一个非常好的参考,检查Sayed Ibrahim Hashimi blog,总是有帮助的

    【讨论】:

    • 谢谢 - 你能举例说明 msdeploy 或 msbuild 命令的外观吗?我将如何从命令行传入一个值?我对(几乎毫无价值的)文档和(更有帮助的)链接博客的阅读是它必须存储在 csproj 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多