CruiseControl .NET 설치 일지

가정

  1. 소스버전관리시스템이 있다. 여기서는 Subversion을 사용한다.

CI 시스템 구축

  1. .NET Framework SDK 를 설치한다.

    Windows Installer 를 실행시키기만 하면 된다.

  2. NUnit

    Windows Installer 를 실행시키기만 하면 된다.

  3. NAnt

    1. 원하는 경로에 압축파일을 푼다. 여기서는 “C:\Program Files
      ant-0.85-rc2″에 압축을 풀었다.

    2. [제어판->시스템->고급->환경변수->시스템환경변수->새로 만들기]에서 변수 이름 NANT_HOME, 변수값 C:\Program

      Files
      ant-0.85-rc2을 추가한다.

    3. [제어판->시스템->고급->환경변수->시스템환경변수->PATH]에 %NANT_HOME%;bin 을 추가한다.

  4. Cruise Control .Net

    1. CruiseControl.NET-1.0-Setup.exe 을 설치한다. 여기서는 기본설치경로 “C:\Program Files\CruiseControl.NET\”을 선택했다.

    2. CruiseControl.NET-CCTray-1.0-Setup.exe 을 설치한다.

    3. C:\Program Files\CruiseControl.NET\server\ccnet.config 을 메모장으로 연다. 프로젝트 설정을 추가한다.

    4. [관리도구->서비스->CruiseControl.NET Server->등록정보]에서 시작유형 ‘자동’, 서비스 상태 ‘시작’으로 설정한다.

  5. CCTray

    1. CCTray를 실행시킨다. 바탕화면에 바로가기가 만들어져 있을 것이다.

    2. [File->Settings->Add]로 들어가면 ‘Add Server’라는 버튼이 보인다. 버튼 옆의 텍스트 박스에 localhost를 써넣고, 버튼을 클릭한다. 앞서 ccnet.config에 추가한 프로젝트의 이름이 보일 것이다. 이제 ‘OK’ 버튼을 클릭하면 된다.

  6. WebDashBoard

    1. CruiseControl .NET은 웹인터페이스를 제공한다.

    2. CCTray에서 원하는 프로젝트를 선택하고, 마우스 오른쪽 버튼을 클릭한다. 그러면 ‘Display Web Page’ 메뉴가 있다.

    3. 보통 http://localhost/ccnet 으로 접속하면 웹인터페이스를 볼 수 있다.

    4. 만약 여러개의 사이트를 운영하는 IIS서버라면, 수작업으로 C:\Program Files\CruiseControl.NET\webdashboard 를 응용프로그램으로 등록하면 된다.

참고사항

  1. NAnt build 파일이 없고, VS.NET Solution 파일만 있다면 어떻게 해야 하나?

    NAnt는 VS.NET Solution을 지원한다.

    <?xml version="1.0" ?>
    <project>
    <solution configuration="debug" solutionfile="xxxxx.sln" />
    </project>
  2. xxxxx.xsd로부터 생성한 Type-Safe DataSet의 소스코드는 어떻게 처리할 것인가?

    1. NAnt에서 각 파일에 대해 xsd.exe를 실행시킨다.

    2. 소스버전관리시스템에 Type-Safe DataSet의 소스코드를 추가한다.

    여기서는 간단하게 2번째 방법을 선택한다.

  3. 한번에 한가지만 ccnet.config에 추가하자. 안 그러면 문제를 수정하기 힘들다.

