如何向本地 TFS 验证 build.vnext 代理

How to authenticate build.vnext agent to on-premise TFS

我们有一个本地 TFS2015RC 安装。服务器是我们域的一部分。

在同一域中的另一台服务器上配置构建代理 (build.vnext) 时,一切正常。

但是,在此域外的服务器上配置构建代理时,会发生以下情况:

使用 ConfigureAgent。ps1:

  1. 接受所有默认值
  2. 选择交互模式(e.i。未安装为 Windows 服务)
  3. 然后会出现一个身份验证对话框:
    • 我输入一个域用户(domain\user),它是 TFS 的管理员
    • 我提供这个用户的域密码。如果密码错误,对话框会提示我需要更正它(Windows 中的默认行为)
  4. 脚本继续运行,但在启动代理后它显示:

ERROR:
VS30063: You are not authorized to access http://{server}:8080/tfs

为什么身份验证失败?我如何找出它正在尝试对哪个用户进行身份验证?

我试过:

好的,我设法解决了这个问题:

  1. 在 TFS 服务器上创建用户 TFS\remotebuild
  2. 给这个本地 用户访问 TFS 代理池
  3. 授予此本地用户访问 TFS 源代码管理的权限
  4. 在生成服务器上使用与 TFS\remotebuild
  5. 相同的密码创建了一个用户 BUILD\remotebuild
  6. 当 运行 构建代理配置脚本时,当它询问服务帐户时,选择 BUILD\remotebuild 用户
  7. 当它要求 TFS 身份验证时,提供 TFS\remotebuild 用户凭据

像这样,成功了! 但是,我无法以某种方式将它设置为 "console mode" 中的 运行 (即不将其作为 windows 服务启动)。这不是什么大问题。

此后出现了一个小问题:在日志文件中我可以看到它正在尝试连接到 http://NAME-OF-TFS:8080/tfs instead of http://IP-ADDRESS:8080/tfs,但我可以通过在构建机器上的主机文件中添加一行来解决该问题。

身份

这可能涉及最多三个不同的身份,定义如下:

  • PoolAdmin - 用于将代理添加到代理池的帐户。此用户必须是您要使用的池的 Agent Pool Administrators 角色的一部分。
  • TfsServiceAccount - 代理应该用来连接到 TFS 的帐户。此帐户应属于您要使用的池的 Agent Pool Service Accounts 角色。尽管 docs 表明此角色成员资格应自动建立,但在此工作组方案中可能并非如此。
  • LocalServiceAccount - 代理将 运行 在构建代理计算机上使用的服务帐户。这可能是本地帐户或第二个域上的帐户,具体取决于您的配置。

注意:根据您的 TFS 实例的设置方式,前两个最终可能是同一个帐户。

配置

按照以下步骤配置代理。这些步骤假设您已经将代理软件解压缩到 C:\agent.

  1. LocalServiceAccount.
  2. 身份登录构建代理机器
  3. 删除所有已保存的 TFS 服务器凭据。
    • 打开控制面板 > 用户帐户 > 凭据管理器.
    • 单击Windows 凭据
    • 删除所有为您的 TFS 服务器保存的凭据。
  4. 删除 C:\agent\settings.json,如果存在。
  5. 打开 C:\Agent 和 运行 ConfigureAgent.cmd 的管理命令提示符。
  6. 按照提示操作。当提示安装为服务时,输入 Y.
  7. 当系统提示输入用户帐户时,输入 LocalServiceAccount 的凭据。
  8. 当您看到向 TFS 进行身份验证的弹出提示时,输入 PoolAdmin 的凭据。 重要:取消选中记住我的凭据复选框。

    If PoolAdmin and TfsServiceAccount are the same, instead you can remember the credentials and skip the remaining steps.

  9. 停止 VSO 代理服务。

  10. 使用 Internet Explorer,打开 URL 到您的 TFS 服务器。
  11. 当提示对 TFS 进行身份验证时,输入 TfsServiceAccount 的凭据。 重要:这一次,选中记住我的凭据复选框。
  12. 启动 VSO 代理服务。

您的新代理现在应该在池中列为在线。

参考文献: