能否在Azure DevOps Pipeline中遍历resources.repositories?
我发现resources.repositories是一个列表,想直接对它进行遍历,于是编写了如下Azure DevOps Pipeline的YAML配置:
resources: repositories: - repository: firstRepo name: MyProject/firstRepo type: git - repository: secondRepo name: MyProject/secondRepo type: git stages: - stage: DoThing jobs: - ${{ each repo in variables.repositories }}: - template: /templates/doThing.yaml parameters: repoName: ${{ repo.name }}
运行流水线时触发错误:
/pipelines/azure-pipelines.yaml (Line: 13, Col: 7): Unrecognized value: 'resources'. Located at position 1 within expression: resources.repositories. For more help, refer to https://go.microsoft.com/fwlink/?linkid=842996
查文档得知,作业所用的所有仓库详情可通过resources.repositories这个模板上下文对象获取,但现有示例均采用运行时表达式语法,且必须指定别名(如firstRepo)和变量(如ref)才能使用,例如$[resources.repositories.firstRepo.name]。想请教是否可以实现遍历resources.repositories的操作?
目前在Azure DevOps Pipeline的编译时表达式(${{ ... }})中,无法直接遍历resources.repositories列表——因为这个上下文对象在编译阶段并非可枚举集合。不过可以通过以下两种方案实现类似需求:
方案1:将仓库信息定义为变量,同步复用
先把仓库列表定义在变量中,再在resources.repositories和遍历逻辑里复用该变量,避免重复配置:
variables: - name: repoList value: | [ {"alias": "firstRepo", "name": "MyProject/firstRepo"}, {"alias": "secondRepo", "name": "MyProject/secondRepo"} ] resources: repositories: - ${{ each repo in convertToJson(variables.repoList) }}: - repository: ${{ repo.alias }} name: ${{ repo.name }} type: git stages: - stage: DoThing jobs: - ${{ each repo in convertToJson(variables.repoList) }}: - template: /templates/doThing.yaml parameters: repoName: ${{ repo.name }}
方案2:运行时脚本动态生成作业(适配复杂场景)
如果无法提前定义变量列表,可在初始化作业中通过Azure DevOps API获取当前流水线的仓库资源,再动态生成后续作业:
stages: - stage: GenerateJobs jobs: - job: FetchRepos steps: - script: | # 调用API获取当前流水线的仓库资源信息 repos=$(az pipelines run show --id $(System.DefinitionId) --query 'resources.repositories' -o json) # 将仓库信息写入环境变量,供后续阶段调用 echo "repoList=$repos" >> $GITHUB_ENV env: AZURE_DEVOPS_EXT_PAT: $(System.AccessToken) - stage: DoThing dependsOn: GenerateJobs jobs: - ${{ each repo in convertToJson(stageDependencies.GenerateJobs.FetchRepos.outputs['repoList']) }}: - template: /templates/doThing.yaml parameters: repoName: ${{ repo.name }}
注意:此方案需要启用Azure DevOps CLI,且流水线需具备调用API的权限。
另外需要明确:运行时表达式($[ ... ])虽能访问resources.repositories,但不支持遍历语法,仅能用于单个仓库的属性获取,无法直接循环生成作业。
内容的提问来源于stack exchange,提问作者dropsoid

