어제는 거의 하루 종일
CruiseControl.NET(이하 ccnet) 설정에 시간을 쏟았는데
너무 간단한 문제 때문에 너무 많은 시간을 소비하게 되서 향후에 이 문제로 고생하는 사람이
없었으면 하는 마음으로 블로깅을 하기로 마음을 먹었다.
ccnet에서 VS 2003 프로젝트를 빌드하는 방법은 여러가지 방법이 있겠지만,
대표적인 방법은 ccnet에서 추천하지 않는 <devenv> 작업을 직접 쓰는 방식과
NAnt를 활용하는 방법이 있다. 두 가지 다 그렇게 복잡하지 않은 방법이라 그 이상의 설명은 생략한다.
어느 방법을 사용하던 결국 VS 2003 프로젝트 컴파일을 위해서는 devenv.com을 이용해야 하는데 문제는 이 프로그램에 있었다(devenv.com은 콘솔에서 프로젝트나 솔루션을 컴파일하기 위한 프로그램으로 실제 빌드는 devenv.exe를 통해서 이루어지며 그 과정이나 결과 메시지를 콘솔로 출력해주는 역할을 한다). 분명 명령 실행창에서는 잘 이루어지는 빌드가 ccnet에서 실행을 하면 세월아네월아 하면서 멈춰있는 것이다. 또 언제나 멈추는 것도 아니고 빌드 과정에서 특정 오류가 발생하면 멈추지만 깨끗히 성공하는 경우에는 멈추지 않는다.
구글링을 통해 같은 문제를 경험한 이들은 이 문제가 빌드 과정에서 UI 창이 표시되기 때문에 멈추어있는 것이다라는 의견이었다. 그리고 해결방법도 없었다. VS 2003 프로젝트에 자동화된 빌드 도구를 이용하는 사람들은 10번 중 2번 정도의 빈도로 이런 문제를 겪었으며 그때마다 수동으로 죽이고 다시 빌드했다 라고 했다. 하지만 우리의 경우는 솔루션에 프로젝트가 많아서인지 빌드가 실패하는 족족 멈추었기 때문에 그냥 사용하는 것은 옵션이 아니었다.
해결 방법은 의외로 간단했다. ccnet 서비스를 로컬 시스템 계정이 아닌 특정 사용자 계정으로 실행하게 하니 문제가 해결되었다.
devenv.com은 실제로 devenv.exe를 이용하여 빌드를 수행하며 단순히 이때의 출력을 콘솔로 돌려주는 역할을 하는 것으로 보인다. 그런데 devenv.exe는 기본적으로 UI 프로그램이며 실제로 창을 표시하지는 않아도 특정 경우에 현재 사용자의 데스크탑 세션(또는 윈도우 세션)에 접근을 시도하는 것으로 추정된다. 그리고 이 경우에 데스크탑 세션을 가지지 못한 로컬 시스템 계정의 경우는 빌드가 멈추게(hang) 되는 것으로 보인다. 따라서 ccnet 서비스를 특정 사용자 계정으로 실행하도록 설정하거나 또는 데스크탑과 상호 작용이 가능하도록 설정하면 이 문제를 해결할 수 있다.
우리가 삽질했던 시간이 다른 이의 시간을 조금이라도 아껴줄 수 있기를. ㅠ.ㅠ