访问 Azure Devops yaml 管道模板中的 resources.repositories

问题描述 投票:0回答:1

在我们的代码库中,有两个常用的资源存储库别名用于模板存储库。

简短版本:是否可以通过模板内的resources.repositories对象以某种方式访问正在使用的别名?

我希望能够进行条件签出并使用已声明的资源别名调用另一个模板,而不必更改一堆调用管道以在参数中设置。

详细信息:下面的yaml模板中的第一个if引用了resources.repository对象,当我手动触发管道时会导致此错误:

/debug.yml@commonTemplates (Line: 11, Col: 3): Unrecognized value: 'resources'. Located at position 24 within expression: contains(convertToJson(resources.repositories),'commonTemplates'). 

这是模板:

parameters:

- name: templateResourceAlias
  type: string
  default: "commonTemplates"

steps:
- checkout: self

- ${{ if contains(convertToJson(resources.repositories),'commonTemplates') }}:
  - checkout: commonTemplates
- ${{ if eq(parameters.templateResourceAlias,'commonTemplates') }}:
  - checkout: commonTemplates

- pwsh: |
    echo '$[ resources.repositories['self'].name ]'
    echo '$(repos)'

当设置变量时,

ConvertToJson 确实在调用管道中给出了有效值,但在模板中引用 resources.repositories 或特定属性(如

resources.repositories['self'].name
)刚刚给出了错误。 (名称实际上没有帮助,它给出了存储库名称而不是别名。我看不到获取别名的属性,因此尝试在 json 字符串中找到它。)

我确实尝试从调用管道发送 json 并在模板中执行包含操作,但结帐从未发生。我想知道这是否是因为换行符,所以我尝试连续使用 split 和 join 将它们替换为其他内容,但这似乎没有什么区别。 resources.repositories.keys 也没有让我到任何地方。

这是convertToJson 的结果。

{
  "self": {
    "id": "2b3f919f-dad0-4db6-8ea5-1b3dad1170b7",
    "name": "experiments",
    "ref": "refs/heads/main",
    "type": "Git",
    "url": "https://project.visualstudio.com/experiments/_git/experiments",
    "version": "0bc22a6c6bf1fe394caea5d837cd6b2f95789f4a"
  },
  "commonTemplates": {
    "id": "ac1749c6-f8e0-4188-a7de-3a1ae5928cfe",
    "name": "Templates",
    "ref": "refs/heads/main",
    "type": "git",
    "url": "https://project.visualstudio.com/Templates/_git/Templates",
    "version": "b0011c9e6cd6013c0dc4d4731f10720ca4834094"
  }
}

我可以想象,如果模板可以处于阶段或作业级别,那么这可能会起作用,这样我们就可以添加局部变量,但我们现有的结构限制我只能使用步骤而不是扩展模板。

为了完整起见,并根据要求,这是我一直在试验的调用管道。

trigger: none

name: $(Build.DefinitionName)_$(Date:yyyyMMdd)$(Rev:.r)

pool:
  vmImage: ubuntu-latest

resources:  
  repositories:  
  - repository: commonTemplates  
    type: git  
    name: Templates/Templates 

jobs:
  - job: BuildAndValidate
    displayName: Build and Validate
    variables:
      tools.ref: $[ resources.repositories['commonTemplates'].ref ]
      repos: $[ convertToJson(resources.repositories) ]
      ct:  $[ convertToJson( resources.repositories.commonTemplates) ]
      tt:  $[ convertToJson( resources.repositories.teamTemplates) ]
      exists: $[ contains( convertToJson( resources.repositories), 'commonTemplates') ]

    pool:
      vmImage: 'ubuntu-latest'

    steps:
      - template: debug.yml@commonTemplates


我正在尝试很多变量,并且可以在日志中看到这些变量已按预期填写,但我想避免必须更新所有调用管道。那么我们不妨将所有的存储库资源声明更改为一致的别名。

我知道在这种情况下,我可以参考签出的存储库来获取我想要调用的其他模板块,但我有另一个管道也调用不签出存储库并且需要别名的模板块.

templates azure-devops azure-pipelines-yaml
1个回答
0
投票

您可以在模板 YAML 文件中进行如下更新

debug.yml

# debug.yml

. . .

steps:
- checkout: self
- checkout: commonTemplates
  condition: contains(variables.resRepos,'commonTemplates')

. . .
# azure-pipelines.yml

. . .

resources:  
  repositories:  
  - repository: commonTemplates  
    type: git  
    name: Templates/Templates

variables:
  resRepos: $[ convertToJson(resources.repositories) ]
  . . .

jobs:
  - job: BuildAndValidate
    . . .
    steps:
      - template: debug.yml@commonTemplates
© www.soinside.com 2019 - 2024. All rights reserved.