我正在尝试通过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令牌的选项。我已启用此选项,如下图所示,但仍然出现相同的错误。
git clone 命令似乎无法访问令牌,并且一直在询问凭据。我还测试了 git checkout ,它看起来可以正常运行。问题主要出在 clone 命令上。
答案 0 :(得分:0)
在尝试了许多不同的解决方案之后,我设法使其工作了。第一步,如我在问题中提到的,我启用了代理中的选项以允许脚本检索OAuth令牌。
这似乎还不够,因为它还需要在请求中传递令牌。为了做到这一点,我应用了以下更改:
$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的前面。我在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命令而没有任何问题。