8장 CruiseControl.NET

이재홍 http://www.pyrasis.com 2007.10.27 ~ 2008.04.20

목차

들어가기

이번에는 CruiseControl.NET을 이용한 자동 빌드 시스템을 구성해 보겠습니다. 개발 환경은 Visual Studio 2005를 기준으로 하고, Visual Studio에서 윈도우 응용프로그램을 개발하는 것을 예로 들겠습니다(Visual Studio 6.0은 부록 참고).

자동 빌드 시스템과 연동할 기능들은 다음과 같습니다.

  • 자동 버전 업데이트 스크립트
  • Trac에 자동으로 버전 등록하기
  • Symbol Server, Subversion Symbol Indexing 연동
  • 파일 릴리스 연동

5장의 실제로 “CruiseControl.NET으로 빌드 자동화하기”에서 CruiseControl.NET의 Web DashBoard를 사용해 보았습니다. 여기서 주의할 점은 Trac 서버를 http(80번 포트)로 설정하였을 때, CruiseControl.NET의 Web DashBoard를 사용할 수 없습니다. Web DashBoard는 IIS 웹 서버에서 실행되고 IIS도 80번 포트를 사용하기 때문입니다. 따라서 IIS 웹 서버가 사용하는 포트를 바꾸어 주어야 합니다. 단 Trac 서버를 https(443번 포트)로 설정하였다면 IIS 웹 서버의 포트는 바꿀 필요가 없습니다.

IIS 서버의 포트를 바꾸려면 제어판 → 관리 도구 → 인터넷 정보 서비스를 실행합니다. 아래와 같이 기본 웹 사이트를 선택하고 마우스 오른쪽 버튼을 누른 뒤 속성을 선택합니다.


그림 8-1 인터넷 정보 서비스의 기본 웹사이트

TCP 포트(T)에 8000을 입력합니다. 꼭 8000이 아니라도 됩니다. 80번만 아니면 됩니다.


그림 8-2 포트 설정

기본 프로젝트 설정

4장의 “Subversion과 Symbol 파일 연동”, 5장의 “CruiseControl.NET으로 빌드 자동화하기”에서 만들었던 example 프로젝트를 그대로 사용하겠습니다. 체크아웃한 프로젝트 디렉터리의 위치는 C:\build\example입니다.

지금 설정하고 있는 PC는 지금부터 빌드 서버로 사용 될 것입니다. 그렇기 때문에 C:\build\example안에 파일들은 사람이 직접 수정하면 안됩니다. CruiseControl.NET이 소스를 업데이트하고, 버전을 올리고 빌드를 할 것입니다. 사용자는 각자 PC에서 CCTray를 이용하여 빌드 명령만 내려주면 됩니다.

프로젝트에 버전 리소스 추가하기

example 프로젝트는 아주 간단한 콘솔 프로젝트였습니다. 자동 버전 업데이트 스크립트를 사용하기 위해서는 프로젝트에 리소스 파일(.rc) 파일과 버전 정보가 있어야 합니다. C:\build\example\example.sln을 Visual Studio 2005에서 엽니다. 기존에 작업하던 제품들은 리소스 파일(.rc)과 버전 정보가 있을 것입니다.

  1. 왼쪽 Solution Explorer에서 Resource Files를 선택하고 마우스 오른쪽 버튼을 눌러 팝업 메뉴를 띄우고, Add → Resource…을 선택합니다.


    그림 8-3 Visual Studio 2005에서 리소스 추가 방법

  2. example.rc 파일이 생겼습니다. Version을 선택하고 New 버튼을 누릅니다.


    그림 8-4 Visual Studio 2005에서 리소스 추가 화면

  3. 이제 버전 정보가 생겼습니다. 모두 저장하고 Visual Studio 2005를 닫습니다.


    그림 8-5 버전 리소스가 추가된 화면

  4. 탐색기를 열고 C:\Build\example\example로 이동 한 후 TortoiseSVN을 이용하여 example.rc, resource.h 파일을 추가합니다. example.aps 파일은 추가하지 않습니다. 이 파일은 현재 리소스 번호를 저장하고 있는 임시 파일입니다. 물론 example.vcproj.EXPERIENCE.xp.user 파일도 추가하지 않습니다. 이 파일은 사용자가 어떤 파일을 열었는지 저장하고 있는 임시 파일입니다. 이 파일들이 없더라도 Visual Studio 2005에서 솔루션을 열면 다시 생깁니다.


    그림 8-6 example.rc, resource.h 추가

  5. example.rc, resource.h 파일이 선택되었습니다. 확인을 누릅니다.


    그림 8-7 추가할 파일 선택

  6. C:\build\example\example 디렉터리에서 SVN 커밋(C)…를 실행하여 커밋합니다.


    그림 8-8 추가된 파일을 커밋