This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

  • Pingback: There Must Be Better Ways

  • http://kaistizen.net 최재훈

    CC나 CC.NET은 자바 또는 닷넷 환경을 지원하는 게 목적이다 보니 VC++ (게임제작이면 VC++이겠죠.) 지원이 약합니다. 정확한 제품명이 기억나지 않는데, 다른 CI 도구도 있습니다. 아이미디어에서 인턴으로 일할 때, 도입하려고 준비 중이었습니다. ^^

  • http://betterways.tistory.com 김기웅

    혹시 그 다른 CI 도구라는 게 정확히 뭔지 알 수 있을까요? 혹시 이중에 있을까요?
    http://docs.codehaus.org/display/DAMAGECONTROL/Continuous+Integration+Server+Feature+Matrix

  • http://kaistizen.net 최재훈

    저도 기억이 안 나서 Wikipedia 가서 살펴봤습니다. 당시에 고려하던 CI 시스템은 buy viagra without prescription입니다. 구축하기 전이었기 때문에, 실제로 이 시스템을 선택했는지는 모르겠습니다. 저녁 9시가 다 되어 가니 메신저로 여쭤보기도 그렇네요. ㅎㅎ

    게임 스튜디오마다 자신만의 작업 방식을 추구하는 터라 다양한 환경을 지원하는 BuildBot이 적합하다는 의견이 있었습니다.

  • http://betterways.tistory.com 김기웅

    감사합니다. 살펴보니 Linux용 울펜슈타인에서 사용했다고 하네요.
    그런데 Windows를 지원하지 않는군요. (웃음) Cygwin을 이용하면 되긴 할텐데.

  • http://kaistizen.net 최재훈

    아, 윈도우 환경에 시스템을 갖추려고 하시는군요. 제대로 된 빌드 스크립트만 있으면 CC .NET도 괜찮을 것 같습니다. 이미 살펴보셨겠지만요. Wikipedia에 관련 링크가 많던데 한번 살펴보세요. ㅎㅎ

  • http://betterways.tistory.com 김기웅

    신속한 답변에 감사드립니다. 도입할 때, 프로그래머와 상의해봐야겠습니다.

  • http://kaistizen.net 최재훈

    도움이 되셨다니 저도 기분이 좋습니다. CI 시스템을 진지하게 고려하시는 분이 많아졌으면 좋겠습니다. ^^

  • http://betterways.tistory.com 김기웅

    넵. 저도 동감입니다~ smile

  • 강동훈

    안녕하세요~~ 저는 현재 한 회사의 인턴사원으로 들어와 있는 학생입니다.
    현재 CruiseControl.NET 설치와 매뉴얼을 만드는 작업을 하고 있는데요. 현재 SVN 저장소를 만들고 export 해서 간단한 vs2005용 코드를 릴리즈 버전으로 빌드하고 ccnet.config파일에 설정까지 완료 한 상태 입니다. 이 모든 과정은 한빛 미디어 에서 출판된 윈도우프로젝트 필수 유틸리티 라는 책을보고 따라 했구요. 하지만 CCtray에서의 example프로젝트를 Force Build 해보면 코드에는 아무 문제가 없음에도 불구하고 exception이 발생합니다. Exception 메시지를 보면

    //////////////////////////////////////////////////////////////////////////////////////////
    There was an exception trying to carry out your request. Details of the Exception are:

    Exception Message
    Unexpected exception caught on server

    Exception Full Details
    ThoughtWorks.CruiseControl.Core.CruiseControlException: Unexpected exception caught on server—-> System.IO.DirectoryNotFoundException: ‘C:\Program Files\CruiseControl.NET\server\example\Artifacts\buildlogs’ 경로의 일부를 찾을 수 없습니다. 위치: System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 위치: System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption) 위치: System.IO.DirectoryInfo.GetFiles(String searchPattern, SearchOption searchOption) 위치: System.IO.DirectoryInfo.GetFiles(String searchPattern) 위치: ThoughtWorks.CruiseControl.Core.LogFileUtil.GetLogFileNames(String path) 위치: ThoughtWorks.CruiseControl.Core.Project.GetBuildNames() 위치: ThoughtWorks.CruiseControl.Core.Project.GetMostRecentBuildNames(Int32 buildCount) 위치: ThoughtWorks.CruiseControl.Core.CruiseServer.GetMostRecentBuildNames(String projectName, Int32 buildCount) 위치: ThoughtWorks.CruiseControl.Core.CruiseManager.GetMostRecentBuildNames(String projectName, Int32 buildCount)—- 내부 예외 스택 추적의 끝—- Server stack trace: 위치: ThoughtWorks.CruiseControl.Core.CruiseManager.GetMostRecentBuildNames(String projectName, Int32 buildCount) 위치: System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) 위치: System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) 위치: System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext) Exception rethrown at [0]: 위치: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 위치: System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 위치: ThoughtWorks.CruiseControl.Remote.ICruiseManager.GetMostRecentBuildNames(String projectName, Int32 buildCount) 위치: ThoughtWorks.CruiseControl.WebDashboard.ServerConnection.ServerAggregatingCruiseManagerWrapper.GetMostRecentBuildSpecifiers(IProjectSpecifier projectSpecifier, Int32 buildCount) 위치: ThoughtWorks.CruiseControl.WebDashboard.Plugins.ProjectReport.ProjectReportProjectPlugin.Execute(ICruiseRequest cruiseRequest) 위치: ThoughtWorks.CruiseControl.WebDashboard.MVC.Cruise.ServerCheckingProxyAction.Execute(ICruiseRequest cruiseRequest) 위치: ThoughtWorks.CruiseControl.WebDashboard.MVC.Cruise.ProjectCheckingProxyAction.Execute(ICruiseRequest cruiseRequest) 위치: ThoughtWorks.CruiseControl.WebDashboard.MVC.Cruise.CruiseActionProxyAction.Execute(IRequest request) 위치: ThoughtWorks.CruiseControl.WebDashboard.MVC.Cruise.ExceptionCatchingActionProxy.Execute(IRequest request)

    //////////////////////////////////////////////////////////////////////////////////////////

    이렇게 나옵니다.ㅠㅠ 계속적으로 문제원인을 찾고있지만 아직 방법을 찾고 있지 못하고 있습니다.
    혹시 원인이나 의견이 있으시다면 도움의 말씀 주시면
    정말 고맙겠습니다.
    감사합니다

  • http://kaistizen.net 최재훈

    디렉터리를 못 찾는다는 예외이니 그 디렉터리 경로를 살펴보는 수밖에 없겠는데요. 이 오류 메시지론 그 정도밖엔 모르겠습니다. 이미 살펴보셨으리라 생각하지만서도.

  • 강동훈

    안녕하세요. 아까 ccnet.config 파일을 약간 수정해서 이번에는
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    System.ArgumentException: 경로에 잘못된 문자가 있습니다. 위치: System.IO.Path.CheckInvalidPathChars(String path) 위치: System.IO.Path.Combine(String path1, String path2) 위치: ThoughtWorks.CruiseControl.Core.Util.ProcessInfo.RepathExecutableIfItIsInWorkingDirectory() 위치: ThoughtWorks.CruiseControl.Core.Util.ProcessInfo..ctor(String filename, String arguments, String workingDirectory) 위치: ThoughtWorks.CruiseControl.Core.Tasks.DevenvTask.AttemptToExecute(String workingDirectory) 위치: ThoughtWorks.CruiseControl.Core.Tasks.DevenvTask.Run(IIntegrationResult result) 위치: ThoughtWorks.CruiseControl.Core.Project.RunTasks(IIntegrationResult result, IList tasksToRun) 위치: ThoughtWorks.CruiseControl.Core.Project.Run(IIntegrationResult result) 위치: ThoughtWorks.CruiseControl.Core.IntegrationRunner.Build(IIntegrationResult result)
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    이런 결과를 얻었습니다.
    도대체 경로가 어딘지 모르겠습니다.ㅠㅠ
    감사합니다.

    • Justin96

      cc.net 버전이 높아지면서 생기는 문제같은데요…
      현재 사용버전 Version : 1.5.7256.1
      제 경우엔 같은 에러가 발생해서 문제를 하나씩 찾아가 보니 아래의 경우에 ” ” 를 사용해서 “D:Build_ReleaseCUnit_CUnitTest40.bat” 처럼 하면 에러가 발생했습니다.

      D:Build_ReleaseCUnit_CUnitTest40.bat

      이전 버전 1.5.0.x 대에서는 해당 ” ” 사용은 에러 대상이 아니었습니다.

  • http://kaistizen.net 최재훈

    그 정도로는 짐작이 안 되는데요. 어딘가 경로를 잘못 입력했겠지만…….