7

我目前正在使用 TFS 2013(本地安装)尝试使用 LDAP 身份验证从内部 GitHub Enterprise 安装构建。

我遇到的问题是它无法访问源代码,如何配置 TFS Build 以使用特定的身份验证?

从 TFS 构建日志

异常消息:libgit2 引发错误。类别 = 净(错误)。

VS30063:您无权访问https://user:password@githubrepository.corp.company.net。(类型 LibGit2SharpException)

异常数据字典:

libgit2.code = -1

libgit2.category = 11

异常堆栈跟踪:

服务器堆栈跟踪:

在 LibGit2Sharp.Core.Ensure.HandleError(Int32 结果) 在 LibGit2Sharp.Core.Proxy.git_clone(String url, String workdir, GitCloneOptions opts) 在 LibGit2Sharp.Repository.Clone(String sourceUrl, String workdirPath, Boolean bare, Boolean checkout, TransferProgressHandler onTransferProgress, CheckoutProgressHandler onCheckoutProgress, Credentials credentials) 在 Microsoft.TeamFoundation.Build.Activities.Git.GitPull.GitClone.GetRepository(String repositoryUrl, String workingFolder) 在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink) 处的 args、对象服务器、Object[]& outArgs)

在 [0] 处重新抛出异常:

在 System.Runtime.Remoting.Proxies.RealProxy.EndInvokeHelper(Message reqMsg, Boolean bProxyCase) 在 System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(Object NotUsed, MessageData& msgData) 在 System.Func 3.EndInvoke(IAsyncResult result) at Microsoft.TeamFoundation.Build.Activities.Git.GitPull.GitRepositoryBase.EndExecute(AsyncCodeActivityContext context, IAsyncResult result) at System.Activities.AsyncCodeActivity1.System.Activities.IAsyncCodeActivity。在 System.Activities.AsyncCodeActivity.CompleteAsyncCodeActivityData.CompleteAsyncCodeActivityWorkItem.Execute(ActivityExecutor 执行器,BookmarkManager 书签管理器)的 FinishExecution(AsyncCodeActivityContext 上下文,IAsyncResult 结果)

跟进

我已经尝试了用于身份验证的 URL 参数(示例)

https://username:password@domain.com/user/project.git

更多跟进

完全卸载并更新到 2013 RC,错误消息也已更新,因为它不同。

我还尝试将构建控制器设置为在 github 企业安装中作为经过身份验证的 LDAP 用户运行。

4

2 回答 2

3

Libgit2 确实支持 url 凭据,但是 GitPull 的 TFS 构建活动使用 http 和 https 协议的 Microsoft.TeamFoundation.Build.Activities.Git.TfsSmartSubtransport 类覆盖了默认行为。

不幸的是,此类忽略 URL 中的凭据,而是尝试从注册表中检索凭据。

我能够使用 TFS 构建和默认的 GitTemplate.12.xaml 工作流成功地获得 TFS 构建服务器以从 gitlab 服务器中提取源代码。

设置 TFS 构建的存储库 URL,而不在 URL 中提供任何凭据。

使用以下代码加密您的凭证密码。这需要在构建服务器上运行,因为加密过程特定于执行它的本地机器。

var password = "your_password";
var bytes = Encoding.Unicode.GetBytes(password);
var bytes2 = ProtectedData.Protect(bytes, null, DataProtectionScope.LocalMachine);
var base64 = Convert.ToBase64String(bytes2);

将以下注册表设置添加到您的构建服务器。

注意:注册表中的 URL 必须与存储库的绝对 URL 完全匹配,否则 TFS 将找不到凭据。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TeamFoundationServer\12.0\HostedServiceAccounts\Build\http://githubrepository.corp.company.net]
"Microsoft_TFS_UserName"="<username goes here>"
"Microsoft_TFS_Password"="<bas64 encrypted password goes here>"
"Microsoft_TFS_CredentialsType"="Windows"

我能想到的这种方法的唯一其他替代方法是修改默认工作流程并用其他东西替换 GitPull 活动。

我并不是说这是最好的方法,但它对我有用。

于 2014-09-07T00:12:55.920 回答
0

这很奇怪。看起来 HTTP 传输应该尊重 url-encoded credentials

无论如何,设置遥控器以从其他地方获取凭据可能会更好、更安全。克隆代码是如何做到这一点的一个很好的例子:这里是如何设置回调,这里是一个如何生成凭证对象的例子。

于 2013-08-11T15:21:13.443 回答