Azure Pipelines模板传递问题:跨仓库文件引用路径错误
我有一个位于repoA中的azure-pipeline.yml文件,它扩展引用了另一个仓库demo中的build-and-deploy.yml模板,该模板又引用了同仓库内的0.yml、1.yml和2.yml三个模板文件。
问题在于,azure-pipeline.yml将pipeline/build.yml等文件中定义的构建任务列表作为参数传递给build-and-deploy.yml,后者会根据条件将该参数传递给0.yml、1.yml或2.yml中的一个。但目前0/1/2.yml会在自身所在的demo仓库中查找pipeline/build.yml,而非源仓库repoA。
我知道可以在build-and-deploy.yml中签出repoA,但demo仓库还被repoB、repoC等其他仓库使用,因此无法在此硬编码repoA的信息。请问有什么解决建议?
相关代码
azure-pipeline.yml
... parameters: - name: allowDevDeployment displayName: "Allow this build to be deployed to DEV" type: boolean default: false - name: selectDeploymentType displayName: Select deployment type type: string default: 0 values: - 0 # (Standard/regular deployment) - 1 #(Single branch; master deploys to DEV -> DEVTEST -> STAGE -> PROD) - 2 # (develop to DEV -> Auto PR to master -> DEVTEST -> STAGE -> PROD) extends: template: templates/build-and-deploy.yml@demo parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} deploymentType: ${{ parameters.selectDeploymentType}} helmVersion: 3.12.3 buildJobs: - template: pipeline/build.yml - template: pipeline/static-scans.yml
build-and-deploy.yml
parameters: ... - name: deploymentType type: string default: none stages: - ${{ if eq(parameters.deploymentType, 0)}}: - template: deploymentTypes/0.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} ... - ${{ if eq(parameters.deploymentType, 1)}}: - template: deploymentTypes/1.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} ... - ${{ if eq(parameters.deploymentType, 2)}}: - template: deploymentTypes/2.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} ...
0.yml
... - name: allowDevDeployment type: boolean default: false 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 }} ... # Develop, Nightly or Support Branch - ${{ if or(in(variables['Build.SourceBranchName'], 'develop', 'nightly'), contains(variables['Build.SourceBranch'], '/support/'), eq(parameters.allowDevDeployment, true)) }}: - ${{ if gt(length(parameters.devJobs), 0) }}: - stage: Dev ... # Develop or Support Branch - ${{ if or(eq(variables['Build.SourceBranchName'], 'develop'), contains(variables['Build.SourceBranch'], '/support/')) }}: - ${{ if gt(length(parameters.devTestJobs), 0) }}: - stage: DevTest ${{ if ne(parameters.devTestStageLabel, 'none') }}: displayName: ${{ parameters.devTestStageLabel }} ...
解决建议
1. 传递源仓库别名作为参数
在azure-pipeline.yml中,将当前仓库的默认别名self明确添加到模板引用中,再把这个别名传递给demo仓库的模板,确保任务加载时指向源仓库:
修改azure-pipeline.yml的参数传递:
extends: template: templates/build-and-deploy.yml@demo parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} deploymentType: ${{ parameters.selectDeploymentType}} helmVersion: 3.12.3 sourceRepoAlias: 'self' buildJobs: - template: pipeline/build.yml@self - template: pipeline/static-scans.yml@self
在build-and-deploy.yml中新增参数并传递给子模板:
parameters: ... - name: deploymentType type: string default: none - name: sourceRepoAlias type: string default: 'self' stages: - ${{ if eq(parameters.deploymentType, 0)}}: - template: deploymentTypes/0.yml parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} sourceRepoAlias: ${{ parameters.sourceRepoAlias }} ... # 同理修改1.yml、2.yml的参数传递逻辑
2. 预渲染构建任务(推荐)
在azure-pipeline.yml中直接解析本地模板为任务结构,再传递给demo仓库的模板,避免跨仓库的路径查找问题:
修改azure-pipeline.yml:
extends: template: templates/build-and-deploy.yml@demo parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} deploymentType: ${{ parameters.selectDeploymentType}} helmVersion: 3.12.3 buildJobs: - ${{ template 'pipeline/build.yml' }} - ${{ template 'pipeline/static-scans.yml' }}
这样传递给demo模板的是已经解析完成的任务结构,而非模板路径,从根源上避免了路径查找错误。
3. 动态配置仓库资源
在demo仓库的模板中,通过参数接收源仓库的名称和分支,动态添加仓库资源,确保任务执行时能访问到源仓库文件:
在build-and-deploy.yml中新增参数并配置仓库资源:
parameters: ... - name: sourceRepoName type: string - name: sourceRepoRef type: string default: '${{ variables.Build.SourceBranch }}' resources: repositories: - repository: sourceRepo type: git name: ${{ parameters.sourceRepoName }} ref: ${{ parameters.sourceRepoRef }} stages: # 子模板中使用@sourceRepo引用源仓库文件
在azure-pipeline.yml中传递自身仓库信息:
extends: template: templates/build-and-deploy.yml@demo parameters: allowDevDeployment: ${{ parameters.allowDevDeployment }} deploymentType: ${{ parameters.selectDeploymentType}} helmVersion: 3.12.3 sourceRepoName: 'repoA' sourceRepoRef: '${{ variables.Build.SourceBranch }}' buildJobs: - template: pipeline/build.yml@sourceRepo - template: pipeline/static-scans.yml@sourceRepo
这种方式无需硬编码,每个使用demo模板的仓库只需传递自身的仓库名称即可适配。
内容的提问来源于stack exchange,提问作者Anonymous Person

