【问题标题】:Executing git commands inside a build job in Visual Studio Team Services (was VSO)在 Visual Studio Team Services(之前是 VSO)的构建作业中执行 git 命令
【发布时间】:2016-12-04 20:22:48
【问题描述】:

[环境:团队服务、GIT、托管构建代理]

我想创建一个能够执行以下操作的 Team Services 构建定义:

  1. 执行脚本以根据 repo 中的现有文件生成一些新文件

  2. 将这些生成的文件提交/推送回 repo

我可以毫无问题地做#1。但我不确定我该怎么做#2。

我发现我实际上能够从构建作业中运行 git.exe。但我不确定如何将凭证传递给 git。根据构建日志,它失败了,因为它试图从标准输入获取用户名。

我尝试在构建定义中添加一个类似“git config --global user.name xxxx”的步骤,但它仍然没有帮助。

这是一个受支持的方案吗?有什么建议吗?

谢谢!


编辑

我在构建脚本中尝试了以下方法:

git -c http.extraheader="AUTHORIZATION: bearer %SYSTEM_ACCESSTOKEN%" pull ...

它似乎适用于 pull 等命令。但是当我尝试推送更改时,出现以下错误:

fatal: unable to access 'https://example.visualstudio.com/SampleTeam/_git/SampleRepo/': SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054

想法?

【问题讨论】:

  • 想法:https 不需要凭证来读取回购(克隆/拉取)是回购是公开的。写入回购的问题仍然相同。因此我的回答如下。
  • 添加 -c http.extraheader 部分是为我解决的问题。据我所知,Microsoft 文档并没有说要这样做。

标签: git azure-devops azure-pipelines


【解决方案1】:

您可以从源代码生成的任何文件通常都被视为构建工件,并且不会添加/提交/推送到 git 存储库。

话虽如此,如果可以的话,您应该使用 ssh 网址而不是 https 网址:ssh 需要一个 ssh 密钥,如果您的私有 ssh 密钥没有密码,git 就不必查询任何内容标准输入。

另一种方法是使用Microsoft GCH (Git Credential Helper),它包含在Git for Windows 中(自Git 2.7.3,2016 年3 月起)。
有关示例,请参阅this answer。这会将您的登录名/密码缓存在 Windows 凭据存储中。

