Azure Pipeline跨仓传递模板报错:SequenceToken类型不符合预期
问题场景
在repoA的azure-pipeline.yml中,通过extends调用repoB仓库的build-and-deploy.yml阶段模板,传入buildJobs参数(包含两个本地模板路径:pipeline/build.yml和pipeline/static-scans.yml)。repoB的build-and-deploy.yml会根据流水线运行参数选择调用0.yml或1.yml阶段模板,但参数传递时触发解析错误,无法正常运行。
repoA 中的 azure-pipeline.yml
extends: template: templates/build-and-deploy.yml@repoB parameters: buildJobs: - template: pipeline/build.yml - template: pipeline/static-scans.yml
repoB 中的 build-and-deploy.yml(原错误写法)
stages: - ${{ if eq(parameters.trunkFlow, true) }}: - template: deployment-types/0.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} buildJobs: - template: ${{ parameters.buildJobs }} # 此处无法正常工作 devJobs: - template: ${{ parameters.devJobs }} # 此处无法正常工作 parameters: environment: Dev location: WestUS ... - ${{ else }}: - template: deployment-types/0.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} serviceEmail: $(platformAdoGroup) buildJobs: - template: ${{ parameters.buildJobs }} # 此处无法正常工作 devJobs: - template: ${{ parameters.devJobs }} # 此处无法正常工作 parameters: environment: Dev location: WestUS ...
repoB 中的 0.yml(子模板)
stages: - ${{ if gt(length(parameters.buildJobs), 0) }}: - stage: Build jobs: - ${{ each job in parameters.buildJobs }}: - ${{ if startsWith(job.pool.vmImage, 'ubuntu') }}: - job: ${{ job.job }} pool: ${{ job.pool }} ${{ if job.condition }}: condition: ${{ job.condition }} ${{ if job.dependsOn }}: ... - ${{ if or(eq(variables['Build.SourceBranchName'], 'develop'), contains(variables['Build.SourceBranch'], '/support/'), contains(variables['Build.SourceBranch'], '/feature/')) }}: - ${{ if gt(length(parameters.devTestJobs), 0) }}: - stage: DevTest ${{ if ne(parameters.devTestStageLabel, 'none') }}: displayName: ${{ parameters.devTestStageLabel }} jobs: - ${{ parameters.devTestJobs }} - ${{ if ne(parameters.acunetixWebsite, 'none') }}: - stage: AcunetixOnDevTest dependsOn: ${{ parameters.acunetixDependsOn }} jobs: - template: ../scanning/acunetix.yml ...
报错信息
/templates/build-and-deploy.yml@repoB: 读取“模板引用路径”时遇到意外类型“SequenceToken”,预期类型为“LiteralToken”。
原因分析
错误出在build-and-deploy.yml的参数传递逻辑:当前写法试图把整个parameters.buildJobs数组作为单个template的路径值传递,但template字段要求的是单个字符串路径,而非数组。实际上子模板0.yml/1.yml本身就是接收数组参数并遍历处理,不需要额外套- template:语法。
修复方案
修改repoB中build-and-deploy.yml的参数传递方式,直接将buildJobs和devJobs数组原样传递给子模板,去掉多余的- template:包裹:
stages: - ${{ if eq(parameters.trunkFlow, true) }}: - template: deployment-types/0.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} buildJobs: ${{ parameters.buildJobs }} # 直接传递数组 devJobs: ${{ parameters.devJobs }} # 直接传递数组 parameters: environment: Dev location: WestUS ... - ${{ else }}: - template: deployment-types/0.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} serviceEmail: $(platformAdoGroup) buildJobs: ${{ parameters.buildJobs }} # 直接传递数组 devJobs: ${{ parameters.devJobs }} # 直接传递数组 parameters: environment: Dev location: WestUS ...
这样修改后,子模板0.yml就能接收到完整的模板数组,通过${{ each job in parameters.buildJobs }}正常遍历处理每个模板项,解决解析错误。
内容的提问来源于stack exchange,提问作者Anonymous Person

