【问题标题】:Winforms ConnectionString and TeamCityWinforms ConnectionString 和 TeamCity
【发布时间】:2014-06-09 06:55:29
【问题描述】:


我们正在启动一个新的 WinForms 项目,并决定使用 TeamCity 来创建构建并运行单元和集成测试。该项目处理数据库。我们有 3 个数据库(developDB(开发人员在开发时使用 =))、testDB(teamcity 用于运行测试)和 productionDB(客户端使用))。 TeamCity 有 3 个 buildConfiguration。第一个在提交发生时触发。第二个每天晚上触发以运行集成测试。第三个是由开发人员在我们发布什么时触发的。所以我希望 TeamCity 能够根据发生的构建类型来更改 connectionString。另外我不想将 connectionString 存储在 app.config 中(我不想让客户端知道用户名和密码)。有哪些选项可用于执行任务?
提前致谢!
已更新
如果重要,我会使用 NHibernate 和 FluentNHibernate 连接到数据库。

【问题讨论】:

    标签: winforms continuous-integration teamcity


    【解决方案1】:

    在这种情况下,我会使用 TeamCity 运行一个 nant 脚本来执行构建。

    NAnt 允许您在构建时修改配置文件值(例如您的连接字符串)。

    可以在此博客文章中找到使用 TeamCity/NAnt 部署到不同暂存环境的示例: http://thecodedecanter.wordpress.com/2010/03/25/one-click-website-deployment-using-teamcity-nant-git-and-powershell/

    正如@surfen 建议的那样,每个环境的连接字符串值都应该加密,以防止凭据以纯文本形式存储。

    【讨论】:

    • 投反对票的人 - 请添加评论以解释为什么您对接受的答案投了反对票?
    【解决方案2】:

    我没有使用过 TeamCity,但我已经编写了多个在登录过程中(即运行时)动态更改 ConnectionStrings 的应用程序,而且非常简单。

    你没有告诉你如何连接到你的数据库。既然您提到了 app.config,我想它是 ADO.NET DataSets 或类似技术,它在您的 Settings.Designer.cs / app.config 中创建一个 只读(getter) ConnectionString。

    我所做的是在 Settings.cs(不是 Settings.Designer.cs)中为 ConnectionString 属性创建一个 setter 方法,如下所示:

    public void setNorthwindConnectionString(String value) {
        this["NorthwindConnectionString"] = value;
    }
    

    然后我生成的 DataSet 使用这个 NorthwindConnectionString 来访问数据。

    您可以使用预处理器指令来条件设置您的 ConnectionString:

    #if DEBUG
        Console.WriteLine("Mode=Debug"); 
        Settings.Default.setNorthwindConnectionString("(DebugDBConnectionString)");
    #else
        Console.WriteLine("Mode=Release"); 
        Settings.Default.setNorthwindConnectionString("(ReleaseDBConnectionString)");
    #endif
    

    您也可以encrypt your connection strings,并在构建后事件期间复制正确的 app.config。

    【讨论】:

      【解决方案3】:

      我假设您将使用 msbuild 在 Team city 中构建您的项目。如果是这种情况,那么您可以发送条件编译符号,您可以在其中传递您需要的任何符号。

      获得符号后,您可以执行以下操作:

      #if DEVBUILD
      //.... Your Connection String Code here
      #endif
      
      #if INTBUILD
      .... Your Connection String Code here
      #endif
      

      这是您第一个问题的答案。

      看看你问题的第二部分,你不想在 app.config 中存储用户名和密码,

      选项:

      • 尝试集成安全性,它将使用您的域帐户
      • 如果无法使用选项,请尝试将连接字符串保留为注册表项,使其不明显或环境变量。

      【讨论】:

        猜你喜欢
        • 2013-11-29
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 2010-10-19
        • 2010-11-22
        • 2013-02-23
        • 2012-12-10
        • 1970-01-01
        相关资源
        最近更新 更多