[英]TFS : git clone private repository through Composer fails
当前,当我们尝试构建一个PHP项目时遇到了一个问题,该项目需要通过 TFS 构建管道在专用构建机器上托管在我们的私有TFS 本地存储库上的内部Composer包。
在我们的composer.json文件中,引用了外部和内部包。 所以,我们有这样的事情:
{
"repositories": [
{
"type": "composer",
"url": "https://composer.typo3.org/"
},
{
"type": "git",
"url": "https://servername/tfs/organisation/project/_git/repository"
},
"require": {
...
}
}
因为我们在防火墙后面,所以我们必须设置代理信息才能获取外部包。 我们这样做:
export http_proxy="http://proxy-url"
export https_proxy="http://proxy-url"
然而,当我们通过我们的代理时,我们无法获得私有包,因此我们创建了另一个步骤,在代理配置恢复后负责内部包的安装。
因此,使用我们的私有包, Composer将简单地...
git clone --mirror 'https://service_account:password@servername/tfs/organisation/project/_git/repository'
不幸的是,我们总是收到以下错误:
fatal: Authentication failed for 'https://service_account:password@servername/tfs/organisation/project/_git/repository'
我们尝试了几件事:
使用的服务帐户对相关私有存储库拥有所有权限,并用于具有所需权限的机器上的构建代理。 我们的TFS服务器和构建机器之间的连接是开放的。 我们可以执行ping tfs.server
或telnet tfs.server 443
没有任何错误。 “获取源代码”步骤在构建过程开始时也能很好地工作。 命令git clone 'https://username:password@servername/tfs/organisation/project/_git/repository'
适用于其他任何地方。
有人可以在这方面给我们一点帮助或只是一点提示吗? 将不胜感激。 有没有人遇到过这样的问题或行为?
提前谢谢了。
此致,
编辑 1,按照 PatrickLu-MSFT 的回答
以下帖子, Azure Pipelines:我变得致命:无法读取“https://github.com”的用户名:终端提示已禁用,让我们只需勾选“允许脚本访问 OAuth 令牌”选项。 所以,我们试着这样做
......但它没有用。
我们还尝试了以下事情:
git config http.extraheader "AUTHORIZATION: bearer $(System.AccessToken)"
或者
git config http.https://servername/tfs/organisation/project/_git/repository.extraheader "AUTHORIZATION: bearer $(System.AccessToken)"
然后
git clone https://servername/tfs/organisation/project/_git/repository
...没有成功。 但是,如果我们只是从命令提示符执行此操作或从浏览器访问这些 URL,则不会有任何问题。
但是,如果我们这样做
git config http.extraheader "AUTHORIZATION: bearer $(System.AccessToken)" clone https://servername/tfs/organisation/project/_git/repository
...我们得到类似“ repository.git
”的东西,它只包含 Git 文件夹的内容,而不是包本身。
编辑 2
经过许多充满欢乐的美好时光,我们终于设法得到了这样的东西:
REPO_URL=https://servername/tfs/organisation/project/_git/repository
EXTRAHEADER="AUTHORIZATION: bearer $(System.AccessToken)"
git -c http.extraheader="$EXTRAHEADER" clone $REPO_URL
我们必须为每个私有包都这样做,但它似乎可以完成这项工作。 但是对于这个解决方案,为了干净,我们必须有两个composer.json
文件:一个用于本地开发,另一个用于不包含私有包的构建管道。
同样有趣的是,以下事情不起作用:
git config credential.https://servername/tfs/organisation.integrated true
git config credential.helper store
git config http.$REPO_URL.extraheader "$EXTRAHEADER"
git clone https://servername/tfs/organisation/project/_git/repository
# OR
composer require vendor/package-name
似乎忽略了 extraheader 信息。
尝试更改存储库的顺序,以便 git repo 列在 typo3 之前,如下所示:
{
"repositories": [
{
"type": "git",
"url": "https://domain/tfs/organisation/project/repository"
},
{
"type": "composer",
"url": "https://composer.typo3.org/"
},
"require": {
...
}
}
对于这种身份验证失败错误,如果您使用 PAT 令牌来处理身份验证。 由于您将 PAT与本地 TFS 服务器一起使用,请确保您已关闭服务器上的基本身份验证。 否则你会得到一个返回的错误。
我们建议您在使用 Azure DevOps 服务器时始终关闭 IIS 基本身份验证。 仅在必要时才启用 IIS 基本身份验证。 在 Windows 计算机上启用 IIS 基本身份验证后,它会阻止您使用个人访问令牌 (PAT) 作为身份验证机制。
对于 TFS 中的克隆 url,应该如下所示:
git clone https://PAT@tfsservername:8080/tfs/Collectionname/Projectname/_git/GitReponame
如果这不起作用,因为您在代理后面。 在您原来的浏览器中使用时,请尝试暂时关闭代理。
如果问题与代理端有关,这将有助于缩小范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.