SUMTEC -- There's a thing in my bloglet.

But it's not only one. It's many. It's the same as other things but it exactly likes nothing else...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
为了适应公司不断发展壮大的需要,我们终于要准备使用Team Foundation Server了。原来的代码控制程序是在老板笔记本上面运行的VSS,经常老板出去开会,我们几个人之间就没有办法更新了。除此之外,VSS还不时地出一些莫名其妙的bug,比如说遇到过本地显示已经更新完毕,但是服务器上面还是旧版本,或者本地脱机状态时签出,但是连上服务器之后便成了签入状态(实际上本地的代码还是新代码,再次签出也不会覆盖)。其实最重要的问题还是性能太糟糕了,整个项目更新一遍需要5~10分钟,基本上每次更新的时候只好聊聊天上上网,极大地影响了工作效率。好,二话不说,赶紧装TFS。

虽然以前我用过TFS,但毕竟没装过。虽然我知道装起来很麻烦,但是没有想到居然这么麻烦。为了装TFS,我和老板折腾了两天半的时间。可能还是Beta的缘故吧,除非机器很干净,操作系统是英文版的,一路安装都是默认、默认、默认……否则你就等着吧,肯定给你弄点莫名其妙的事情出来。一路装来我是抓狂了好几次,如果有人要装TFS,也遇到了抓狂的事情,不妨参考一下我的安装历程。我在这里主要是要将安装TFS beta3 Refresh时遇到的问题记录下来,以供参考。

先说说这次安装机器的配置:
硬件
P4-2.4 HT
512MB (现升级为1.5G)
80GB * 2 (Raid 0)
软件
Win2k3 Server

作者补充:先说明白了,这次安装是在一台不干净的机器上装:已经有一个默认实例的SqlServer2000,以及使用该数据库的一个非默认站点(但是IP地址为“全部未分配”,Port80)。别问为什么,就是非要在这台机器上面装不可,咱这里就是有这要求,要是你用干净机器装就别看了,下面遇到的问题大部分只有非干净机器才会遇到。此外,我上来装的时候老板已经为了装TFS而装了一个非默认实例的SqlServer2005,以及一个SharePointPortal2003,没错,是Portal。

其他的不是关键的就不说了。正式装TFS之前,还要安装几个大头:IIS/Active Directory/Windows SharePoint Service 2.0 SP2/SQL Server 2k5/.NET FX 2.0。好吧一个个来,不过如果你还没有安装Active Directory,那么请你不要先装这个,因为装了域控会出现很多意想不到的安全问题(这种类型的问题后面会有所描述)。此外,需要安装Active Directory只是凭籍我的记忆,实际上在Beta3的安装帮助上面看到这么一段话:

Active Directory Domain Requirement

To set up and configure Team Foundation Server in dual-server deployment, you must use computers that are joined to an Active Directory domain. For single-server deployment, you can use a computer that is a member of a workgroup, or one that is joined to an Active Directory domain. When using computers that are joined to an Active Directory domain, Team Foundation Server requires an Active Directory domain that does not contain Windows NT 4.0 domain controllers. Use the following table to determine if Team Foundation Server supports your Active Directory domain functional level:

所以我不太清楚现在的版本是否可以不用安装在加入域的机器上面,但是按照以前的使用经验,似乎如果不加入域,那么就只能够在装有TFS的机器上面运行,在其他机器上面是没有办法建立项目的(似乎,不敢确定)。为了避免浪费不必要的时间,所以我选择装上域控。当然了,目前没有那么多台机器用来搞试验,而且目前项目规模也没有大到需要多台服务器的地步,因此我的安装是将AD、SQL2k5、WSS、TFS都装在一台机器上面了。如果你打算将TFS的数据层和应用层安装在不同的服务器上面,那么按照上面那一段话的解释,就必须装在连接域控的机器上面了。此外,我在这里提供一个别人的多服务器安装提示:
http://briantest.cnblogs.com/archive/2005/09/30/247416.aspx

那么怎么个安装的顺序可能比较合适呢?我觉得应该是 IIS->.NET FX 2.0->SQL SERVER 2k5->Windows SharePoint Service 2.0 SP2->Active Directory->Team Foundation Server。其中比较容易出问题的地方是SQL Server 2k5和Windows SharePoint Service 2.0 SP2。

首先说一下 SQL SERVER 2k5,其实问题很简单,也很容易解决,只是通常大家不知道这个问题才会踩地雷。TFS有一个已知的缺陷,就是必须使用SQL SERVER 2k5,而且SQL SERVER 2k5必须安装成默认的实例——你给他起任何名字都不认帐!如果你不凑巧,机器上面装了SQL SERVER 2000,并且很幸运的装成了默认实例,那不用想都知道,你装Sql Server 2k5的时候肯定会起一个名字。这么一来,到了最后你才发现无法安装,只好卸了重装,甚至你还会因此遇到域控严格的安全策略限制的问题。简单一句话:Sql Server 2k5要安装默认的实例。(补充一句:记得打开Agent服务。)

接下来说该死的Windows SharePoint Service 2.0 SP2的问题。首先,TFS要求有英文版的Template Language Pack(好奇怪的要求啊),所以你有两个选择:1、装英文版的;2、装中文版+Language pack(英文版)。如果你选择2,那么还有两点需要注意:1、下载英文版Language Pack的页面是英文的,你要选择了中文的那就等于白搭;2、Language  pack SP1可以直接下载运行,但是SP2很神奇,下载英文版的吧,说语言版本不对,可是又偏偏没有中文版的下载。不过倒是可以到WindowsUpdate去打上Language Pack SP2的补丁……。

前面这个还只是小问题,如果你的服务器上面已经在跑一些Web应用的话,那很可能你就会栽跟头!至少我在装的时候就遇到这样的问题了:因为我之前安装Sql Server 2k5的时候不是默认实例,结果无法安装下去,导致我在安装Windows SharePoint Service 2.0的时候不敢使用除了默认以外的其他选项。其中有一个选项是SharePoint Service要安装在哪个站点上面,因为我这里已经在跑一个网站xxx.yyy.com了,而默认的站点还没有被使用,因此我毫不犹豫地就选择了“默认”。这一下可就没完没了了,整个安装过程80%的时间都耗在这个上面了。SharePoint  Service的安装太搞笑了,既然能够列出来“默认”和“xxx.yyy.com”这两个站点,那么我选择安装到“默认”那就是安装到“默认站点”吧?不是!安装完之后才发现它竟然装到xxx.yyy.com上面去了,而且还捣毁了里面的诸多设施,例如web.config。它要自作主张装到别的地方吧,也不瞅瞅里面是不是空的,安装过程还没有任何警告,三下五除二就给“装好”了。要知道xxx.yyy.com是我们内部测试用的站点,这么一整,那头正在开会做演示的就只好放假了(幸好是自己内部开个小会)。

如果你现在正准备装SharePoint Service 2.0,那么请注意检查下列几点:
1、你是否已经装有某个站点,例如xxx.yyy.com。(如果没有,请跳至5。)
2、xxx.yyy.com的站点属性当中的“网站->IP地址”当中是否有一项是“全部未分配”?(如果没有,请不要选择“默认”,实践证明,你将会无法正确安装,并请跳至5。)
3、你是否打算在安装的时候选择“默认”,以避免日后可能会遇到的莫名其妙的问题?(如果不是,请跳至5。)
4、请检查所有存在的站点,是否有多个站点的地址是属于“全部未分配”?(如果是,建议只保留一个你想要安装的目标站点为“全部未分配”。虽然目前我的观测发现,只有Port为80、IP为“全部未分配”的站点才是WSS安装选项里面的“默认”,但是这一点我无法证明和保证。)
5、请检查你打算要安装的站点全空,这对后面安装结果的判断比较有帮助。

如果检查并确保这几点,那么安装应当是比较顺利的。
请注意:
Windows SharePoint Service 2.0所有的安装过程都会将“默认(站点)”等同IP地址为“全部未分配(Port:80)”对待,千万不要以为安装之前将站点暂时改成别的IP,装好了之后再改回来就完事大吉了。如果你日后打SP(包括Language Pack的SP),都很有可能会在你的xxx.yyy.com上面重新安装。破坏了你的站点不说,还可能会搞坏TFS的数据库!此外,也不要自作聪明暂停xxx.yyy.com,这样不解决问题,WSS的安装会同样自作聪明的把xxx.yyy.com给启动起来,然后装在上面。


装完了WSS,你最好不要急着装AD,赶紧先用一下试试。因为你可能会遇到一些奇怪的问题,比如我就是装完之后没有办法自动生成默认站点,然后需要我自己手动到管理平台上面生成一个,而且站点明明生成好了,却死活不让访问。更可恨的是,web.config明明修改了customErrors mode="Off",仍然没有出现详细信息。如果你也遇到这样的问题,你可以检查一下_layout所在的实际目录的web.config,先把它的customErrors mode="On" 设置为Off。我估计你再次刷新这个页面就会看到类似NT Authority\Network Service读取或者写入某个文件的权限被拒绝这样的提示了。假如你遇到的是这样的问题,请检查C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files这个目录的安全性设置,看看里面有没有加上NT Authority\Network Service。如果没有,请加上这个特殊帐号(如果你手动输入不认,那么请用搜索-〉高级-〉立即搜索找到这个帐号)。你需要给它加上的权限是:列出/执行、读取/列表、写入/新建、附加/新建目录。如果你的系统里面干脆没有.NET FX 1.1,那么请你看看相应版本的对应目录(出错提示信息里面就应该有啦)。

如果你曾经在安装完WSS和AD之后,出现了某些问题(比如我上面遇到的站点安装错误问题),把WSS卸载了重装,那么你就会出现了第一次所没有遇到的问题——无法为站点选择一个模版,也就是说装到最后一个选择模板的步骤(访问类似 localhost/sites/mysitename/_layouts/1033/templatepick.aspx 的网址),可能会发现ASP.NET出错了,但是访问比如说根目录上的文件则是正常的。那么你可以检查一下_layout所在的实际目录的安全性设置,看看里面有没有加上NT Authority\Network Service。如果没有,请加上这个特殊帐号(请参考上一段的设置),不过这里我建议把这个帐号加在_layout所在的目录上面,而不是_layout目录上面,因为其他目录估计也有类似的问题。我估计这是由于AD的安全性提高所引起的。

作者补充:
请注意!不要安装SharePoint Portal 2003,装了这个东西TFS的安装就无法开始,因为它会告诉你TFS和SPP2003不兼容!我卸载WSS有一小部分原因跟这个有关。


如果你很不幸,和我一样,不仅仅卸载了WSS,还卸载了Sql Server 2k5重装,那么你可能还会遇到两个小问题。第一个和上面WSS的_layout目录比较类似,你要看看Reporting Service 所使用的目录有没有Network Service的权限设置。另外一个小问题是,重装Sql Server 2k5时,可能会无法顺利安装其中的Reporting Service,这可能是由于卸载WSS不完整造成的。如果遇到这个问题请不要担心,装完了WSS再回过头来装Reporting Service就好了。

在经历完这么多的劫难之后,我这里的前置条件所要求的软件已经全部正确安装完毕。接下来装TFS就没有什么惊险的地方了,不过装完之后的实验还是遇到3个不大不小的问题,折腾了我半天的时间,这几个问题都是无法创建一个新的项目。第一次遇到的问题实在新项目建立滚动条到了大约80%的时候出错,提示说:

