5장 CruiseControl.NET으로 빌드 자동화하기

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

목차

CruiseControl.NET 기본 개념과 설치

CruiseControl.NET은 빌드 서버에 설치하여 개발자 PC와는 별개로 빌드를 할 수 있도록 해주는 빌드 자동화 시스템입니다. XML 형태의 빌드 스크립트를 작성하여 빌드 시간 및 주기, 빌드 방법, 저장소 정보, 빌드 넘버 방식을 설정하여 사용합니다. CruiseControl.NET의 동작 과정은 다음과 같습니다.


그림 5-1 CruiseControl.NET의 동작 과정

개발자 PC에서 Subversion 저장소에 커밋을 하면 정해진 시간이 되었거나 강제 빌드 명령이 내려지면 CruiseControl.NET은 Subversion 저장소에서 최신 버전의 소스 코드를 업데이트하여 빌드를 시작하게 됩니다.

빌드 스크립트를 작성하는 것에 따라 하루에 한 번, 일주일에 한 번, 한 달에 한 번, 또는 특정 조건에 만족하면 빌드를 합니다. 강제 빌드(Force Build)는 클라이언트 프로그램(CCTray)을 사용하여 빌드 명령을 내렸을 때 실행됩니다.

위의 [그림 5-1]에서는 Subversion 서버와 CruiseControl.NET 서버가 분리되어 있지만 서버 하나에 Subversion 서버와 CruiseControl.NET을 동시에 사용할 수도 있습니다.

웹 인터페이스를 지원하기 때문에 목록, 빌드 에러 로그 등을 확인할 수 있고 빌드 명령도 내릴 수 있습니다.

CruiseControl.NET 다운로드

CruiseControl.NET은 다음 URL에서 받을 수 있습니다. 이 책에서는 CruiseControl.NET-1.3-Setup.exe, CruiseControl.NET-CCTray-1.3-Setup.exe를 사용하겠습니다.

Windows XP에 IIS 설치

CruiseControl.NET의 웹 인터페이스인 Web Dashboard를 사용하려면 IIS가 필요합니다. Windows XP의 경우 기본적으로 IIS가 설치되어 있지 않으므로, 먼저 IIS를 설치하는 과정을 설명하겠습니다.

  1. 시작 → 제어판 → 프로그램 추가/제거 → Windows 구성 요소 추가/제거를 실행합니다.
    구성 요소 목록에서 인터넷 정보 서비스(IIS)를 선택합니다. 기본적으로 웹 서버와 SMTP 서버가 설치됩니다. 다음을 눌러 설치를 시작합니다. Windows XP CD가 필요합니다.


    그림 5-2 Windows 구성 요소 마법사에서 인터넷 정보 서비스(IIS) 설치
TIP
Windows XP Home Edition에는 IIS가 없습니다. IIS를 사용하려면 Windows XP Professional Edition을 사용해야 합니다.

Web Dashboard를 실행하려면 ASP.NET이 필요하기 때문에 Windows Update를 통해서 Microsoft .NET Framework 2.0을 설치해야 합니다. Windows Update가 아닌 설치 파일을 통해 설치하려면 아래 URL에서 설치파일(dotnetfx.exe)을 받으면 됩니다.

  • 다운로드 세부 정보 : .NET Framework 버전 2.0 재배포 가능 패키지(x86)
    http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5

Windows Server 2003에 IIS 설치하기

