从构建管道推送到本地 Azure DevOps Git

Push to local Azure DevOps Git from Build Pipeline

短版

有人能告诉我如何在 Azure DevOps 构建管道中设置 "Command Line Script" 任务,将更改推送到本地 Git 存储库(事实上,管道所基于的 Git 存储库)?

无论我尝试什么,我的脚本总是在打印后超时 Pushing commits to git.

更长的版本

我们正在将现有 Java/Maven 项目从 Jenkins 构建服务器迁移到 Azure DevOps 构建环境,我正在尝试建立一个模仿 Jenkins "Release Staging" 功能的构建管道。

我的第一次尝试是直接在签出的源上调用 Maven 发布插件。这涉及到几个障碍,其中大部分我都能够以一种或另一种方式克服:

  1. 标准 Azure DevOps git 环境没有设置所需的配置值 "user.email" 和 "user.name";这可以通过在推送之前在单独的 "Command Line Script" 任务中调用 git config 来解决。
  2. Azure DevOps 检查 "detached HEAD state" 中的源 - 为了解决这个问题,安装脚本任务也调用 git checkout master

设置完成后,我的 Maven 调用脚本将运行到发布插件尝试推送到 Git 的位置;日志文件中的相应行读取

[INFO] Executing: cmd.exe /X /C "git push https://xxx.visualstudio.com/YYY/_git/zzz refs/heads/master:refs/heads/master"
[INFO] Working directory: D:\a\s</code>

在那之后,直到超时才会发生任何事情(至少,不会记录任何内容):

##[error]The operation was canceled.
##[section]Finishing: Maven pom.xml

为了找出导致此问题的原因,我尝试了一些方法,其中包括

但没有成功。我现在 运行 不知道如何让 git push 工作 - 有没有人可以帮助我?

P.S.: 你可能会说,就 Azure DevOps 而言,我是一个新手,所以我肯定不知道该系统的所有技巧和功能。特别是,我不知道是否有任何东西提供与 Maven 发布插件相同的功能。我们确实使用 Azure DevOps 包管理,但我们希望为快照和发布构建保留单独的源(像 Nexus 这样的工具),所以我们必须有一种机制来自动推进发布号、签出和返回以及构建打包模块并将其发布到发布提要。

如果有人可以提出实现该目标的替代方法,我也乐于接受建议。

要将更改推送到 Azure DevOps,您应该将您的凭据集成到 Git 存储库 URL:

  • 首先,创建一个 PAT 如果没有。
  • 然后使用下面的命令推送:

    git push https://Personal%20Access%20Token:PAT@xxx.visualstudio.com/YYY/_git/zzz master
    

您不必走 PAT 路线进行身份验证 - 根据 this,如果您的存储库是与构建管道相同的 Azure DevOps 项目的一部分,则凭据应该可以流动。是否有可能您尚未授权构建代理写入您的回购协议?需要两件事:

  • 在您的 Azure DevOps 项目的项目设置 -> 存储库 下,允许 项目集合构建服务 实体 贡献者 对适当回购(或所有项目回购)的权利。

  • 允许脚本在 "Agent job" 设置下访问 OAuth 令牌:

另请注意一个错误的陷阱:这不适用于子模块操作,因为 DevOps 不会自动将凭据流向子模块实例,唯一的症状是静默挂起。已找到手动流动凭据的解决方法 here

即使正确设置了允许脚本访问 OAuth 令牌以及 Repo 权限,我在本地 DevOps 服务器中也遇到了同样的问题(git 推送挂起直到超时)。

在我的例子中,问题是 Build Agent 在 PATH 环境变量的开头添加了一个路径——对我来说是 'C:\ins\agent\externals\git\cmd\'。 这里有一个旧的 git 版本(git 版本 2.18.0.windows.1)驻留并在构建代理管道的上下文中启动。您可以通过向构建任务添加 "git --version" 调用来验证这一点。

我没有调查为什么旧的 git 版本不起作用,只是在管道任务[=10= 中使用了我最新的 git.exe 的完整路径限定]

"C:\Program Files\Git\bin\git.exe" push origin master

并且使用此 git 版本 - 当前 "git version 2.24.0.windows.2" 一切正常。 当然,将您的 Build Agent 更新到具有较新 git.exe 的版本也应该可以解决此问题。

答案与 Azure Devops 现在的工作方式已经过时了。要在您的管道中启用授权,您应该在您的步骤中使用 checkout 架构 属性,以便您可以为以后的 git 命令保留凭据。

- checkout: self
  persistCredentials: true