【问题标题】:How to configure libgit2 in TFS Build with private repositories?如何在 TFS Build 中使用私有存储库配置 libgit2?
【发布时间】:2013-08-11 14:49:40
【问题描述】:

我目前正在使用 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(字符串 url,字符串工作目录,GitCloneOptions opts) 在 LibGit2Sharp.Repository.Clone(字符串 sourceUrl,字符串 workdirPath,布尔裸,布尔结帐,TransferProgressHandler onTransferProgress,CheckoutProgressHandler onCheckoutProgress,凭据凭据) 在 Microsoft.TeamFoundation.Build.Activities.Git.GitPull.GitClone.GetRepository(字符串 repositoryUrl,字符串工作文件夹) 在 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] 处重新抛出异常:

在 System.Runtime.Remoting.Proxies.RealProxy.EndInvokeHelper(消息 reqMsg,布尔 bProxyCase) 在 System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(对象未使用,消息数据和 msgData) 在 System.Func3.EndInvoke(IAsyncResult result) at Microsoft.TeamFoundation.Build.Activities.Git.GitPull.GitRepositoryBase.EndExecute(AsyncCodeActivityContext context, IAsyncResult result) at System.Activities.AsyncCodeActivity1.System.Activities.IAsyncCodeActivity.FinishExecution(AsyncCodeActivityContext 上下文,IAsyncResult 结果) 在 System.Activities.AsyncCodeActivity.CompleteAsyncCodeActivityData.CompleteAsyncCodeActivityWorkItem.Execute(ActivityExecutor 执行器, BookmarkManager bookmarkManager)

跟进

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

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

更多跟进

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

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

【问题讨论】:

    标签: tfs tfsbuild libgit2 libgit2sharp


    【解决方案1】:

    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 活动。

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

    【讨论】:

    • 谢谢你,我一有机会就会去看看,这可能是我需要的工作。
    【解决方案2】:

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

    无论如何,将遥控器设置为从其他地方获取凭据可能会更好、更安全。克隆代码是如何执行此操作的一个很好的示例:here's 如何设置回调,here's 是如何生成凭据对象的示例。

    【讨论】:

    • 如果直接处理 lib2git,这些链接似乎很有帮助,不幸的是,我使用的是 TFS 接口和默认构建。不过感谢您的链接。
    • 啊,抱歉,我不是 TFS 专家。祝你好运!
    • 感谢您的回复。我们可能已经确定我们的 github 企业设置可能是问题所在。
    • 嘿汤姆 - 如果你弄清楚设置的问题是什么,那么你可以发回最终答案(也许它不支持基本身份验证或其他东西?)TFS Build 应该能够与其他 git 存储库交谈以进行构建,如果它不起作用,请告诉我们。
    • @benb1n 我与 TFS 团队合作了一段时间,最后被告知我需要为其编写自定义构建活动。我暂时放弃了,稍后再试。
    猜你喜欢
    • 2014-02-03
    • 2015-04-21
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多