Windows Server 2003은 기본적으로 IIS가 설치되어 있지 않습니다. 따라서 다음과 같이 IIS를 설치해주어야 합니다.

  1. 시작 → 관리 도구 → 서버 구성 마법사를 실행합니다. 서버 구성 마법사가 시작되면 다음을 누릅니다.


    그림 5-3 서버 구성 마법사 시작

  2. 서버를 성공적으로 구성하기 위해 먼저 확인해야 할 사항을 알려줍니다. 다음을 눌러 넘어갑니다.


    그림 5-4 서버 구성 마법사 준비 단계

  3. 사용자 지정 구성을 선택하고 다음을 누릅니다.


    그림 5-5 서버 구성 마법사 구성 옵션

  4. 응용 프로그램 서버(IIS, ASP.NET을 선택하고 다음을 누릅니다.


    그림 5-6 서버 역할 선택

  5. ASP.NET 사용을 체크하고 다음을 누릅니다.


    그림 5-7 114 ASP.NET 사용 설정

  6. 다음을 누르면 설치를 시작합니다. Windows Server 2003 CD가 필요합니다.


    그림 5-8 서버 구성 마법사 선택 사항 요약

CruiseControl.NET 설치

이제 CruiseControl.NET을 설치하겠습니다. CruiseControl.NET-13-setup.exe를 실행하여 설치를 시작합니다.

  1. 설치 파일을 실행하면 설치 마법사가 표시됩니다. Next를 눌러 넘어갑니다.


    그림 5-9 CruiseControl.NET 설치 마법사

  2. 라이센스 동의 화면입니다. I Agree를 누릅니다.


    그림 5-10 라이센스 동의 화면

  3. CruiseControl.NET Server와 Web Dashboard(웹 인터페이스), Examples를 설치할 것인지 선택하는 화면입니다. 3가지 모두 설치합니다.


    그림 5-11 설치 구성 요소 선택 화면

  4. 첫 번째는 CruiseControl.NET 서버를 윈도우 서비스로 설치할 것인지 선택하는 것이고, 두 번째는 IIS에 Web Dashboard의 가상 디렉터리를 자동으로 설치할 것인지 선택하는 것입니다. 두 곳에 모두 체크합니다.


    그림 5-12 윈도우 서비스 설정, Web Dashboard 설정

  5. CruiseControl.NET의 설치 디렉터리를 지정하는 화면입니다. 기본 설정대로 설치합니다.


    그림 5-13 CruiseControl.NET 설치 디렉터리 지정 화면

  6. CruiseControl.NET을 시작 메뉴에 등록하는 화면입니다. 기본 설정대로 하고 Install을 눌러 설치를 시작합니다.


    그림 5-14 시작 메뉴 등록 화면

  7. 실제 설치 화면입니다. Next를 눌러 넘어갑니다.


    그림 5-15 CruiseControl.NET 파일 설치 화면

  8. Finish를 눌러 설치를 완료 합니다.


    그림 5-16 CruiseControl.NET 설치 완료

CCTray 설치

CruiseControl.NET의 클라이언트 프로그램인 CCTray를 설치하겠습니다. CruiseControl.NET-CCTray-13-setup.exe를 실행하여 설치를 시작합니다.

  1. 설치 파일을 실행하면 설치 마법사가 표시됩니다. Next를 눌러넘어갑니다.


    그림 5-17 CCTray 설치 마법사

  2. 라이센스 동의 대화상자가 나타나면 I Agree를 누르고 다음으로 넘어갑니다.


    그림 5-18 라이센스 동의 화면

  3. CCTray와 바탕 화면, 시작 메뉴 아이콘을 설치할 것인지 선택하는 화면입니다. 기본 설정대로 설치합니다.


    그림 5-19 설치 구성요소 선택 화면

  4. CCTray의 설치 디렉터리를 지정하는 화면입니다. 기본 설정대로 설치합니다.


    그림 5-20 CCTray 설치 디렉터리 지정 화면

  5. CCTray를 시작 메뉴에 등록하는 화면입니다. 기본 설정대로 하고 Install을 눌러 설치를 시작합니다.


    그림 5-21 시작 메뉴 등록 화면

  6. Next를 눌러 넘어갑니다.


    그림 5-22 CCTray 설치 화면

  7. Finish를 눌러 설치를 완료합니다.


    그림 5-22 CCTray 설치 완료

CruiseControl.NET 빌드 스크립트 익히기

CruiseControl.NET은 XML로 된 빌드 스크립트를 이용하여 빌드를 합니다. 빌드 스크립트에서 버전 관리 시스템 종류, 저장소 URL이나 소스의 위치, 빌드 넘버 방식, 빌드 시간, 빌드 방식을 지정할 수 있습니다.

이제부터 빌드 스크립트의 문법에 대해 알아보겠습니다. 이번 예제에서 빌드 스크립트는 C:\Program Files\CruiseControl.NET\server\ccnet.config를 사용하도록 하겠습니다.

<cruisecontrol>
    <project name="hello">
    </project>

    <project name="world">
    </project>
</cruisecontrol>

CruiseControl.NET의 빌드 스크립트는 <cruisecontrol> 태그로 시작해서 </cruisecontrol> 태그로 끝납니다. 이 태그 안에 <project name="hello"> </project>의 형태로 각 프로젝트가 위치하게 됩니다. 프로젝트가 늘어날 수록 이 태그는 계속 추가될 것입니다. <project></project> 태그 안에는 해당 프로젝트의 세부 설정을 할 수 있습니다.

Labeller로 빌드 넘버 표시하기

Labeller는 빌드 넘버를 어떻게 표시할 것인지 지정하는 태그입니다. 이 태그는 <project></project> 태그 안에 위치해야 합니다.

기본 labeller입니다. 아래 예제에서 <prefix>는 주 버전과, 부 버전을 표시하고 있고, 빌드를 하면 1.0.1, 1.0.2와 같이 마지막 빌드 넘버가 1씩 증가됩니다. <prefix>는 생략할 수 있습니다. <incrementOnFailure>를 true로 지정 하면 빌드가 실패하더라도 빌드 넘버가 올라갑니다. false로 지정하면 빌드가 성공할 때 까지 빌드 넘버가 올라가지 않습니다. <incrementOnFailure>를 지정하지 않으면 기본적으로 false로 설정됩니다.

<project>
    <labeller type="defaultlabeller">
        <prefix>1.0.</prefix>
        <incrementOnFailure>true</incrementOnFailure>
    </labeller>
</project>
TIP
defaultlabeller에서 labeller의 맨 앞 l은 소문자로 되어 있어야 합니다.

날짜를 빌드 넘버로 지정하는 예제입니다. 2007.8.5.1과 같이 년.월.일과 마지막에는 그날 빌드한 횟수가 들어갑니다.

<project>
    <labeller type="dateLabeller" />
</project>

fileLabeller는 파일에 빌드 넘버를 저장해 놓고 그 빌드 넘버를 그대로 쓰는 방식입니다. version.txt에는 숫자 또는 문자로 빌드 넘버를 저장해 놓습니다. 빌드를 계속 하더라도 빌드 넘버는 변하지 않으며, 파일에 저장된 빌드 넘버를 바꿔줘야 합니다. <prefix>는 생략할 수 있고, <labelFilePath>는 생략할 수 없습니다.

<project>
    <labeller type="fileLabeller">
        <labelFilePath>C:\build\example\version.txt</labelFilePath>
        <allowDuplicateSubsequentLabels>true</allowDuplicateSubsequentLabels>
        <prefix>1.0.</prefix>
    </labeller>
</project>
TIP
fileLabeller에서 Labeller의 맨 앞 L은 대문자로 되어 있어야 합니다.

다음은 version.txt의 예제입니다.

687

다음과 같은 형태도 가능합니다.

1.1

a, b, c, d, e 처럼 문자도 지정할 수 있으며 alpha, beta와 같은 문자열도 가능합니다.

alpha

iterationLabeller의 빌드 넘버가 올라가는 방식은 defaultlabeller와 같습니다. <duration>은 주(週)를 지정하는 것이고, <releaseStartDate>는 프로젝트의 릴리스 날짜를 지정합니다. 버전이 올라가는 방식은 <releaseStartDate>가 2007/10/01, <duration>이 1, 오늘 날짜가 2007/10/16이라면 2주가 지났고 <duration>이 1이므로 2가 됩니다. 그러므로 1.0.2.1 (prefix.2.buildnumber)이 됩니다. <duration>을 5로 하고 10주가 지났다면 2가 됩니다. <prefix>는 생략할 수 있습니다. <duration>을 생략하면 2로 설정되고, <separator>를 생략하면 .으로 설정됩니다. <releaseStartDate>는 생략할 수 없습니다.

<project>
    <labeller type="iterationlabeller">
        <prefix>1.0.</prefix>
        <duration>1</duration>
        <releaseStartDate>2007/10/01</releaseStartDate>
        <separator>.</separator>
    </labeller>
</project>
TIP
iterationlabeller에서 labeller의 맨 앞 l은 소문자로 되어 있어야 합니다.

remoteProjectLabeller는 다른 곳에서 실행되는 CruiseControl.NET과 연동하는 방식입니다. 192.168.0.100에 CruiseControl.NET이 실행되고 있고, sample 프로젝트가 빌드되어 빌드 넘버가 1.0.1이 되었다면. 이 1.0.1을 그대로 가져와서 사용합니다. tcp://localhost/CruiseManager.rem로 지정하면 현재 CruiseControl.NET에서 빌드 된 프로젝트의 빌드 넘버를 가져올 수 있습니다.

<project>
    <labeller type="remoteProjectLabeller">
        <project>sample</project>
        <serverUri>tcp://192.168.0.100:21234/CruiseManager.rem</serverUri>
    </labeller>
</project>

stateFileLabeller는 현재 CruiseControl.NET에서 빌드되고 있는 다른 프로젝트의 빌드 넘버를 가져옵니다. 각 프로젝트의 빌드 넘버는 C:\Program Files\CruiseControl.NET\server 아래에 프로젝트명.state의 형태로 저장됩니다. labeller 아래에 <project></project> 태그에 빌드 넘버를 가져올 다른 프로젝트의 이름을 지정합니다.

<project>
    <labeller type="stateFileLabeller">
        <project>sample</project>
    </labeller>
</project>

Source Control

<sourcecontrol></sourcecontrol> 태그를 이용하면 Subversion, CVS, Perforce, Visual Sourcesafe등에서 빌드 할 때 마다 소스를 자동으로 업데이트 할 수 있습니다. 이 책에서 주로 다룰 Subversion을 중심으로 설명하도록 하겠습니다.

Subversion과 연동하려면 당연히 Subversion이 설치되어 있어야 합니다. svn.exe의 경로가 환경 변수의 Path에 들어가 있는지 확인합니다.

<trunkUrl>에는 소스를 업데이트 받을 저장소 주소를 지정합니다. trunk 뿐만 아니라 branch도 지정할 수 있습니다. <workingDirectory>는 소스를 체크아웃한 경로입니다.

<sourcecontrol type="svn">
    <trunkUrl>svn://192.168.0.100/example/trunk</trunkUrl>
    <workingDirectory>C:\build\example</workingDirectory>
</sourcecontrol>

다음은 기타 설정들입니다.

svn.exe의 경로가 환경 변수의 Path에 없을 경우 직접 경로를 지정해줍니다.

<executable>C:\apps\svn.exe</executable>

Subversion 저장소에서 소스를 가져오기 위한 사용자명과 암호를 지정합니다. 이 부분을 지정하지 않으려면 svn.exe나 TortoiseSVN으로 저장소에 한번 접근한 뒤 사용자명과 암호를 저장하면 됩니다.

<username>sampleuser</username>
<password>k7f92ja0</password>

빌드할 때 소스를 자동으로 업데이트 할 것인지 아닌지를 지정합니다. 지정하지 않으면 자동으로 소스를 업데이트 하도록 설정됩니다.

<autoGetSource>false</autoGetSource>

빌드가 성공하면 빌드 넘버로 저장소에 태깅 하는 설정입니다. 빌드 넘버가 1.0.1이라면 svn://192.168.0.100/example/tags/1.0.1에 trunk가 태그 됩니다.

<tagOnSuccess>true</tagOnSuccess>
<tagBaseUrl>svn://192.168.0.100/example/tags</tagBaseUrl>

대기 시간을 지정합니다. 지정한 대기 시간 전에 svn.exe 명령이 성공하지 못하면 빌드는 실패합니다. 지정하지 않으면 10분으로 설정됩니다. units를 지정하지 않으면 밀리초(1000분의 1초) 단위로 계산합니다.

<timeout>60000</timeout>
<timeout units="millis">60000</timeout>
<timeout units="seconds">60</timeout>
<timeout units="minutes">5</timeout>
<timeout units="hours">1</timeout>

Task

<tasks></tasks> 태그 아래에 실제 소스를 컴파일 하는 설정이 들어갑니다. Visual Studio 6.0, Visual Studio 2005, MSBuild 등의 도구를 사용하도록 설정할 수 있고, 특정 프로그램을 실행할 수 있습니다.

Visual Studio

Visual Studio 2005의 경우 아래와 같이 설정할 수 있습니다. solutionfile에 솔루션 파일의 경로를 지정하고, configuration에 Release 또는 Debug를 지정합니다.

<devenv>
    <solutionfile>C:\build\example\example.sln</solutionfile>
    <configuration>Release</configuration>
</devenv>

다음은 기타 설정들입니다.

빌드 형식을 지정합니다. build, rebuild, clean을 지정할 수 있습니다. 지정하지 않으면 rebuild로 설정됩니다.

<buildtype>build</buildtype>

솔루션내에 여러개의 프로젝트가 있을 경우 그 중 하나를 선택하여 빌드합니다. 지정하지 않으면 솔루션내의 모든 프로젝트를 빌드합니다.

<project>sample</project>

VS2005이외에 VS2002, VS2003이 설치되어 있을 경우, VS2002, VS2003을 사용할 수 있도록 해줍니다.

<executable>c:\program files\Microsoft Visual Studio .NET\Common7\IDE\devenv.com</executable>

빌드 대기 시간을 지정합니다. 지정한 대기 시간 전에 컴파일을 완료하지 못하면, 빌드는 실패합니다. 지정하지 않으면 10분으로 설정됩니다.

<buildTimeoutSeconds>600</buildTimeoutSeconds>

Visual Studio 6.0의 경우 devenv를 사용하지 않고 exec를 사용하여 빌드합니다.

<exec>
    <executable>"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.COM"</executable>
    <baseDirectory>C:\build\example</baseDirectory>
    <buildArgs>c:\build\example\example.dsw /MAKE "EXAMPLE - Win32 Release" /REBUILD</buildArgs>
</exec>

VCBuild

VCBuild는 VS2005 부터 기본적으로 제공되는 빌드 도구입니다. VCBuild를 사용하기 위해서는 <exec>를 이용해야 합니다.

<executable>에는 vcbuild.exe의 경로를 지정해주고 <baseDirectory>에는 빌드할 소스 코드의 경로를 지정해 줍니다. <buildArgs>에는 빌드 옵션과 솔루션(프로젝트)파일의 경로, 그리고 Release, Debug 모드 설정과 Win32, x64를 설정합니다..

<exec>
    <executable>"C:\Program Files\Microsoft Visual Studio 8\VC\vcpackages\vcbuild.exe"</executable>
    <baseDirectory>C:\build\example</baseDirectory>
    <buildArgs>/rebuild C:\build\example\example.sln "Release|Win32"</buildArgs>
</exec>

솔루션 파일 대신 C:\build\example\example\example.vcproj와 같이 프로젝트 파일을 직접 지정해도 상관 없습니다.

TIP
/rebuild /MP C:\build\example\example.sln "Release|Win32"와 같이 /MP 옵션을 설정하면 빌드할 때 여러 개의 프로세스를 생성하여 컴파일하므로 다중 프로세서 환경에서 컴파일 시간을 향상시킬 수 있습니다. 자세한 내용은 아래 URL을 참고합니다.
http://msdn2.microsoft.com/ko-kr/library/bb385193.aspx
TIP
64비트 빌드와 디버그 빌드
<devenv>를 사용하면 Release 모드와 Debug 모드를 구분해서 빌드 할 수 있지만 32, 64비트 빌드를 구분해서 할 수는 없습니다. <devenv>에서 64비트 빌드를 하려면 프로젝트 설정에서 Win32 플랫폼은 삭제하고 x64만 남겨두어야 합니다. VCbuild는 Release 모드와 Debug 모드를 구분해서 빌드 할 수 있고, 32, 64비트 빌드를 구분하여 할 수 있습니다.
"Debug|Win32" : 32비트 디버그 빌드
       "Release|x64" : 64비트 릴리스 빌드

MSBuild

MSBuild는 VS2005에서 제공해주는 또 다른 빌드 도구입니다. <msbuild></msbuild> 태그를 사용하기 위해서는 http://ccnetlive.thoughtworks.com/MSBuildXmlLogger-Builds/에서 ThoughtWorks.CruiseControl.MSBuild.dll 파일을 받은 뒤 C:\Program Files\CruiseControl.NET\server에 넣어줍니다.

<workingDirectory>에는 체크아웃한 소스의 경로를 지정합니다. <projectFile>에는 솔루션 파일을 지정합니다. <logger>에는 위의 URL에서 받은 ThoughtWorks.CruiseControl.MSBuild.dll 파일의 경로를 지정합니다.

<msbuild>
    <workingDirectory>C:\build\example</workingDirectory>
    <projectFile>example.sln</projectFile>
    <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>

다음은 기타 설정입니다.

MSBuild.exe의 경로를 지정합니다.

<executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>

빌드 옵션을 지정합니다.

<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>

빌드이외에 테스트를 할 수 있도록 프로젝트 내에서 지정한 타겟을 실행합니다. 여러개를 세미콜론으로 구분하여 지정할 수 있습니다.

<targets>Build;Test</targets>

빌드 대기 시간을 지정합니다. 지정한 대기 시간 전에 컴파일을 완료하지 못하면, 빌드는 실패합니다. 지정하지 않으면 10분으로 설정됩니다.

<buildTimeoutSeconds>600</buildTimeoutSeconds>

Executable

<exec></exec> 태그를 사용하면 콘솔 형식의 외부 프로그램을 실행 할 수 있습니다.

build.cmd 파일을 실행합니다.

<exec executable="c:\example\build.cmd"/>

<baseDirectory>는 실행 파일(배치 파일)을 실행할 기준 디렉터리를 지정합니다. <buildArgs>에는 실행 파일(배치 파일)에 전달할 옵션 값을 지정할 수 있습니다.

<exec>
    <executable>build.cmd</executable>
    <baseDirectory>C:\build\example</baseDirectory>
    <buildArgs>all</buildArgs>
    <buildTimeoutSeconds>10</buildTimeoutSeconds>
</exec>

Build Publisher

<buildpublisher></buildpublisher> 태그는 빌드가 끝난 뒤 결과물을 특정 디렉터리에 복사해주는 기능을 합니다. 같은 컴퓨터 상의 장소에 복사할 수도 있고, 공유 폴더에 복사할 수도 있습니다.

<sourceDir>은 빌드가 끝난 뒤 결과물이 생기는 디렉터리입니다. <publishDir>은 결과물을 복사할 경로입니다. D:\Release\example, \fileserver\example과 같이 지정할 수 있습니다. <useLabelSubDirectory>를 true로 하면 <publishDir> 아래에 빌드 넘버의 이름으로 디렉터리를 생성하고 그 안에 결과물을 복사합니다. false로 하면 <publishDir> 디렉터리 아래에 계속 덮어쓰게 됩니다. <useLabelSubDirectory>를 지정하지 않으면 false로 설정됩니다.

<buildpublisher>
    <sourceDir>C:\build\example\release</sourceDir>
    <publishDir>\\fileserver\example</publishDir>
    <useLabelSubDirectory>false</useLabelSubDirectory>
</buildpublisher>

Trigger

트리거 태그는 빌드 주기를 지정할 때 사용합니다. <scheduleTrigger>는 지정된 시간에 빌드를 하도록 합니다. 아래 예제는 매주 월요일 20시에 빌드를 시작합니다. BuildCondition에는 ForceBuild와 IfModificationExists을 지정할 수 있습니다. IfModificationExists는 저장소에 변경된 사항이 있을 경우에만 빌드하고, ForceBuild는 무조건 빌드합니다. BuildCondition을 지정하지 않을 경우 IfModificationExists로 설정됩니다. weekDays에서는 빌드 할 요일을 지정합니다. Monday, Tuesday 등으로 지정하고, 지정하지 않을 경우 매일 빌드 하도록 설정됩니다.

<scheduleTrigger time="20:00" buildCondition="ForceBuild" name="Scheduled">
    <weekDays>
        <weekDay>Monday</weekDay>
    </weekDays>
</scheduleTrigger>

<intervalTrigger>는 지정된 시간마다 반복적으로 빌드합니다. 아래 예제에서는 30초마다 무조건 빌드합니다. <scheduleTrigger>와 마찬가지로 buildCondition에 ForceBuild와 IfModificationExists를 지정할 수 있으며, 지정하지 않을 경우 IfModificationExists로 설정됩니다.

<intervalTrigger name="continuous" seconds="30" buildCondition="ForceBuild"/>

<projectTrigger>는 다른 곳에서 실행되고 있는 CruiseControl.NET에서 특정 프로젝트의 빌드가 완료되었을 경우, 빌드를 시작하도록 할 때 사용됩니다. serverUri는 다른 곳에서 실행되고 있는 CruiseControl.NET의 주소입니다.

<triggerStatus>에 Success를 지정하면 원격지의 빌드가 성공했을 경우 빌드를 시작합니다. Failure는 실패 했을 경우, Exception은 컴파일은 실패하지 않았지만 다른 부분에서 실패하였을 경우입니다. <innerTrigger>는 지정한 시간 간격으로 다른 곳에서 빌드되고 있는 프로젝트의 빌드 결과를 검사합니다. 검사 결과가 일치할 경우 빌드를 시작합니다. <triggerStatus>를 지정하지 않으면 Success로 설정됩니다. buildCondition은 <intervalTrigger>와 같습니다.

<projectTrigger serverUri="tcp://192.168.0.100:21234/CruiseManager.rem" project="sample">
    <triggerStatus>Success</triggerStatus>
    <innerTrigger type="intervalTrigger" seconds="30" buildCondition="ForceBuild"/>
</projectTrigger>
TIP
Success, Failure, Exception 확인하기 프로젝트의 상태는 CCTray에서 아이콘으로 표시되지만, 더 자세한 정보는 C:\Program Files\CruiseControl.NET\server 디렉터리 아래에 프로젝트명.state 파일에서 확인할 수 있습니다. Status와 LastIntergrationStatus에는 빌드의 상태에 따라 Success, Failure, Exception가 표시됩니다. Status는 현재 상태입니다. 아래 화면에서는 빌드가 실패한 뒤 .state 파일을 열었기 때문에 Failure로 표시되고 있습니다. 그리고 LastIntergrationStatus는 마지막 상태, 즉 현재 빌드의 바로 직전 상태입니다.


그림 2-24 Example.state 파일의 내용

<urlTrigger>는 특정 URL의 웹페이지가 변경되었을 경우 빌드를 시작합니다. 지정한 시간 간격으로 웹페이지가 변경되었는지 검사합니다.

<urlTrigger url="http://192.168.0.200/page.html" seconds="30" buildCondition="ForceBuild"/>

<filterTrigger>는 지정된 시간 안에서 하위 트리거의 실행 여부를 제어합니다. 아래 예제에서는 매주 일요일 60초 마다 빌드를 하지만, 22시에서 23시 사이에는 빌드를 하지 않습니다. startTime은 시작 시간, endTime은 끝나는 시간입니다.

<filterTrigger startTime="22:00" endTime="23:00">
    <trigger type="intervalTrigger" seconds="60" />
    <weekDays>
        <weekDay>Sunday</weekDay>
    </weekDays>
</filterTrigger>
TIP
주석은 HTML, XML과 똑같은 <!-- -->입니다. ccnet.config에서 한글 경로 및 한글 주석을 사용하려면 ccnet.config의 첫 번째 줄에 encoding 속성을 UTF-8로 지정하고, 이 설정 파일을 저장할 때도 encoding을 UTF-8로 저장해야 합니다.

<xml version="1.0" encoding="utf-8">

빌드 자동화 실습

CruiseControl.NET의 빌드 스크립트에 대해서 알아보았으니, 이번에는 실제로 빌드 스크립트를 작성하여 빌드를 해보겠습니다. 이번 예제에서 사용할 프로젝트는 4장의 “Subversion Symbol Indexing 사용”에서 만들었던 example 프로젝트입니다. 저장소도 C:\Repos\example을 그대로 사용합니다.

example 프로젝트 체크아웃하기

example 프로젝트를 C:\build\example에 체크아웃합니다. 명령 프롬프트에서 아래와 같이 입력하거나, TortoiseSVN을 이용해서 체크아웃 합니다.

C:\Documents and Settings\xp>cd C:\build
C:\build>svn checkout svn://127.0.0.1/example/trunk example

ccnet.config 파일 수정하기

C:\Program Files\CruiseControl.NET\server 아래에 ccnet.config 파일을 열어 다음과 같이 입력하고 저장합니다.

<cruisecontrol>
    <project name="example">
        <labeller type="defaultlabeller">
            <prefix>1.0.</prefix>
        </labeller>

        <sourcecontrol type="svn">
            <trunkUrl>svn://127.0.0.1/example/trunk</trunkUrl>
            <workingDirectory>C:\build\example</workingDirectory>
        </sourcecontrol>

        <triggers>
            <scheduleTrigger time="20:00" buildCondition="ForceBuild" name="Scheduled" />
        </triggers>

        <tasks>
            <devenv>
                <solutionfile>C:\build\example\example.sln</solutionfile>
                <configuration>Release</configuration>
            </devenv>
        </tasks>
    </project>
</cruisecontrol>

ccnet.exe 실행

C:\Program Files\CruiseControl.NET\server\ccnet.exe를 실행합니다. 빌드 스크립트 파일이 정상적으로 입력되었다면 아래와 같이 나올 것입니다. example 프로젝트의 빌드 준비가 끝났습니다.


그림 5-25 ccnet.exe 실행 화면

cctray.exe 실행

  1. C:\Program Files\CCTray\CCtray.exe를 실행합니다. 처음 실행하면 아래와 같이 빈 화면이 나올 것입니다. File → Settings…를 눌러 설정 메뉴를 불러옵니다.


    그림 5-26 CCTray 실행 화면

  2. Add… 버튼을 누릅니다.


    그림 5-27 프로젝트 추가 화면

  3. 빌드 서버를 추가하고 해당 서버에서 운영되고 있는 프로젝트를 선택하는 화면입니다. Add Server를 누릅니다.


    그림 5-28 서버 선택 화면

  4. 서버 주소를 이용하여 서버를 추가하는 화면입니다. 기본적으로 두 번째 Connect directly using.NET remoting이 선택되어 있습니다. 이번 예제는 CruiseControl.NET이 현재 컴퓨터에 실행되고 있으므로 localhost로 합니다. 원격지에서 실행되고 있다면 해당 서버의 IP 주소, 도메인을 넣을 수 있습니다.


    그림 5-29 새 서버 추가 화면

  5. 빌드 서버를 추가하였다면 Avilable Projects 부분에 해당 서버에서 운영 중인 프로젝트가 표시됩니다. 이번 예제에서는 example 프로젝트 하나만 설정하였으므로 example 프로젝트만 보일 것입니다. example 프로젝트를 선택하고 OK를 누릅니다.


    그림 5-30 localhost의 example 프로젝트를 선택

  6. 이제 서버 선택과 프로젝트 선택이 끝났습니다. OK를 누릅니다.


    그림 5-31 localhost의 example 프로젝트가 추가됨

  7. example 프로젝트가 추가된 것을 볼 수 있습니다. 빌드가 한 번도 되지 않았으므로 example 앞의 CC 아이콘이 붉은색으로 표시될 것이고, Last Build Label도 UNKNOWN으로 표시될 것입니다.


    그림 5-32 example 프로젝트의 현재 상태

Force Build 버튼으로 강제 빌드

example 프로젝트를 선택하고 Force Build 버튼을 누릅니다. 빌드 스크립트 상에는 매일 20시에 빌드하도록 되어있지만, 테스트 삼아 Force Build 버튼으로 강제 빌드를 해보겠습니다.

  1. 빌드가 시작되면 Activity에 Building이라고 표시되며 CC 아이콘은 오랜지색으로 변합니다.


    그림 5-33 example 프로젝트가 빌드되고 있는 상태

  2. 서버측 프로그램인 ccnet.exe의 화면입니다. example 프로젝트가 빌드되는 화면이 지나갈 것이며, 빌드가 성공하면 위 화면과 같이 Intergration complete: Success가 표시됩니다.


    그림 5-34 빌드가 끝난 후 ccnet.exe의 실행 화면

  3. 빌드가 끝나면 Activity는 Sleeping으로 표시됩니다. 빌드가 성공하면 CC 아이콘은 초록색으로 변하며 Last Build Label의 빌드 넘버도 증가합니다. 빌드가 실패하면 CC 아이콘은 붉은색으로 변하며 Last Build Label은 증가하지 않습니다.


    그림 5-35 example 프로젝트가 정상적으로 빌드된 상태

CCTray에서 example 프로젝트를 더블클릭 하거나, 인터넷 익스플로러에서 http://localhost/ccnet에 접속하면 아래와 같이 CruiseControl.NET의 웹 인터페이스인 Web Dashboard를 볼 수 있습니다.


그림 5-36 CruiseControl.NET의 Web Dashboard

Web Dashboard에서도 Force Build 및 빌드 정지, 빌드 넘버, 빌드 상태 등을 확인할 수 있습니다. 각 프로젝트명을 클릭하면 해당 프로젝트의 빌드 로그를 확인 할 수 있습니다. Windows XP에서 Web Dashboard 페이지가 표시되지 않고 에러가 발생할 경우 ASP.NET이 IIS에 등록되지 않아서 발생하는 문제입니다.

시작 → 실행에서 아래 명령을 실행하면 Web Dashboard가 정상적으로 표시됩니다.

C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i



그림 5-37 Web Dashboard에서 빌드 에러 메시지를 확인

Recent Builds에서는 지금까지 빌드한 결과를 순서대로 보여주는데 빌드가 성공한 경우 초록색으로 표시되며 빌드가 실패한 경우 붉은색으로 표시됩니다. 각 링크를 클릭하면 해당 빌드 로그를 확인할 수 있습니다. 위 화면처럼 컴파일 오류가 발생한 경우 컴파일 오류 메시지가 표시됩니다. 이 오류 메시지는 Visual Studio 2005에서 직접 빌드 했을 때의 오류 메시지와 같습니다.

C:\Build\example\release에 가보면 실행파일과 PDB 파일이 생성되어 있는 것을 볼 수 있습니다.


그림 5-38 example 프로젝트를 빌드한 후 생성된 파일

CruiseControl.NET을 서비스로 실행하고자 하는 경우 시작 → 제어판 → 관리 도구 → 서비스 → CruiseControl.NET Server → 속성 → 로그온 탭에서 계정 지정을 선택하고 Administrator 계정이나 Administrators 그룹에 소속된 계정과 암호를 입력해야 합니다. 계정 지정을 하지 않을 경우 CruiseControl.NET Server가 정상적으로 동작하지 않습니다.


그림 5-39 CruiseControl.NET Server 실행 계정 설정


저작권 안내

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