【发布时间】:2020-06-29 16:26:46
【问题描述】:
当我们尝试构建一个 PHP 项目时遇到了一个问题,该项目需要在我们的私有 TFS 本地 上托管的内部 Composer 包通过 TFS 构建管道在专用构建机器上创建存储库。
在我们的 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'
我们尝试了几件事:
- 将 auth.json 文件传递给 Composer
- 直接调用 git clone 'https://service_account:password@servername/tfs/organisation/project/_git/repository'
- 直接调用 git clone 'https://$(System.AccessToken)@servername/tfs/organisation/project/_git/repository'
- 直接调用 git clone 'https://PAT@servername/tfs/organisation/project/_git/repository'
- 直接调用 git clone 'https://PAT@MACHINE_NAME/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: I am getting fatal: could not read Username for 'https://github.com': terminal prompts disabled 让我们简单地勾选“允许脚本访问 OAuth 令牌”选项。所以,我们试着这样做
- git clone --bare https://service_account:$(System.AccessToken)@servername/tfs/organisation/project/_git/repository
- git clone --bare https://$(System.AccessToken)@servername/tfs/organisation/project/_git/repository
- git clone --bare https://$env:SYSTEM_ACCESSTOKEN@servername/tfs/organisation/project/_git/repository
...但是没有用。
我们还尝试了以下方法:
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信息被忽略了。
【问题讨论】:
-
您能否尝试以构建代理服务的身份登录,并使用正确的用户 ID 和密码在 Windows 凭据管理器中为“服务器名称”(您的 tfs 服务器机器)添加一个条目。 Git for Windows 实际上使用 Windows 凭据管理器进行身份验证。您可能还需要运行“git config --global credential.helper manager”以确保坚持。
-
嗨!感谢您的反馈意见。我用一些信息更新了这个问题。
标签: git tfs azure-devops composer-php