升级至TFS 2017后CI构建失败求助
针对TFS 2017升级后CI构建失败的解决方案建议
我之前帮团队排查过类似的TFS 2017与外部Git仓库(自建BitBucket)的CI构建认证问题,结合你描述的现象和报错信息,给你几个针对性的解决方向:
1. 解决Basic Auth的安全连接强制要求
你的报错核心是 Basic authentication requires a secure connection to the server,这是因为TFS 2017默认强制Basic认证必须通过HTTPS连接。你需要:
- 确认BitBucket服务器的克隆URL是HTTPS开头,如果之前用的是HTTP,立刻切换为HTTPS地址
- 如果BitBucket使用的是自签名SSL证书,需要将证书导入到TFS服务器和所有构建代理机器的系统信任证书存储中,避免证书验证失败
- 若暂时无法为BitBucket配置HTTPS,可以尝试修改TFS的配置(需谨慎操作):在TFS服务器上找到
web.config文件,添加或修改<appSettings>节点下的AllowInsecureBasicAuth为true,但这只是临时 workaround,不建议长期使用
2. 修正CI构建的服务账号权限
你提到CI构建由Microsoft.TeamFoundation.System发起,而手动构建使用的是[Development]\Project Collection Service Accounts,两者的权限差异很可能是问题根源:
- 检查你创建的External Git服务端点的权限,确保
Microsoft.TeamFoundation.System账号拥有该端点的使用权限(在服务端点的安全设置里添加该账号并赋予“使用”权限) - 尝试修改构建定义的服务账号,将CI构建的运行账号切换为
Project Collection Service Accounts(在构建定义的“常规”选项卡中找到“服务账号”设置,选择对应的账号) - 确认TFS构建代理服务运行的账号(通常是Network Service或自定义域账号)拥有访问BitBucket仓库的权限,必要时可以给该账号在BitBucket中配置独立的访问凭证
3. 重新验证服务端点的凭证配置
即使你新建了服务端点,也可能存在凭证未正确生效的情况:
- 删除现有External Git服务端点,重新创建,在配置过程中点击测试连接按钮,确保凭证能正常访问BitBucket仓库
- 检查BitBucket账号的Basic认证是否启用:在自建BitBucket的用户设置中,确认“Basic authentication”选项处于开启状态,部分版本的BitBucket默认会关闭该认证方式
- 若BitBucket启用了2FA(双因素认证),则不能直接使用密码,需要生成应用专用密码来替代账号密码填入服务端点
4. 排查构建代理的网络与环境问题
- 确保构建代理所在机器能正常访问BitBucket服务器,尝试在代理机器上手动用Git克隆仓库,验证网络连通性和凭证有效性
- 检查代理机器的系统时间是否与BitBucket服务器同步,时间偏差过大可能导致认证失败
附你提供的报错信息
An exception occurred while polling the repository. Error: Microsoft.TeamFoundation.Build2.Server.Extensions.ExternalConnectorException: Basic authentication requires a secure connection to the server. ---> System.InvalidOperationException: Basic authentication requires a secure connection to the server. at Microsoft.VisualStudio.Services.Common.VssBasicCredential.OnCreateTokenProvider(Uri serverUrl, IHttpResponse response) at Microsoft.VisualStudio.Services.Common.IssuedTokenCredential.CreateTokenProvider(Uri serverUrl, IHttpResponse response, IssuedToken failedToken) at Microsoft.VisualStudio.Services.Common.VssCredentials.TryGetTokenProvider(Uri serverUrl, IssuedTokenProvider& provider) at Microsoft.VisualStudio.Services.Common.VssHttpMessageHandler.<SendAsync>d__17.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.TeamFoundation.Build2.Server.Extensions.GitConnector.GetBranches(IVssRequestContext requestContext, ExternalConnection connection, Int32 timeoutSeconds) --- End of inner exception stack trace --- at Microsoft.TeamFoundation.Build2.Server.Extensions.GitConnector.GetBranches(IVssRequestContext requestContext, ExternalConnection connection, Int32 timeoutSeconds) at Microsoft.TeamFoundation.Build2.Server.Extensions.GitSourceProvider.GetMatchingBranchRefs(IVssRequestContext requestContext, BuildDefinition definition, IList`1 branchFilters) at Microsoft.TeamFoundation.Build2.Server.Extensions.GitSourceProvider.GetSourceVersionsToBuild(IVssRequestContext requestContext, BuildDefinition definition, List`1 branchFilters, Boolean batchChanges, String previousVersionEvaluated, Dictionary`2& ciData, String& lastVersionEvaluated) at Microsoft.TeamFoundation.Build2.Server.Extensions.BuildPollingJobExtension.Run(IVssRequestContext requestContext, TeamFoundationJobDefinition jobDefinition, DateTime queueTime, String& resultMessage).
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

