本文通过一个案例解释TFS帐户信息同步的功能。Case包含两个问题。
问题1:我试图上载一个定制的工作项类型定义(模版)到一个团队项目中,但是遇到了这样的错误:"TF201072: 无法找到用户或组。请确认您的工作项类型定义中使用的用户和组已经被加入到Team Foundation Server"。
不难猜出,我们检查了“团队项目设置-〉组成员设置”,发现一切正常:模版中涉及的组都存在,而且成员也都正常显示在列表中。定制的工作项模版也OK,可以很成功地上载到另一个TFS服务器上。那么问题出在哪里呢?
我之前多次见过同样或类似的错误信息。它一般出现在建立团队项目失败的日志里,发生在TFS验证工作项类型阶段(这里我们上载一个定制工作项类型的时候TFS也需要首先验证它)。这个信息实际上更多情况下意味着某些用户或组在TFS的主帐户存储(在TFSIntegration数据库中)内已经存在,但是在工作项跟踪系统的数据库(TFSWorkitemtracking)缺乏相关记录。
为了验证这一点,我们运行以下SQL查询语句:
select max(sequence_id) as GSSMaxIdentitySeqID, max(last_update) as GSSLastIdentityUpdateTime from TfsIntegration..tbl_security_identity_cache
select max(seqid) as WITMaxIdentitySeqID, max(LastSyncUTC) as WITLastIdentityUpdateTime from TfsWorkItemTracking..ADObjects
我的case涉及的TFS数据库,返回的记录显示,TfsIntegration.tbl_security_identity_cache表的时间戳是当前时间,但是TfsWorkItemTracking..ADObjects的时间戳是很久以前的。这就暴露了问题所在:工作项跟踪系统的帐户信息记录和TFS主帐户信息库不同步了。
因为历史的原因,工作项跟踪系统使用其自身的帐户信息记录。它从主帐户信息库中同步帐户信息。同步操作是何时,又是如何触发的呢? 当主帐户信息发生变更的时候,TFS系统发出一个“DataChangedEvent”事件。工作项跟踪系统订阅这一事件。当事件发生时TFS调用一个工作项跟踪系统的web service来进行同步复制。
事件订阅信息记录在TFSIntegration.tblsubscription表中。打开这个表你会发现至少4条记录,类似下图。这4条记录是TFS安装时添加进来的,TFS系统自身需要使用这些记录。
现在回到我的case来,我们知道了两个账户信息库没有同步好。同步操作可能失败了,也可能根本就没有发生。如果失败了,那应用程序事件查看器中应该有相应的错误记录—我看过了,那里很干净。因此同步操作根本没发生。知道这一点之后,我们检查TFSIntegration..tblsubscription表,发现不知什么原因4条记录都丢失了。手工补上这些记录之后,问题就解决了。
完整的操作步骤是:
1. 手工添加TFSIntegration..tblsubscription表中丢失的4条记录。subscriber栏应当填写TFS service帐户的SID;最好使用web浏览器验证确保所有的address栏填写的web service 都确实可以访问;
2. 重启IIS;
3. 进行一次帐户变更操作,比如添加然后删除一个TFS组。这导致主帐户信息库变更,触发“DataChangedEvent”事件,进而触发工作项跟踪系统进行帐户信息复制操作。
4. 再次运行上面的两个SQL 查询语句。现在两个查询返回的时间戳和帐户数应当是匹配的。如果还不同步,就要检查应用程序事件管理器,看同步操作是否出现了异常。
通过上面4步骤的操作,上载定制工作项就没有问题了。
但是这时这个TFS系统的账户问题并没有完全解决--
问题2:两个月之前我在AD中建立了一个组,将所有的程序员添加进来,然后将这个组添加到TFS的一个团队项目中。这些人工作都正常。上个月我添加了两个新用户帐户到AD的这个组,但是直到现在我们都无法向这两个新人指派工作项:两个新帐户不在工作项指派下拉列表中。
我到TFS应用程序层服务器的服务管理器中查看,发现"Microsoft Team Foundation Server Task Scheduler"这个服务不在运行。手工启动这个服务,等一段时间之后再看,工作项指派下拉列表中就有新账户了。http://msdn.microsoft.com/en-us/library/ms252473.aspx 中解释了 “在AD和TFS之间的帐户信息同步”。 如果TFS部署在活动目录中,则两者间的账户同步在下列事件之一发生时进行:
· TFS应用层服务启动时;
· 一个活动目录中的组添加到TFS中时;
· 预定义的账户同步间隔时间到期时 (同步间隔定义在web.config文件中,默认为1小时)
"Microsoft Team Foundation Server Task Scheduler" 服务负责执行第三点,按期触发同步动作。在TFS 应用层服务器中,该服务应当设定为自动启动,且保持运行。否则AD中的变化将无法保证能够及时反映在TFS中。
总结:
从这个case中我们可以看到活动目录的账户信息是如何复制到TFS主账户信息库,又是如何复制到工作项跟踪系统的。相关错误的排查思路是,如果信息在三处之间不同步,首先查看应用层服务器的应用程序事件查看器,如果有同步操作异常发生,这里应当有所反映。如果这里没有相关信息,下一步应当检查是否同步操作并未如期发生。
==========
问题1中提及的SQL查询语句来自这篇MSDN论坛贴。