如何在TFS Build中使用私有存储库配置libgit2?

时间:2013-08-09 15:43:52

标签: tfs tfsbuild libgit2 libgit2sharp tfs2013

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

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

来自TFS构建日志

  

异常消息:libgit2引发了一个错误。 Category = Net(错误)。

     

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

     

异常数据字典:

     

libgit2.code = -1

     

libgit2.category = 11

     

异常堆栈跟踪:

     

服务器堆栈跟踪:

     

at LibGit2Sharp.Core.Ensure.HandleError(Int32 results)      at LibGit2Sharp.Core.Proxy.git_clone(String url,String workdir,GitCloneOptions opts)      at 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 [] args,Object server,Object []& outArgs)      在System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg,IMessageSink replySink)

     

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

     

at 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.AsyncCodeActivity 1.System.Activities.IAsyncCodeActivity.FinishExecution(AsyncCodeActivityContext context,IAsyncResult result)      at System.Activities.AsyncCodeActivity.CompleteAsyncCodeActivityData.CompleteAsyncCodeActivityWorkItem.Execute(ActivityExecutor executor,BookmarkManager bookmarkManager)

跟进

我已尝试使用URL参数进行身份验证(示例)

  

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

更多跟进

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

在URL中没有任何凭据的情况下设置TFS构建的存储库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活动。

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

答案 1 :(得分:0)

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

在任何情况下,设置遥控器以从其他地方获取凭据可能会更好,更安全。克隆代码是如何执行此操作的一个很好的示例:here's如何设置回调,以及here's如何生成凭证对象的示例。