使用CI服务器进行自动部署

Mik*_*ike 12 c# msbuild nant wpf teamcity

在我们的项目中,部署总是很痛苦,主要是因为发布管理团队所犯的错误.他们搞砸了配置或以某种方式安装了错误的版本.我们使用teamcity作为我们的CI服务器,它生成工件作为zip文件(dll和exe),通常传递给发布团队.我的问题是,有没有办法自动化整个部署过程?

有没有商业工具,支持这个?

我们希望执行以下操作:

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

  • 将Windows服务安装到服务器.

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

  • 更改数据库连接字符串.

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

数据库部署因此是一个单独的野兽,因此不需要涉及.

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

谢谢,-Mike

Bri*_*hey 9

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

  1. 获取在生产服务器上安装的TeamCity代理
  2. 让构建从源代码控制中获取所有内容(您确实拥有源代码管理中的所有内容吗?).
  3. 有一个构建步骤来构建和发布您的解决方案.这可以通过向MSBuild调用添加以下命令行参数来实现:

    / p:Configuration = [Your Config]; DeployOnBuild = True; PackageAsSingleFile = False

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

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

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

  5. 运行任何自动化测试(例如nUnit,Selenium等......)

我发现最好的策略是有一个.Net post-build事件,它调用相应的PowerShell脚本传递相关的细节,比如解决方案路径和配置名称(或者,我也让TeamCity将环境名称传递给Powershell脚本)所以它知道它需要做什么(例如,分期,生产等......).您应该会发现像Powershell这样的脚本语言可以完成一个人可以做的所有事情(大约快100倍,100%可靠).

Powershell上有很多内容,你可以在Powershell中搜索你需要做的任何事情,你会得到一个例子.例如"powershell部署WPF","powershell上传FTP"等......

在之前的工作中,我需要远程部署Windows服务,我发现通过足够的研究,我能够获得服务的MSI来卸载现有服务并完全安静地安装新服务(即没有对话框).这将有助于您实现自动化.如果你愿意,我可以详细说明.

下面是我通常使用的Powershell post构建脚本的示例:

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

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 }
}
Run Code Online (Sandbox Code Playgroud)

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