使用TeamCity做持续集成

Posted by Tesla9527 on June 11, 2016

在以前公司的时候,同事有用TeamCity来做C/S架构app的持续集成,现在公司做的web项目,也考虑用TeamCity来做持续集成,于是花了好几天的时间在网上找资料,不断地尝试,终于把整个流程都跑通了,现在就把各个步骤总结下来。

Configuration和build step的层次结构如下:

-. Configuration:Build and package web app

1
2
3
Build step: Build solution(编译Project)

Build step: Publish and package (将Project发布,并将发布之后的文件打包)

-. Configuration: Replace web.config and deploy web app

1
2
3
4
5
6
7
8
9
10
11
Build step: Replace connectionString in web.config(替换连接字符串)

Build step: Stop-WebAppPool(停掉应用程序池)

Build step: Stop-Website(停掉站点)

Build step: Deploy web app to server(用来将最终的文件同步到server上)

Build step: Start-Website(开启站点)

Build step: Start-WebAppPool(开启应用程序池)

接下来对每一个build step进行分析:

Build solution

img

这一步会将source code拿到TeamCity的一个work directory,并完成编译。

Publish and package

img

Build file path中填写的文件是publish app时使用的配置文件,我用的是David Wilson文件, 代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Transform"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Publish">
<Message Text="Configuration: $(Configuration)" />
<!-- Platform=Any Cpu for Solution Files, Platform=AnyCpu for project files-->
<MSBuild Projects="$(Projects)"
         Properties="Platform=AnyCPU;
                     Configuration=$(Configuration);
                     AutoParameterizationWebConfigConnectionStrings=False;
                     DeployOnBuild=True;
                     DeployTarget=Package;
                     PackageLocation=_package;
                     PackageAsSingleFile=False;"/>
</Target>
</Project>

这一步完成后会在obj/Release/Package/PackageTmp 中生成publish完了之后的文件,这个时候我们将IIS的站点的物理地址指向这里,就完全可以运行起来了。但我们还需要对web.config文件做一些修改,所以暂时我们将生成的相关文件打包好,在下一个configuration中再去修改和部署。

打包发布出来的文件: img

Replace web.config

首先我们需要在这个configuration中添加对上一个configuration的Artifacts的依赖。 img

这里用的PowerShell来执行连接字符串的替换:

1
2
3
4
5
6
$connectionString = "Data Source=shaappt0001;Initial Catalog=Demo.Test;Persist Security Info=true;User ID=YourAccount;PWD=YourPassword;Packet Size=4096;"
$webConfigPath = "%teamcity.build.workingDir%\Demo.Test\web.config"
$xml = [xml](get-content $webConfigPath)
$root = $xml.get_DocumentElement();
$root.connectionStrings.add.connectionString = $connectionString
$xml.Save($webConfigPath)

Stop-WebAppPool

img

1
Stop-WebAppPool -Name "Demo.Test"

Stop-Website

img

1
Stop-Website "Demo.Test"

Deploy web app to server

img

1
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:contentPath="%teamcity.build.workingDir%\%env.PackagePath%\" -dest:contentPath="%env.DestinationSite%"

Note:记住在填入这个脚本的时候一定不要在里面换行,要不然TeamCity可能会不认识,导致编译不通过。

环境变量的设置: img

Start-Website

img

1
Start-Website "Demo.Test"

Start-WebAppPool

img

1
2
3
4
5
6
7
8
9
10
11
12
for($i=1; $i -le 10; $i++)
{
    Start-WebAppPool -name "Demo.Test";
    if((get-WebAppPoolState -name "Demo.Test").Value -eq "Started")
    {
        break;
    }
    else
    {
       Start-Sleep -s 30;
    }     
}