TFS 2010의 소스 서버 수작업 구성
예전 글에서, 소스 서버를 TFS 2008에 연동하는 방법과 효과를 설명해 드린 적이 있는데요.
TFS Team Build + Source Server = 소스 코드 디버깅
; https://www.sysnet.pe.kr/2/0/600
TFS Team Build + Symbol Server
; https://www.sysnet.pe.kr/2/0/599
Symbol Server 생성
; https://www.sysnet.pe.kr/2/0/323
TFS 2010에서 좋은 소식이 있다면 TFS 2008에 비해 자동화된 구성이 가능합니다.
Enabling Symbol and Source Server Support in TFS Build 2010 Beta 1
; http://blogs.msdn.com/b/jimlamb/archive/2009/06/15/enabling-symbol-and-source-server-support-in-tfs-build-2010-beta-1.aspx
그런데, 팀 빌드가 아닌 수작업 배치파일(.bat)에서 돌려야 할 필요가 있어서
그때의 TFS 2008 구성을 가지고 배치로 바꿔보았는데요.
ssindex.cmd 실행 부분에서 자꾸만 다음과 같은 오류가 발생합니다.
ssindex -SYSTEM=TFS -SYMBOLS="D:\...\bin" -SOURCE="D:\...\"
--------------------------------------------------------------------------------
ssindex.cmd [STATUS] : Server ini file: C:\Program Files (x86)\Debugging Tools for Windows (x86)\srcsrv\srcsrv.ini
ssindex.cmd [STATUS] : Source root : D:\...
ssindex.cmd [STATUS] : Symbols root : D:\...\bin
ssindex.cmd [STATUS] : Control system : TFS
ssindex.cmd [STATUS] : TFS program name: tf.exe
ssindex.cmd [STATUS] : TFS Label : <N/A>
ssindex.cmd [STATUS] : Old path root : <N/A>
ssindex.cmd [STATUS] : New path root : <N/A>
--------------------------------------------------------------------------------
ssindex.cmd [STATUS] : Running... this will take some time...
ssindex.cmd [STATUS] : Server name not returned by tf.exe info for D:\...\.Skipping all files in the working folder.
예전에도 "Server name not returned by tf.exe" 오류를 겪은 적이 있었는데요.
소스 서버 구성, 그 외의 이야기
; https://www.sysnet.pe.kr/2/0/603
위의 경우에는 ActivePerl 설치 과정 중에 PATH가 잘못 잡혀서 발생했던 것에 반해, 이번에는 모든 경로가 정상적으로 잡혀있는데도 그와 같은 오류가 발생했습니다.
휴~~~ 한숨 먼저 짓고. 배워본 적도 없는 Perl 소스 코드를 이렇게 해서 또 뒤집어 보는 군요. ^^;
"C:\Program Files (x86)\Debugging Tools for Windows (x86)\srcsrv" 폴더에 있는 "tfs.pm"을 메모장으로 열어서 다음과 같은 코드를 찾아냈습니다.
$hProc = ExecTFSCmd($self, $SourceRoot, "workfold");
while (<$hProc>)
{
chomp;
if (m/Server\s+:\s+(.*)/i)
{
$PreferredServer = $1;
}
}
close($hProc);
# Confirm the results.
if ( defined $PreferredServer )
{
$Server = $PreferredServer;
}
if ( ! defined $Server )
{
::status_message("Server name not returned by $$self{'TFS_CMD'} info for $SourceRoot.".
"Skipping all files in the working folder.");
return;
}
while 문 사이에다가 "print $_;" 코드를 넣어서 살펴보니, 정상적으로 "tf.exe workfold"가 실행되었다는 것과 그 콘솔 출력 내용이 올바르다는 것이 확인되었습니다. 그런데, 왜? $PreferredServer 변수에는 아무런 값이 안 들어오는 것인지...? ^^;
가만히 살펴보다가 음... "m/Server:\s+(.*)/i" 정규 표현식 잘못임을 알게되었습니다. 실제 tf.exe workfold의 출력문은 다음과 같은데,
D:\...>tf workfold
===============================================================================
Workspace : MYPC (TESTDOMAIN\MyUser)
Collection: http://mypc:8080/tfs/defaultcollection
$/TestSolution: D:\...
아하~~~ TFS 2010부터 Collection이 지원되면서 예전 "Server :" 자리에 "Collection:"이 대체하고 있었기 때문에 정규표현식에서 못 걸러낸 것입니다. (애초부터, 그냥 웹 서비스를 호출했으면 좋았지 않았을까요?)
그래서, 결국 tfs.pm에 들어있는 Perl 코드를 다음과 같이 변경해 주면 TFS 2010에서도 정상적으로 소스 코드 인덱싱이 됩니다.
[TFS 2008 용 tfs.pm 파일 내용]
while (<$hProc>)
{
chomp;
if (m/Server\s+:\s+(.*)/i)
{
$PreferredServer = $1;
}
}
==>
[TFS 2010 용 tfs.pm 파일 내용]
while (<$hProc>)
{
chomp;
if (m/Collection:\s+(.*)/i)
{
$PreferredServer = $1;
}
}
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]