TIP
"커밋 로그와 티켓 연동" 부분에서 C:\Repos\example\hooks\pre-commit.cmd에 trac-pre-commit-hook을 설정하였다면 커밋 로그에 열린 티켓 번호를 적지 않으면 커밋이 되지 않을 것입니다. 임시로 티켓을 하나 만들거나, 이 부분을 사용하지 않도록 설정합니다. 이 기능을 사용하지 않으려면 pre-commit.cmd의 trac-pre-commit-hook 부분의 맨 앞에 REM을 붙이면 됩니다.
REM %PYTHON% %TOOLS_DIR%\trac-pre-commit-hook %TRAC_ENV% "file:%LOG_FILE%"

프로젝트의 저장소 주소 설정하기

example 프로젝트의 저장소 주소는 svn://127.0.0.1/example/trunk가 아닌 http://192.168.1.100/svn/example/trunk로 변경합니다. 192.168.1.100은 필자가 Trac, CruiseControl.NET을 설치한 서버 IP입니다. 독자들은 독자들의 서버 IP로 지정합니다. 도메인을 연결하였다면 도메인으로 지정합니다.

http://example.com/svn/example/trunk (https를 사용한다면, https://localhost/svn/example/trunk)

TIP
여기서 저장소 주소를 http://localhost/svn/example/trunk로 지정하면 안됩니다. 나중에 Subversion Indexing을 했을 때 저장소 주소가 localhost로 되어 있으면, 이 서버가 아닌 개발자 PC에서는 Subversion 저장소 서버를 찾을 수 없기 때문에 소스를 받아 올 수 없게 됩니다.
  1. 탐색기의 C:\build\example에서 마우스 오른쪽 버튼을 눌러 팝업 메뉴를 띄웁니다. TortoiseSVN → 저장소 URL 변경(C)을 실행합니다.


    그림 8-9 저장소 URL 변경 실행 방법

  2. http://192.168.1.100/svn/example/trunk로 저장소 URL을 변경합니다.


    그림 8-10 변경할 저장소 URL 설정

빌드 스크립트는 “CruiseControl.NET으로 빌드 자동화하기”에서 만들었던 것을 그대로 사용합니다. <webURL> 부분이 추가되었는데, CCTray에서 각 프로젝트를 더블 클릭하였을 때 웹 브라우저에서 표시될 URL을 지정하는 것입니다. 앞에서 IIS 웹 서버의 포트를 8000으로 바꾸어 주었다면 http://192.168.1.100:8000/ccnet/server/local/project/example/ViewProjectReport.aspx으로 지정하고, 포트를 바꾸지 않았다면 http://192.168.1.100/ccnet/server/local/project/example/ViewProjectReport.aspx으로 지정합니다. URL에서 확인할 수 있듯이 URL에 example(프로젝트 이름)이 포함되어 있습니다. 나중에 새로운 프로젝트가 추가된다면 URL에서 프로젝트 이름 부분도 꼭 바꾸어 주어야 합니다.

앞에서 저장소 URL을 변경했으니 빌드 스크립트의 <trunkUrl> 부분도 http://192.168.1.100/svn/example/trunk로 변경합니다. 도메인을 연결하였다면 도메인으로 지정합니다.

http://example.com/svn/example/trunk (https를 사용한다면, https://192.168.1.100/svn/example/trunk)

Visual Studio는 기본적으로 4자리 버전 정보를 사용합니다. 따라서 <labeller><prefix> 부분도 1.0.0.으로 수정합니다.

C:\Program Files\CruiseControl.NET\server\ccnet.config