Time: 2006-1-21 0:42:09
Module: Engine
Event Description: TF30162: Task "SharePointPortal" from Group "Portal" failed
Exception Type: Microsoft.TeamFoundation.Client.PcwException
Exception Message: Unable to connect to the Windows SharePoint Services at MYNETDEV
Exception Details: The Project Creation Wizard was not able to connect to the Windows SharePoint Services
at MYNETDEV. The reason for the failed connection cannot be determined at this time.
Because the connection failed, the wizard was not able to complete creating
the Windows SharePoint Services site.
Stack Trace:
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.Execute(ProjectCreationContext context, XmlNode taskXml)
   at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.TaskExecutor.PerformTask(IProjectComponentCreator componentCreator, ProjectCreationContext context, XmlNode taskXml)
   at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.RunTask(Object taskObj)
 --   Inner Exception   --

后面的Inner Exception就不罗列了,太长。这个问题到Google上面一搜,就会发现这个问题是TFS上面注册的Windows SharePoint  Service的Admin站点端口号错误,即,它跟实际上WSS管理站点的端口号不一致造成的。你想,TFS想要连到WSS管理站点却给错了Port号,那么出这个错误确实很正常。大家可以使用下列地址看看是否属于这个问题:
http://localhost:8080/services/v1.0/Registration.asmx?op=GetRegistrationEntries
在这里点击“Invoke”(不要在文本框里面填东西),然后查找WssAdmin,就应该看到类似这样的信息:

<RegistrationEntry>
   <Type>Wss</Type>
-  <ServiceInterfaces>
-   <ServiceInterface>
     <Name>WssAdminService</Name>
     <Url>http://MYDOMAIN:17012/_vti_adm/admin.asmx</Url>
 </ServiceInterface>
 ...
</ServiceInterfaces>
<RegistrationEntry>
  
很明显,注册的Port是17012,而我也不知道怎么去修改TFS的注册信息,只好修改WSS管理站点的Port号了。这个问题是两方面引起的,一个是每次WSS安装的时候,都会以某种方式生成跟上一次不一样的Port号。而同时不知道为什么,TFS只得到了第一次WSS安装时的管理站点Port号。结果就成这样了。如果你的WSS没有装了又卸,我估计是不会出这样的问题的。

在解决完之后,我再次新建一个项目,结果出现另外一个错误,Log如下:

2006-1-24 10:11:14 | Module: Engine | Thread: 6 | Running Task "SharePointPortal" from Group "Portal"
---begin Exception entry---
Time: 2006-1-24 10:11:25
Module: Engine
Event Description: TF30162: Task "SharePointPortal" from Group "Portal" failed
Exception Type: Microsoft.TeamFoundation.Client.PcwException
Exception Message: Client found response content type of 'text/html', but expected 'text/xml'.
The request failed with the error message:
--
<html>
   <head>
      <title>??????????????????
</title>
   </head>
   <body>
      <h1><font face=Verdana color=#ff3300>??????????????????????????????
</font></h1>
      <p>
      <font face=Verdana>
        ??????????????? Web ????????????????????? Web ??????????????????????????????????????? Web ??????????????????????????????????????????????????????
</p>
   <p>
   <b>?????????????????????:
</b> ?????????????????????????????????????????????????????? Web ?????????????????????????????????????????????????????????????????????????????????????????????????????????
 </p>
   </body>
</html>
--.
Stack Trace:
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.Execute(ProjectCreationContext context, XmlNode taskXml)
   at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.TaskExecutor.PerformTask(IProjectComponentCreator componentCreator, ProjectCreationContext context, XmlNode taskXml)
   at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.RunTask(Object taskObj)
 --   Inner Exception   --

