Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CI服务器的自动部署_C#_Wpf_Msbuild_Teamcity_Nant - Fatal编程技术网

C# 使用CI服务器的自动部署

C# 使用CI服务器的自动部署,c#,wpf,msbuild,teamcity,nant,C#,Wpf,Msbuild,Teamcity,Nant,在我们的项目中,部署总是一件痛苦的事情,主要是因为发布管理团队所犯的错误。要么他们把配置搞砸了,要么不知何故安装了错误的版本。我们使用teamcity作为CI服务器,它以zip文件(dll和exe)的形式生成工件,这些文件通常传递给发布团队。我的问题是,有没有一种方法可以自动化整个部署过程 是否有支持这一点的商业工具 我们将要执行以下操作: 使用特定于环境的值更新配置文件 将windows服务安装到服务器 将UI(WPF)包上载到集中位置(由另一个应用程序(类似于启动器)拉下来) 更改数据库连

在我们的项目中,部署总是一件痛苦的事情,主要是因为发布管理团队所犯的错误。要么他们把配置搞砸了,要么不知何故安装了错误的版本。我们使用teamcity作为CI服务器,它以zip文件(dll和exe)的形式生成工件,这些文件通常传递给发布团队。我的问题是,有没有一种方法可以自动化整个部署过程

是否有支持这一点的商业工具

我们将要执行以下操作:

  • 使用特定于环境的值更新配置文件

  • 将windows服务安装到服务器

  • 将UI(WPF)包上载到集中位置(由另一个应用程序(类似于启动器)拉下来)

  • 更改数据库连接字符串

针对各种环境(如int、uat和prod)执行上述所有操作

由于DB部署本身是一个独立的beast,因此不需要在本文中介绍

任何最佳实践、工具或解决方案都将非常有用

谢谢,
-Mike

我们的发布团队使用Anthill Pro-这也可以执行CI,但他们只是使用它来部署包(在我们的案例中,主要是网站代码)。 Anthill最酷的地方是整个客户机(代理)-服务器设置,因此它可以通过防火墙、NAT等进行一些工作。它具有审批和调度工作流

就配置而言,这是一个不同的野兽-不幸的是,开发人员和发布团队都必须更改这些,并以某种方式合并结果。考虑要添加新配置密钥,但释放团队必须为DB连接添加生产设置。诀窍是开发人员不应该知道生产数据库连接字符串。
所以这不是自动化的(无论如何,在我们的情况下)。

我偏爱TeamCity,这是一款Jetbrains产品,一家制造基本重拾器的公司(不,我不为他们工作,祝你好运)。至少在我上次检查时,TeamCity是一款免费产品,最多可供20名用户和20种构建配置使用。它有一些很好的自动构建功能。非常好,真的。

你提到一个商业工具

TFS,特别是TeamBuild,完全支持构建和部署代码。每当我们构建一个web应用程序时,它就会自动部署到我们的开发和QA服务器上。部署之后,我们让它运行一套web测试,以确保一切正常。然后真正的乐趣从我们的QA团队开始;)


虽然我们不会自动部署到生产环境,但我们当然也可以这样做。

