如何使用PowerShell任务在Azure DevOps Server发布管道中运行Git命令(git clone)

时间:2020-10-17 21:35:31

标签: git powershell azure-devops

我正在尝试通过Azure DevOps服务器中的PowerShell任务执行git命令,并且遇到身份验证问题。更具体而言,该任务将继续退出,并显示错误代码1,因为它要求输入用户名和密码。我要执行的git命令是:

$wikiUrl = 'https://azure-devops-server/tfs/Common/MainProject/_git/MainProject.wiki'
git clone $wikiUrl $tmpDirName --depth 1

# Editing files content

git -C $tmpDirName add $statusPageRepoPath
git -C $tmpDirName commit -m 'update status page'
git -C $tmpDirName push

出于安全原因,我不想添加用户名和密码作为参数。我有兴趣使其与从执行中检索而未明确定义的用户凭证一起使用。

Microsoft解决方案的建议是在代理中启用允许脚本访问OAuth令牌的选项。我已启用此选项,如下图所示,但仍然出现相同的错误。

enter image description here

git clone 命令似乎无法访问令牌,并且一直在询问凭据。我还测试了 git checkout ,它看起来可以正常运行。问题主要出在 clone 命令上。

1 个答案:

答案 0 :(得分:0)

在尝试了许多不同的解决方案之后,我设法使其工作了。第一步,如我在问题中提到的,我启用了代理中的选项以允许脚本检索OAuth令牌。

enter image description here

这似乎还不够,因为它还需要在请求中传递令牌。为了做到这一点,我应用了以下更改:

  1. 我在 git clone 之前更改了存储库的URL。最初的URL是这个:
    $wikiRawUrl = 'https://azure-devops-server/tfs/Common/MainProject/_git/MainProject.wiki'
    
    而新的就是这个:
    $wikiRawUrl = 'https://azure-devops-server/tfs/Common/MainProject/_git/MainProject.wiki'
    $url = "$($wikiRawUrl)".Replace("https://", "")
    $wikiUrl = "https://$($env:SYSTEM_ACCESSTOKEN)@$url"
    
    它将访问令牌env:SYSTEM_ACCESSTOKEN添加到存储库URL的前面。

  1. 我在git命令上添加了额外的参数,以便再次将访问令牌作为额外的标头传递给它们。此外,为了确保本地提供的证书不会出现任何问题,我还明确地将https.sslbackend应用于schannel(这部分来自Azure DevOps发布管道的反向工程本机任务)。因此,初始命令如下:

    git clone $wikiUrl $tmpDirName --depth 1
    
    # Editing files content
    
    git -C $tmpDirName add $statusPageRepoPath
    git -C $tmpDirName commit -m 'update status page'
    git -C $tmpDirName push 
    

    和新的是这些

    git -c http.extraheader="AUTHORIZATION: bearer $($env:SYSTEM_ACCESSTOKEN)" -c http.sslbackend="schannel" clone $wikiUrl $tmpDirName --depth 1
    
    # Editing files content
    
    git -C $tmpDirName -c http.extraheader="AUTHORIZATION: bearer $($env:SYSTEM_ACCESSTOKEN)" -c http.sslbackend="schannel" add $statusPageRepoPath
    git -C $tmpDirName -c http.extraheader="AUTHORIZATION: bearer $($env:SYSTEM_ACCESSTOKEN)" -c http.sslbackend="schannel" commit -m 'update status page'
    git -C $tmpDirName -c http.extraheader="AUTHORIZATION: bearer $($env:SYSTEM_ACCESSTOKEN)" -c http.sslbackend="schannel" push 
    

以上所有更改均正常运行,最终我能够在PowerShell中使用git命令而没有任何问题。