<cruisecontrol>
    <project name="example">
        <!-- example 프로젝트의 Web Dashboard 주소 -->
        <webURL>http://192.168.1.100:8000/ccnet/server/local/project/example/ViewProjectReport.aspx</webURL>

        <!-- 기본 레이블로 지정 -->
        <labeller type="defaultlabeller">
            <prefix>1.0.0.</prefix>
        </labeller>

        <!-- Subversion 저장소 주소 및 작업 디렉터리 설정 -->
        <sourcecontrol type="svn">
            <trunkUrl>http://192.168.1.100/svn/example/trunk</trunkUrl>
            <workingDirectory>C:\build\example</workingDirectory>
        </sourcecontrol>

        <!-- 매일 20:00에 자동 빌드 하도록 설정 -->
        <triggers>
            <scheduleTrigger time="20:00" buildCondition="ForceBuild" name="Scheduled" />
        </triggers>

        <tasks>
            <!-- Visual Studio 2005 빌드 설정 -->
            <devenv>
                <solutionfile>C:\build\example\example.sln</solutionfile>
                <configuration>Release</configuration>
            </devenv>
        </tasks>
    </project>
</cruisecontrol>

자동 버전 업데이트 스크립트

자동 버전 업데이트 스크립트는 PowerShell로 작성되어 있습니다. 리소스 파일(.rc)의 버전 정보 부분을 빌드 전에 증가시켜 주는 일을 합니다. 앞서 빌드 스크립트의 <prefix> 부분을 1.0.0.으로 지정해 주었습니다. 이 스크립트는 4자리 버전 정보의 가장 마지막 부분을 1.0.0.1과 같이 증가시켜 줍니다. 그래서 <prefix> 부분은 1.0.0.만 설정하는 것입니다.

CruiseControl.NET은 빌드 정보를 C:\Program Files\CruiseControl.NET\server 아래에 .state 파일로 저장합니다. example 프로젝트라면 example.state 파일에 모든 정보를 저장합니다. rcversion.ps1 스크립트는 이 .state 파일을 읽어서 버전을 증가시킵니다. 하지만, 한번도 빌드하지 않은 프로젝트는 .state 파일이 생성되어 있지 않기 때문에 버전 정보를 가져 올 수 없습니다. 따라서 최초 빌드 시에는 버전 정보가 0.0.0.0으로 되며, 그 이후 부터는 빌드 스크립트에서 설정한 버전인 1.0.0.2, 1.0.0.3…처럼 정상적으로 증가됩니다.

이제 빌드를 할 때마다 버전은 1.0.0.2, 1.0.0.3, 1.0.0.4와 같이 증가할 것입니다. 메이저, 마이너 버전이 올라갔다면 빌드 스크립트 상에서 2.0.0., 3.5.1.과 같이 지정해 주면 됩니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/rcversion.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

rcversion.ps1

# rcversion.ps1 <Project name> <Resource file Path>

if ($args.count -eq 0)
{
    "Usage: rcversion.ps1 <Project name> <Resourc file Path>"
    exit
}

$project = $args[0]
$rc_file_path = $args[1]
$ccnet_dir = "C:\Program Files\CruiseControl.NET\server\"

[xml]$state_file = get-content -path $ccnet_dir$project.state

if ($state_file.IntegrationResult.Label)
{
    $version = $state_file.IntegrationResult.Label.split(".")
    [int]$next_version = $version[3]

    if ($state_file.IntegrationResult.Status -match "Success")
    {
        $next_version++
    }

    $version_string = $version[0] + ", " + $version[1] + ", " + $version[2] + ", " + $next_version
}
else
{
    $version_string = "0, 0, 0, 0"
}

# Resource file Update.
$rc_file = get-content -path $rc_file_path
$rc_length = $rc_file.Length

for ($i = 0; $i -lt $rc_length; $i++)
{
    if ($rc_file[$i] -match " FILEVERSION ")
    {
        $rc_file[$i] = " FILEVERSION "+$version_string
        echo "File Version Updated"
    }

    if ($rc_file[$i] -match "            VALUE `"FileVersion`", ")
    {
        $rc_file[$i] = "            VALUE `"FileVersion`", `""+$version_string+"`""
        echo "File Version Updated"
    }

    if ($rc_file[$i] -match " PRODUCTVERSION ")
    {
        $rc_file[$i] = " PRODUCTVERSION "+$version_string
        echo "Product Version Updated"
    }

    if ($rc_file[$i] -match "            VALUE `"ProductVersion`", ")
    {
        $rc_file[$i] = "            VALUE `"ProductVersion`", `""+$version_string+"`""
        echo "Product Version Updated"
    }

    if ($rc_file[$i] -match "#define FILEVER ")
    {
        $rc_file[$i] = "#define FILEVER "+$version_string
        echo "File Version Updated"
    }

    if ($rc_file[$i] -match "#define STRFILEVER ")
    {
        $rc_file[$i] = "#define STRFILEVER `""+$version_string+"\0"+"`""
        echo "File Version Updated"
    }

    if ($rc_file[$i] -match "#define PRODUCTVER ")
    {
        $rc_file[$i] = "#define PRODUCTVER "+$version_string
        echo "Product Version Updated"
    }

    if ($rc_file[$i] -match "#define STRPRODUCTVER ")
    {
        $rc_file[$i] = "#define STRPRODUCTVER `""+$version_string+"\0"+"`""
        echo "Product Version Updated"
    }
}