天地良心,上面那些???不是我搞的什么花样,这确实就是TFS给我的Log——他的Log竟然不支持中文。我看到那么一大堆的问号,就在哪里后悔这个操作系统为什么不是英文的,.NET FX为什么不是英文的。后悔也没有用,只能动手去解决。上网搜索了一大通,都没有找到相关的解决方案,倒是看到有几个人遇到了和我相似的问题。但是我在网上倒是看到有一个帖子说,某个CLSID为{BA....-...-...-.....}的DCOM服务无法启动,可能会导致类似的另外一个问题(其实错误信息完全不一样,只不过他原文就是这么说的)。然后我查看事件查看器,发现里面确实有一大堆的DCOM警告。顺着搜索,发现是netman这个dcom组件的安全性设置里面没有加上NT AUTHORITY/Network Service。我给这个帐号加上了“激活”和“本地运行”两个权限之后,却发现还是出现同样的错误。不过值得安慰的是,事件查看器里面已经不再出现这个错误记录了。

可是问题还是没有解决啊!只好用Reflector看TFS到底在搞什么鬼,结果发现他是在访问localhost/_vti_bin/sites.asmx时出错的。我手动浏览了一下这个“页面”,结果发现果然无法运行!提示是“Web应用程序无法运行”云云,但是我却可以访问localhost/report里面的页面。这个问题我是整来整去都没整出问题所在,后来我认真搜索了一下事件查看器,发现有一个错误是.NET FX 1.1发出的,说同一个Web应用无法同时运行两个版本的.NET FX。于是我火了,只好死马当活马医了——把localhost/_vti_bin这个虚拟目录的ASP.NET调整为使用.NET 2.0,结果竟然可以访问了。我想难道是.NET 1.1的毛病?又把它改回到.NET 1.1,结果更神奇,竟然还是能够访问(语言有点不一样,一个是中文一个是英文,莫名其妙)。心想,好了吧,这回可以了吧,用TFS再次建立新项目,结果更加神奇:竟然一开始就报错!说Reporting Service无法启动之类的信息。仔细想想,会不会还是跟那个无法同时运行两个版本的.NET FX有关呢?于是乎又看了一眼事件查看器,一看就明白了:这回又发现一个几乎相同的记录,只不过这次是.NET 2.0发出的。这下子我彻底火了,干脆直接把默认站点给改成.NET 2.0,结果Reporting Service是好了,但后面又回到刚才那个content type不符合的问题了!浏览sites.asmx也恢复提示“Web应用程序无法运行”,噢,天啊!抓狂了!冷静下来,才发现默认站点下面有好几个虚拟目录,仔细一看才发现这几个地方的ASP.NET版本的设置还不一样!我把每一个都改成.NET 2.0之后,一切都正常了。

事后分析:WSS使用的是.NET 1.1,TFS用的是2.0。localhost包括那些_vti_bin等虚拟目录都是WSS建立的,所以都配置成.NET 1.1,而Report这个虚拟目录是TFS建立的,因此用的是.NET 2.0。他们用的都是同一个应用程序池,所以绝对是不可能同时运行的。从后来出现的各种现象看,TFS会首先访问Report目录下面的Web service,所以.NET 2.0就起来了。而建立新项目的后期需要用Wss建立一个portal,于是需要访问_vti_bin这个虚拟目录,于是需要启动.NET 1.1,但是这个时候应用程序池已经被2.0占领了,结果.NET 1.1就到事件记录上面击鼓鸣冤。而我更改_vti_bin的ASP.NET的设置时,所在的应用程序池就重启了。后来在我改回来用.net 1.1之后,我首先手动访问了_vti_bin里面的东西,应用程序池就被.NET 1.1占领了。这导致了后来建立新项目时Reporting Service访问失败,以及.NET 2.0到事件记录上面击鼓鸣冤。

希望这里写的一大堆文字对安装TFS遇到问题的朋友有所提示和帮助。其实TFS的安装使用可能会遇到的问题会很多很多,大部分我都没有机会见识。所以如果不是上面罗列的问题,要是你问我估计也是白问。我的建议是多用Google搜一下,尤其是论坛搜索,应该会有所帮助的(要搜英文哦)。

末尾,预祝新春愉快!
-
posted on 2006-01-24 18:14  Sumtec  阅读(12555)  评论(17编辑  收藏  举报