【讨论】:

  • 我确实需要将这些生成的文件签入到 repo,因为我需要构建它们。我将按照您的建议尝试 GCH 方法。谢谢 VonC!
  • 好的。现在我正在本地构建机器上尝试 GCH 方法。我安装了最新版本的 Git。我确认它确实使用“manager”作为“credential.helper”。我从那台构建机器本地推送了一些更改。但是 Git 根本没有问我的用户名/密码!我尝试从控制面板“Windows 凭据”中删除缓存的凭据。 Git 仍然没有询问用户名/密码。凭据已自动添加到 Windows 凭据。而且无论我尝试了什么,VSO 构建仍然失败...... :( 顺便说一句,构建机器已加入域,如果这很重要......
  • @TonyBlues 只是为了确定:git 只会在推送到仓库时要求凭据,而不是从一个仓库中克隆/获取(除非它是私人仓库)
  • 当我将更改推送到 repo(成功)时,它没有要求我提供凭据。奇怪...
  • @TonyBlues 您的凭据已被缓存,或者您的远程仓库不需要身份验证。
【解决方案2】:

您可以安装 Git Build Tools 扩展,然后在构建定义中添加“允许 Git 远程访问”任务。确保“选项”选项卡下的“允许脚本访问 OAuth 令牌”功能已启用。

启用 Git 远程访问

某些操作需要在期间访问远程存储库 一个构建。此任务更新代理上 Git 存储库的远程 允许访问 Visual Studio Team 上的上游存储库 服务。

要求

要使此构建任务正常工作,需要允许脚本 Access OAuth Token 选项在构建定义选项中设置。

参数

启用 Git 远程访问

远程名称:应更新的远程名称。默认为 产地。

相关任务

Restore Git Remote 应该在构建定义结束时调用 将遥控器恢复到其原始值。

已知问题

Git-Lfs 操作,如 git lfs fetch 仍然无法使用。看 这个 Git-Lfs 问题

在扩展中添加使用powershell脚本的步骤:

  1. 使用“EnableGitRemoteAccess.ps1”脚本中的代码创建一个 power-shell 脚本,并将该脚本添加到源代码管理中。
  2. 在构建定义中启用“允许脚本访问 OAuth 令牌”选项。
  3. 在构建定义中添加 PowerShell 任务并设置脚本路径以启用 git 远程访问。
  4. 在构建定义中添加另一个 PowerShell 任务以提交和推送更改。

我用来提交和推送更改的代码:

git add .
git commit -m "changesinbuild"
git push origin master 2>&1 | Write-Host

【讨论】:

  • 感谢您的建议。我没有安装扩展的权限。我已经向我们的管理员发送了请求。我实际上尝试直接使用此扩展程序使用的 PowerShell 脚本,但它仍然对我不起作用。每当我的构建作业试图将更改推送到远程仓库时,它总是抱怨“无法访问 my_repo_url。SSL 读取:错误 00000000:lib(0):func(0):reason(0),错误 10054”。 :(
  • @TonyBlues 你如何配置你的构建定义?当我在扩展中使用 PowerShell 脚本时,我没有看到任何问题。我还添加了我如何使用powershell脚本回答的步骤供您参考。
  • 感谢详细的步骤和截图!我按照这里的每一步(添加了 PowerShell 脚本并检查了“允许脚本访问 OAuth 令牌”选项)。但是我在执行之前的评论中提到的 push 命令时仍然遇到同样的错误。顺便说一句,那是在本地构建代理上。如果我在托管构建代理上执行所有这些操作,我将收到一条不同的失败消息“致命:'OAuth:*****@sample.visualstudio.com:443/SampleProject/_git/SampleRepo/'的身份验证失败"。
【解决方案3】:

很抱歉在这里回答我自己的问题...

我刚刚从某个 TFS 专家那里得到了一些提示,他给我指出了这篇文章:https://www.visualstudio.com/en-us/docs/build/scripts/git-commands,它完美地解决了我的问题。

我认为我应该分享它以帮助可能遇到与我相同情况的任何人。

这里我引用了关键步骤(重新格式化了一下):

为构建服务授予版本控制权限

转到版本控制控制面板选项卡

  • 团队服务:https://{your-account}.visualstudio.com/DefaultCollection/{your-team-project}/_admin/_versioncontrol

  • 本地:https://{your-server}:8080/tfs/DefaultCollection/{your-team-project}/_admin/_versioncontrol

版本控制 选项卡上,选择要在其中运行 Git 命令的存储库,然后选择 Project Collection Build Service (account_name)。授予您要运行的 Git 命令所需的权限。通常你会想要授予:

  • 创建分支:允许
  • 贡献:允许
  • 读取:继承允许
  • 标签创建:继承允许

授予权限后,请务必点击保存更改

启用构建定义以运行 Git.exe

  • 变量选项卡上设置此变量:system.prefergit = true
  • 选项标签上选择允许脚本访问 OAuth 令牌

使用这些设置,无需安装 Git 构建工具扩展或调整凭据管理器。您也不需要为 OAuth 令牌显式设置额外的标头。我觉得这确实是一个非常巧妙的解决方案。 :)

但非常感谢 Eddie 和 VonC 的帮助!

【讨论】:

  • 不错的答案。感谢您的跟进。 +1
  • 我按照说明进行操作,但是当我的 Powershell 脚本到达 git 命令时,什么也没有发生。我正在使用 VSTS 的开发机器上使用本地构建代理,git 已安装并正在运行。我还有什么需要做的吗?
  • 对我来说 OAuth 复选框位于:任务 --> 阶段(在代理上运行) --> 允许脚本访问 OAuth 令牌。谢谢stackoverflow.com/a/49489983/2443005
【解决方案4】:

这只是托尼的布鲁斯回答的后续。

抱歉,由于我的声誉低于 10,我无法发布链接,但所有链接都放在了 visualstudio 网站上,所以我相信你可以自己解决这个问题。

要在脚本中允许 GIT 贡献,您需要

  1. 确保您已完成 VSTS 代理先决条件中提到的所有内容

  2. 确保您遵循 /en-us/docs/build/scripts/git-commands 中的说明

    • 特别是为您的存储库上的 Project Build Service 帐户添加所需的权限 - 至少 Contribute(根据您的需要随意考虑其他权限) - this是“SSL 读取错误”的真正原因

这篇文章与 Tony 的不同之处在于,在我们的配置中(TFS 2015;安装在 Mac OS Sierra 上的 VSTS 代理)我们必须为帐户“Project Build Service”添加权限“Contribute” >” - 所以不是名称中提到“收藏”一词的帐户。另外要小心,不要将它与名为 Project Collection Build Service Accounts 的组混淆 - 我相信它可能在某些条件下使用,但默认情况下它不起作用。我要指出这一点,因为这是我不小心做的,所以我花了额外的时间调试出了什么问题。

请查看以下图片It can be found under your project --> Control Panel --> Version control --> GIT repository

另外请注意系统要求,因为在我的情况下(在 MacOS Sierra 上),带有两个特定目录的符号链接的部分变得至关重要。 OSX 的特定系统要求位于 [github]/Microsoft/vsts-agent/blob/master/docs/start/envosx.md 和状态

安装 openssl

$ brew update
$ brew install openssl

创建指向 openssl 库的符号链接 -- 这在 MacOS (Sierra) 上是必需的

$ mkdir -p /usr/local/lib/
$ ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
$ ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/

找出您的 GIT 版本

$ git --version

更新 GIT,以防您的版本低于 2.9.0

$ brew update
$ brew install git

【讨论】:

  • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
【解决方案5】:

Visual Studio Team Services (VSTS) 现在内置了执行此操作的功能:

  1. 授予帐户 Project Collection Build Service (account_name) 访问 VSTS 中相应存储库的权限。
  2. 在代理阶段,选中允许脚本访问 OAuth 令牌复选框。
  3. 现在您可以在任务中引用变量SYSTEM_ACCESSTOKEN 来访问 git 存储库: git clone https://randomusername:${SYSTEM_ACCESSTOKEN}@instance.visualstudio.com/proj1/_git/repo

参考:https://github.com/Microsoft/vsts-tasks/issues/962

【讨论】:

  • 选项现在处于代理阶段...我在寻找此复选框时死了:-D
【解决方案6】:

我遇到了同样的问题。解决方案是将 git config 选项放在 yaml 的脚本部分中。有关示例,请参阅此 GitHub 问题:

https://github.com/Microsoft/azure-pipelines-agent/issues/1925

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多