在我们的代码库中,有两个常用的资源存储库别名用于模板存储库。
简短版本:是否可以通过模板内的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
我正在尝试很多变量,并且可以在日志中看到这些变量已按预期填写,但我想避免必须更新所有调用管道。那么我们不妨将所有的存储库资源声明更改为一致的别名。
我知道在这种情况下,我可以参考签出的存储库来获取我想要调用的其他模板块,但我有另一个管道也调用不签出存储库并且需要别名的模板块.
您可以在模板 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