C# 使用CI服务器的自动部署
在我们的项目中,部署总是一件痛苦的事情,主要是因为发布管理团队所犯的错误。要么他们把配置搞砸了,要么不知何故安装了错误的版本。我们使用teamcity作为CI服务器,它以zip文件(dll和exe)的形式生成工件,这些文件通常传递给发布团队。我的问题是,有没有一种方法可以自动化整个部署过程 是否有支持这一点的商业工具 我们将要执行以下操作:C# 使用CI服务器的自动部署,c#,wpf,msbuild,teamcity,nant,C#,Wpf,Msbuild,Teamcity,Nant,在我们的项目中,部署总是一件痛苦的事情,主要是因为发布管理团队所犯的错误。要么他们把配置搞砸了,要么不知何故安装了错误的版本。我们使用teamcity作为CI服务器,它以zip文件(dll和exe)的形式生成工件,这些文件通常传递给发布团队。我的问题是,有没有一种方法可以自动化整个部署过程 是否有支持这一点的商业工具 我们将要执行以下操作: 使用特定于环境的值更新配置文件 将windows服务安装到服务器 将UI(WPF)包上载到集中位置(由另一个应用程序(类似于启动器)拉下来) 更改数据库连
- 使用特定于环境的值更新配置文件
- 将windows服务安装到服务器
- 将UI(WPF)包上载到集中位置(由另一个应用程序(类似于启动器)拉下来)
- 更改数据库连接字符串
-Mike我们的发布团队使用Anthill Pro-这也可以执行CI,但他们只是使用它来部署包(在我们的案例中,主要是网站代码)。 Anthill最酷的地方是整个客户机(代理)-服务器设置,因此它可以通过防火墙、NAT等进行一些工作。它具有审批和调度工作流 就配置而言,这是一个不同的野兽-不幸的是,开发人员和发布团队都必须更改这些,并以某种方式合并结果。考虑要添加新配置密钥,但释放团队必须为DB连接添加生产设置。诀窍是开发人员不应该知道生产数据库连接字符串。
所以这不是自动化的(无论如何,在我们的情况下)。我偏爱TeamCity,这是一款Jetbrains产品,一家制造基本重拾器的公司(不,我不为他们工作,祝你好运)。至少在我上次检查时,TeamCity是一款免费产品,最多可供20名用户和20种构建配置使用。它有一些很好的自动构建功能。非常好,真的。你提到一个商业工具 TFS,特别是TeamBuild,完全支持构建和部署代码。每当我们构建一个web应用程序时,它就会自动部署到我们的开发和QA服务器上。部署之后,我们让它运行一套web测试,以确保一切正常。然后真正的乐趣从我们的QA团队开始;)
虽然我们不会自动部署到生产环境,但我们当然也可以这样做。我已经将TeamCity用于一些相当大的项目,并且除了数据库之外,我还自动化了部署的各个方面。我在每个项目中使用的主要步骤是:
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>