set-content -path $rc_file_path $rc_file

이 파일을 C:\tools로 복사합니다. 이제 빌드 스크립트에 rcversion.ps1 설정을 추가합니다. rcversion.ps1 “빌드 스크립트 상의 프로젝트 이름” “RC 파일 경로”의 형식으로 사용합니다.

rcversion.ps1에서 자동으로 버전을 증가 시켜서 리소스(.rc) 파일은 수정된 상태입니다. 그 뒤 사용자가 리소스 파일의 버전 부분을 수정하여 커밋하였고, 사용자가 빌드 명령을 내리면 빌드 서버는 소스를 업데이트 하게됩니다. 그런데, 이미 수정된 소스를 업데이트 하게 되면 충돌이 발생하게 되고 빌드는 실패합니다. 따라서 이런 문제를 방지하기 위해, 빌드가 끝나면 소스를 다시 되돌립니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/revert.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

revert.ps1

# revert.ps1 <Source Path>

$source_dir = $args[0]

svn revert -R $source_dir

이 파일을 C:\tools로 복사합니다. 빌드 스크립트에도 revert.ps1 설정을 추가합니다. revert.ps1 “소스 디렉터리” 형식으로 사용합니다.

C:\Program Files\CruiseControl.NET\server\ccnet.config

<cruisecontrol>
    <project name="example">
        <!-- example 프로젝트의 Web Dashboard 주소 -->
        <webURL>http://192.168.1.100:8000/ccnet/server/local/project/example/ViewProjectReport.aspx</webURL>

        <!-- 기본 레이블로 지정 -->
        <labeller type="defaultlabeller">
            <prefix>1.0.0.</prefix>
        </labeller>

        <!-- Subversion 저장소 주소 및 작업 디렉터리 설정 -->
        <sourcecontrol type="svn">
            <trunkUrl>http://localhost/svn/example/trunk</trunkUrl>
            <workingDirectory>C:\build\example</workingDirectory>
        </sourcecontrol>

        <!-- 매일 20:00에 자동 빌드 하도록 설정 -->
        <triggers>
            <scheduleTrigger time="20:00" buildCondition="ForceBuild" name="Scheduled" />
        </triggers>

        <tasks>
            <!-- 자동 버전 업데이트 스크립트 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\rcversion.ps1 "example" "C:\build\example\example\example.rc"</buildArgs>
            </exec>

            <!-- Visual Studio 2005 빌드 설정 -->
            <devenv>
                <solutionfile>C:\build\example\example.sln</solutionfile>
                <configuration>Release</configuration>
            </devenv>

            <!-- 수정 된 소스 코드를 원래대로 되돌림 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\revert.ps1 "C:\build\example"</buildArgs>
            </exec>
        </tasks>
    </project>
</cruisecontrol>

Trac에 버전을 자동으로 등록하기

이번에는 Trac에도 버전 정보를 추가해 보겠습니다. 티켓을 올릴 때 버전 정보를 선택할 수 있는데, trac-admin.exe나 Admin 메뉴에서 버전을 추가할 수 있습니다. 하지만 매번 새로운 버전이 나올 때 마다 일일이 손으로 등록하는 것은 쉽지 않습니다. 그래서 빌드가 끝나면 자동으로 Trac에 해당 버전을 추가하도록 할 수 있습니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/tracversion.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

tracversion.ps1

# tracversion.ps1 <Trac env> <Project name>

$trac_env = "C:\trac\" + $args[0]
$project = $args[1]
$ccnet_dir = "C:\Program Files\CruiseControl.NET\server\"

[xml]$state_file = get-content -path $ccnet_dir$project.state

if ($state_file.IntegrationResult.Label)
{
    $version = $state_file.IntegrationResult.Label.split(".")
    [int]$next_version = $version[3]

    if ($state_file.IntegrationResult.Status -match "Success")
    {
        $next_version++
    }

    $version_string = $version[0] + "." + $version[1] + "." + $version[2] + "." + $next_version
}
else
{
    $version_string = "0.0.0.0"
}

