使用git分支作为Azure DevOps管道中的源的另一个存储库中的Terraform模块,带有系统访问令牌

9rnv2umw  于 2023-10-22  发布在  Git
关注(0)|答案(2)|浏览(101)

我有一个Terraform main.tf文件,它从另一个git仓库调用模块。

module "ModuleName" {
  source = "git::https://[email protected]/OrgName/SW/_git/AnotherRepoName?ref=BranchName"

我的Azure DevOps Pipeline Yaml代码在ubuntu-latest上运行如下。

trigger:
  - None

pool:
  vmImage: 'ubuntu-latest'

任务如下所示:

- task: PowerShell@2
           displayName: powershell-job
           inputs:
             workingDirectory: '$(System.DefaultWorkingDirectory)/BranchPolicies/Terraform'
             targetType: 'inline'
             script: |
               write-host '$(SYSTEM_ACCESSTOKEN)'
               pwd
               $env:SYSTEM_ACCESSTOKEN = "$(System.AccessToken)"
               write-host '$(system.accesstoken)'
               git config --global http.https://dev.azure.com/OrgName/Infra.extraheader "AUTHORIZATION: bearer $env:SYSTEM_ACCESSTOKEN"
               terraform init
               terraform plan
               
           env:
             SYSTEM_ACCESSTOKEN: $(system.accesstoken)

Terraform计划失败并抛出如下错误:

│ Could not download module "ModuleName" (main.tf:58) source code from
│ "git::https://[email protected]/OrgName/SW/_git/AnotherRepoName?ref=BranchName":
│ error downloading
│ 'https://[email protected]/OrgName/SW/_git/AnotherRepoName?ref=BranchName':
│ /usr/bin/git exited with 1: error: pathspec 'master' did not match any
│ file(s) known to git

注意:出于安全原因,我也更改了日志中的OrgName和BranchNames。
为什么要查找Master分支而不是我在模块源代码的脚本中提到的BranchName?

zvms9eto

zvms9eto1#

在【组织设置】(或【项目设置】)>【管道】>【设置】页面:

  • 如果开启**Limit job authorization scope to current project选项,则System.AccessToken**令牌只能访问当前管道所在项目内的资源。
  • 如果禁用“Limit job authorization scope to current project”选项,则令牌**System.AccessToken**可以跨当前Azure DevOps组织中正在运行管道的项目访问资源。

详细内容请参见“作业授权范围"。

但是,如果要访问的模块源git存储库位于其他Azure DevOps组织中,则令牌**System.AccessToken将无法访问它。
由于令牌无法访问存储库,因此任务将无法列出存储库中的现有分支。然后,它可能会尝试搜索“
master**”作为存储库的默认分支。
在这种情况下,您需要提供一个PAT(个人访问令牌)来访问该git仓库。

mftmpeh8

mftmpeh82#

我通过如下更新脚本修复了这个问题,问题是环境变量名,它只使用AZDO_PERSONAL_ACCESS_TOKENAZDO_ORG_SERVICE_URL名称。

script: |
               $env:AZDO_PERSONAL_ACCESS_TOKEN
               $env:AZDO_ORG_SERVICE_URL="https://dev.azure.com/<Org_name>"
               git config --global http.https://<Org_name>@dev.azure.com.extraheader "AUTHORIZATION: bearer $env:AZDO_PERSONAL_ACCESS_TOKEN"

env:
    AZDO_PERSONAL_ACCESS_TOKEN: $(System.AccessToken)

相关问题