我已经将TeamCity用于一些相当大的项目,并且除了数据库之外,我还自动化了部署的各个方面。我在每个项目中使用的主要步骤是:

  • 在生产服务器上安装TeamCity代理
  • 让构建从源代码管理中获取所有信息(您的源代码管理中的所有信息都正确吗?)
  • 有一个构建步骤,用于构建和发布您的解决方案。这可以通过向MSBuild调用添加以下命令行参数来实现:

    /p:Configuration=[您的配置];DeployOnBuild=True;PackageAsSingleFile=False

    您发布的文件(和转换的配置文件)将写入以下目录:

    [您的项目目录]\obj\[您的配置]\Package\PackageTmp

  • 使用脚本语言(在我的例子中是Powershell)将发布的工件复制到部署目录,并进行您提到的特定于环境的更改。例如,提取档案、复制文件、启动/停止网站等

  • 运行任何自动测试(如nUnit、Selenium等)

  • 我发现最好的策略是让.Net后期构建事件调用适当的powershell脚本,并传入相关细节,如解决方案路径和配置名称(或者,我也让TeamCity将环境名称传递给powershell脚本),以便它知道需要做什么(例如,登台、生产等)。您应该发现,像Powershell这样的脚本语言可以做一个人所能做的所有事情(大约快100倍,100%可靠)

    Powershell上有太多的内容,你可以用谷歌搜索你需要在Powershell中做的任何事情,你会得到一个例子。例如,“powershell部署WPF”、“powershell上载FTP”等

    在以前的一份工作中,我需要远程部署windows服务,我发现经过足够的研究,我能够让服务的MSI卸载现有服务,并完全以静默方式安装新服务(即没有对话框)。这将对您寻求自动化有很大帮助。如果你愿意,我可以详细说明

    下面是我通常使用的Powershell后期生成脚本示例:

    请注意我是如何使用一些默认参数值的,这样我就可以直接从Powershell编辑器执行脚本,在本地计算机上模拟和测试不同的配置

    param(
    [string]$configurationName=“调试”,
    [string]$sourceDirectory=“C:\SVN\”)
    设置StrictMode-v最新版本
    $ErrorActionPreference=“停止”
    #加载所需的函数
    $private:scriptFolder=&{(拆分路径$MyInvocation.ScriptName-Parent)}
    . (加入路径$scriptFolder DebugBuild.ps1)
    . (加入路径$scriptFolder StagingBuild.ps1)
    . (加入路径$scriptFolder ProductionBuild.ps1)
    . (连接路径$scriptFolder CommonBuildFunctions.ps1)
    #执行适当的构建
    交换机($configurationName){
    “调试”{RunDebugBuild$sourceDirectory}
    “暂存”{RunStagingBuild$sourceDirectory}
    “生产”{RunReleaseBuild$sourceDirectory}
    }
    

    为了在开发机器上执行发布,我为提交给SVN的解决方案设置了VS发布配置文件,以便其他开发人员可以使用它。此配置文件直接发布到本地部署目录。

    除了CI和
    param(
        [string]$configurationName="Debug",
        [string]$sourceDirectory="C:\SVN\<Your local solution location>")
    Set-StrictMode -v latest
    $ErrorActionPreference = "Stop"
    
    # Load required functions
    $private:scriptFolder = & { (Split-Path $MyInvocation.ScriptName -Parent) }
    . (Join-Path $scriptFolder DebugBuild.ps1)
    . (Join-Path $scriptFolder StagingBuild.ps1)
    . (Join-Path $scriptFolder ProductionBuild.ps1)
    . (Join-Path $scriptFolder CommonBuildFunctions.ps1)
    
    #Execute appropriate build
    switch ($configurationName) {
        "Debug" { RunDebugBuild $sourceDirectory }
        "Staging" { RunStagingBuild $sourceDirectory }
        "Production" { RunReleaseBuild $sourceDirectory }
    }
    
    <PropertyGroup>
        <EnvironmentAppConfig>App.config.$(Configuration)</EnvironmentAppConfig>
    </PropertyGroup>
    
    <Target Name="ReplaceAppConfig">
        <Message    Condition="Exists('$(ProjectDir)$(EnvironmentAppConfig)')" 
                    Text="Copying $(EnvironmentAppConfig) -> App.config" Importance="high" />
    
        <Message    Condition="!Exists('$(ProjectDir)$(EnvironmentAppConfig)')"
                    Text="No $(EnvironmentAppConfig) found. Leaving App.config as is." Importance="high" />
    
        <Copy   SourceFiles="$(ProjectDir)$(EnvironmentAppConfig)"
                DestinationFiles="$(ProjectDir)App.config"
                Condition="Exists('$(ProjectDir)$(EnvironmentAppConfig)')" />
    
    </Target>