C:\Python25\Scripts\trac-admin.exe $trac_env version add $version_string

이 파일을 C:\tools로 복사합니다. 이제 빌드 스크립트에 tracversion.ps1 설정을 추가합니다. tracversion.ps1 “trac 프로젝트 이름” “빌드 스크립트 상의 프로젝트 이름”의 형식으로 사용합니다.

C:\Program Files\CruiseControl.NET\server\ccnet.config

<cruisecontrol>
    <project name="example">
        <!-- example 프로젝트의 Web Dashboard 주소 -->
        <webURL>http://192.168.1.100:8000/ccnet/server/local/project/example/ViewProjectReport.aspx</webURL>

        <!-- 기본 레이블로 지정 -->
        <labeller type="defaultlabeller">
            <prefix>1.0.0.</prefix>
        </labeller>

        <!-- Subversion 저장소 주소 및 작업 디렉터리 설정 -->
        <sourcecontrol type="svn">
            <trunkUrl>http://localhost/svn/example/trunk</trunkUrl>
            <workingDirectory>C:\build\example</workingDirectory>
        </sourcecontrol>

        <!-- 매일 20:00에 자동 빌드 하도록 설정 -->
        <triggers>
            <scheduleTrigger time="20:00" buildCondition="ForceBuild" name="Scheduled" />
        </triggers>

        <tasks>
            <!-- 자동 버전 업데이트 스크립트 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\rcversion.ps1 "example" "C:\build\example\example\example.rc"</buildArgs>
            </exec>

            <!-- Visual Studio 2005 빌드 설정 -->
            <devenv>
                <solutionfile>C:\build\example\example.sln</solutionfile>
                <configuration>Release</configuration>
            </devenv>

            <!-- 수정 된 소스 코드를 원래대로 되돌림 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\revert.ps1 "C:\build\example"</buildArgs>
            </exec>

            <!-- trac에 버전을 등록 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\tracversion.ps1 "example" "example"</buildArgs>
            </exec>
        </tasks>
    </project>
</cruisecontrol>

빌드가 끝난 뒤 example 프로젝트의 Trac 사이트(http://localhost/trac/example)에 접속 한 뒤 New Ticket 메뉴를 클릭합니다. 새로운 티켓을 생성할 때 아래 그림과 같이 Version 부분에 빌드된 버전이 추가됩니다. 기본적으로 추가되어 있는 1.0, 2.0은 Admin 메뉴에서 삭제합니다.


그림 8-11 빌드가 끝난 후 추가된 버전들

Symbol Server, Subversion Indexing 연동

제품을 개발하다 보면 심볼(PDB) 파일이 없어서 덤프 분석을 하기 힘들 때가 많습니다. 그렇다고 릴리스 할 때마다 PDB 파일을 모아 놓는 것도 상당히 귀찮은 일입니다. 이번에는 빌드와 동시에 PDB 파일에 Subversion 저장소 정보를 넣어주고, C:\Symbols 디렉터리에 심볼 서버 방식으로 보관하게 설정해 보겠습니다.

환경 변수의 Path에 C:\Program Files\Debugging Tools for Windows;C:\Program Files\Debugging Tools for Windows\sdk\srcsrv를 추가합니다.

TIP
환경 변수에 경로를 추가 한 뒤에는 ccnet.exe나 CruiseControl.NET Server 서비스를 재시작 해야 합니다.

다음 파일을 C:\tools 디렉터리에 만듭니다. 이 파일은 부록 CD에 포함되어 있으므로 복사해서 사용해도 됩니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/symbols.ps1
  • 부록 CD 경로 : Scripts/PowerShell/

symbols.ps1

# symbols.ps1 <Source root> <Symbol root> <Project name>

$source_root = $args[0]
$symbol_root = $args[1]
$project = $args[2]

cd $source_root
svnindex.cmd /symbols=$symbol_root /debug
symstore.exe add /o /r /f $args[1] /s C:\Symbols /t "$project" /compress

위 스크립트에서 보면 먼저 $source_root 디렉터리로 이동합니다. 소스의 최상위 디렉터리로 이동하여 svnindex.cmd를 실행해야 관련된 모든 소스를 종합하여 PDB 파일에 기록할 수 있습니다. svnindex.cmd로 $symbol_root 디렉터리에 위치한 PDB 파일에 소스 파일 정보와 리비전 정보를 기록합니다. /debug 옵션으로 자세한 정보를 출력하도록 하였습니다.

그리고 symstore.exe를 이용하여 C:\Symbols 디렉터리에 PDB 파일과 EXE, DLL 파일을 압축하여 저장합니다. add 명령은 심볼 서버에 파일을 추가하는 명령입니다. /o 옵션은 자세한 정보를 출력합니다. /r 옵션은 지정한 디렉터리와 그 하위 디렉터리에 위치한 파일까지 모두 추가합니다. /f 옵션은 PDB 파일이 위치한 경로를 지정할 때 사용합니다. /s 옵션은 심볼 서버로 사용할 디렉터리를 지정할 때 사용합니다. /t 옵션으로 현재 저장하고자 하는 PDB, EXE, DLL 파일의 제품명(프로젝트 이름)을 지정해 줄 수 있습니다.

symstore.exe에서 /compress 옵션을 지정하면 PDB, EXE, DLL 파일을 압축하여 저장하게 됩니다. 압축된 파일의 확장자는 pd_, ex_. dl_과 같이 마지막 글자가 _로 바뀌게 됩니다. 압축 알고리즘은 LZ77 계열인 LZX 알고리즘을 사용합니다. 이 LZX 알고리즘은 Microsoft Cabinet(Cab) 파일에서 주로 사용합니다.

이제 빌드 스크립트에 symbols.ps1 설정을 추가합니다. symbols.ps1 “소스 디렉터리 경로” “심볼(PDB)이 위치한 경로” “빌드 스크립트 상의 프로젝트 이름”의 형식으로 사용합니다.

C:\Program Files\CruiseControl.NET\server\ccnet.config

<cruisecontrol>
    <project name="example">
        <!-- example 프로젝트의 Web Dashboard 주소 -->
        <webURL>http://192.168.1.100:8000/ccnet/server/local/project/example/ViewProjectReport.aspx</webURL>

        <!-- 기본 레이블로 지정 -->
        <labeller type="defaultlabeller">
            <prefix>1.0.0.</prefix>
        </labeller>

        <!-- Subversion 저장소 주소 및 작업 디렉터리 설정 -->
        <sourcecontrol type="svn">
            <trunkUrl>http://localhost/svn/example/trunk</trunkUrl>
            <workingDirectory>C:\build\example</workingDirectory>
        </sourcecontrol>

        <!-- 매일 20:00에 자동 빌드 하도록 설정 -->
        <triggers>
            <scheduleTrigger time="20:00" buildCondition="ForceBuild" name="Scheduled" />
        </triggers>

        <tasks>
            <!-- 자동 버전 업데이트 스크립트 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\rcversion.ps1 "example" "C:\build\example\example\example.rc"</buildArgs>
            </exec>

            <!-- Visual Studio 2005 빌드 설정 -->
            <devenv>
                <solutionfile>C:\build\example\example.sln</solutionfile>
                <configuration>Release</configuration>
            </devenv>

            <!-- 수정 된 소스 코드를 원래대로 되돌림 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\revert.ps1 "C:\build\example"</buildArgs>
            </exec>

            <!-- trac에 버전을 등록 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\tracversion.ps1 "example" "example"</buildArgs>
            </exec>

            <!-- PDB 파일에 Subversion 저장소 정보를 인덱싱 하고, 압축 한 뒤 심볼 서버에 등록 -->
            <exec>
                <executable>powershell.exe</executable>
                <baseDirectory>C:\tools</baseDirectory>
                <buildArgs>C:\tools\symbols.ps1 C:\build\example C:\build\example\release example</buildArgs>
                <buildTimeoutSeconds>10</buildTimeoutSeconds>
            </exec>
        </tasks>
    </project>
</cruisecontrol>

이제 빌드를 하면 PDB 파일에 Subversion 저장소 정보가 기록되며, 실행 파일과 PDB 파일이 압축되어 C:\Symbols 디렉터리에 저장됩니다.


그림 8-12 심볼 서버 형식으로 저장된 파일들

C:\Symbols 디렉터리는 공유 폴더로 지정하고 읽기 권한만 지정합니다. 이후 덤프가 발생하면 이 심볼 서버를 통해 알맞은 PDB 파일을 받고, Subversion 저장소 정보를 참조하여, 오류가 발생한 지점의 소스 코드를 가져올 수 있습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.